3439|2

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

lpc1700 uart通信中出现的问题,求助 [复制链接]

#include"uart.h"

static   uint8  UART0_Rec_Buffer[UART0_LEN];
volatile static uint8 UART0_Rec_pWrite = 0;
volatile static uint8 UART0_Rec_pRead = 0;

static   uint8  UART0_Send_Buffer[UART0_LEN];             
volatile static uint8 UART0_Send_Num = 0;
volatile static uint8 UART0_Send_pRead = 0;
volatile static uint8 UART0_Send_pWrite = 0;


void UART0_Init(void)
{
   uint16 temp;          
   U0LCR |= 0X80;
   temp = 11059200/(8*9600);
   U0DLL = temp &0xff;
   U0DLM = temp >> 8;
   U0LCR = 0x1B;     //0001 1011
   U0IER = 0x03;
   //U0FCR = 0X80          A(本想先置为触发,然后开中断,然后使能uart0,中断进入错误)
   NVIC_EnableIRQ(UART0_IRQn);
   //U0FCR = 0X80          B(调整到开中断后设置触发,使能UART0,中断进入错误)
   //U0FCR |= 0X01;   
   U0FCR = 0x87;           一次性写入触发和使能中断,正确的进入中断
   
  
}

uint8 UART0_Send(uint8* pData,uint8 num)
{
         uint8 i=0;
     if(pData == NULL || num == 0)
            return 0;
         while(UART0_Send_Num0)
         {
                  UART0_Send_Buffer[UART0_Send_pWrite++] = *pData++;
                 if(UART0_Send_pWrite >= UART0_LEN)
                 {
                         UART0_Send_pWrite = 0;
                 }
                 UART0_Send_Num++;
                 num--;
                 i++;         
         }
         if((U0LSR & 0X20)&&UART0_Send_Num>0)
         {             
                 U0THR = UART0_Send_Buffer[UART0_Send_pRead++];
                if(UART0_Send_pRead >= UART0_LEN)
                {
                        UART0_Send_pRead = 0;
                }
                UART0_Send_Num--;         
         }
         return i;          
}
uint8 UART0_Read(uint8* pData,uint8 num,uint8 offset)
{
   return 0;
}

uint8 UART0_Copy(uint8* pData,uint8 num)
{
   uint8 i = 0;
   if(pData == NULL || num == 0 || UART0_Rec_pWrite == UART0_Rec_pRead)
       return 0;
    for(;num>0;num--)
        {
           *pData++ = UART0_Rec_Buffer[UART0_Rec_pRead++];
           if(UART0_Rec_pRead >= UART0_LEN)
           {
                     UART0_Rec_pRead = 0;
           }
           i++;       
           if(UART0_Rec_pRead == UART0_Rec_pWrite)
              break;
        }
        return i;
}

void UART0_IRQHandler(void)
{
   uint8 list = (U0IIR & 0X0F)>>1;
   uint8 i;
   switch(list)
   {
            case 0x02:
         {
                 for(i=0;i<8;i++)
                {
                   UART0_Rec_Buffer[UART0_Rec_pWrite++] = U0RBR;
                   if(UART0_Rec_pWrite >= UART0_LEN)
                   {
                             UART0_Rec_pWrite = 0;
                   }
                }
         
         }break;
         case 0x06:
         {
                 while(U0LSR &0X01)
                {
                   UART0_Rec_Buffer[UART0_Rec_pWrite++] = U0RBR;
                   if(UART0_Rec_pWrite >= UART0_LEN)
                   {
                             UART0_Rec_pWrite = 0;
                   }
                }
         
         }break;
         case 0x01:
         {
                if(UART0_Send_Num == 0)
                    break;
            for(i=0;i<16;i++)
                {
                   U0THR = UART0_Send_Buffer[UART0_Send_pRead++];
                   if(UART0_Send_pRead >= UART0_LEN)
                   {
                             UART0_Send_pRead = 0;
                   }
                   UART0_Send_Num--;
                   if(UART0_Send_Num == 0)
                    break;               
                }
          

         }break;
         default:break;          
   }
}

中断错误的主要现象是进入RDA和CTI错误,无论发送几个字节数据,总是进入RDA中断;
这是为什么啊?哪位高手给指点下,分两次操作UOFCR为何会错误,我也只是在不经意间发现的这个问题
此帖出自ARM技术论坛

最新回复

问题解决了就好  详情 回复 发表于 2012-3-27 09:12
点赞 关注
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

回复 楼主 lqm880219 的帖子

没人回答,我好象已经知道答案了
此帖出自ARM技术论坛
 
 
 

回复

2万

帖子

71

TA的资源

管理员

板凳
 

回复 沙发 lqm880219 的帖子

问题解决了就好
此帖出自ARM技术论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表