天嵌 ARM开发社区

 找回密码
 注册
查看: 3211|回复: 0

各位大师帮忙看一下,串口通信的问题!!先谢了

[复制链接]
6724243 发表于 2013-2-4 18:29:25 | 显示全部楼层 |阅读模式
本人开发板是4.3尺寸TQ2440,我想将天嵌光盘天嵌配套光盘\TQ2440_CD\uCOS-II\uCOS-II_20091031文件下的代码改用串口中断接收数据,然后再用串口发送出去,与此同时,屏蔽了所有通过OSPrintf()发送到串口的语句,如://OSPrintf("\nEnter Main Task\n"); 现在只想从串口调试工具发送一帧数据,然后再从串口调试工具接收“发送出去的数据”。
/*串口初始化函数*/
void init_uart0(void)
{
    rGPHCON |= 0xaaa0;
    rGPHUP |= 0xfff; //注意1普通中断模式一定要设成上拉模式

    //rINTSUBMSK |= (0x01<<0 | 0x01<<1 | 0x01<<2);//默认屏蔽任何中断源
    //rINTMSK |= (0x01<<28);

    rINTMSK &= ~(0x01 <<28);//写入0取消串口0中断屏蔽
    rINTSUBMSK &= ~(0x01 << 0 | 0x01 << 1 | 0x01 << 2);//写入0取消串口0各个子中断屏蔽

    rSUBSRCPND |= (0x01<<0 | 0x01<<1 | 0x01<<2);//触发串口0中断
    rSRCPND |= (0x01 <<28);

    rINTPND |= (0x01 <<28);//让CPU处理串口0中断
    rINTMOD |= (0x01 <<28);//串口0中断源按FIQ模式处理

    pISR_UART0 =(unsigned)Uart0_irq;//串口0中断入口地址
    //串口0线路控制寄存器
    rULCON0 = 0x03;//UART Line Control Register 不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
   //串口0通道控制寄存器
   //rUCON0 = (0x01<<9 | 0x01<<6 | 0x01<<2 | 0x01<<0);//0x245
   //rUCON0 = 0x385;//可以超时中断,发送中断方式、接收中断方式皆为电平触发
   rUCON0 = (0x01<<9 | 0x01<<7 | 0x01<<6 | 0x01<<2 | 0x01<<0);//0x2C5,可以超时中断,发送中断方式为电平触发,接收中断方式为脉冲触发

    //FIFO模式下,如果收到数据的个数达到Rx FIFO的触发点,且在寄存器UCONn中的接收模式被设置成“1”(中断或者轮巡模式),将会产生一个Rx中断
    //rUFCON0 = (0x01<<6 | 0x01<<5 | 0x01<<2 | 0x01<<1 | 0x01<<0);//发送、接收各为16Byte才触发中断进行发送、接收
  rUFCON0 = (0x01<<4 | 0x01<<2 | 0x01<<1 | 0x01<<0);//发送FIFO为空时触发中断、接收FIFO触发等级为8Byte时触发中断

    rUMCON0 = 0x00;
    rUBRDIV0 = (int)(50000000/(115200*16)-1);
}

/*串口0中断服务子程序*/
void Uart0_irq(void)
{
    U8 rdata = 0;
    static U8 datalen = 0;
    U8 *ptr;
    //rINTMSK &= ~(0x01 <<28);//写入0取消串口0中断屏蔽
    //rINTSUBMSK &= ~(0x01 << 0 | 0x01 << 1 | 0x01 << 2);//写入0取消串口0各个子中断屏蔽

    rINTPND |= (0x01 <<28);//让CPU处理串口0中断

    if(rSUBSRCPND & 0x01)       //是否触发串口0中断
    {
         ptr = Buff;
         //FIFO模式下
        if(rUFSTAT0 & 0x3f)      //接收FIFO计数
       {
           rdata = rURXH0;   
           //FIFO模式下
           while((rUFSTAT0 & (0x01<<14)));//发送FIFO标志 1表示发送FIFO满
           rUTXH0 = rdata;
           //ptr[count++] = rdata;
           //OSQPost(pUart_Q,Buff);
        }

    }

    //中断服务子程序处理完后清除下面寄存器
    rSUBSRCPND |= (0x01<<0 | 0x01<<1 | 0x01<<2);//写入1来清除子中断源暂存寄存器中串口0的各个子中断
    rSRCPND |= (0x01 <<28);//写入1来清除主中断源暂存寄存器的串口0中断
    rINTPND |= (0x01 <<28);//写入1来清除中断  CPU即将或已经在串口0对中断进行处理

}

问题:if(rSUBSRCPND & 0x01) 、if(rUFSTAT0 & 0x3f)//接收FIFO计数
这两个if() 判断总是进不去,查了好多资料但是我还是不太清楚这两个寄存器SUBSRCPND 、UFSTAT0如何才能满足if条件的要求?

疑问如下:
(1)SUBSRCPND 寄存器在初始化函数里已经设置如下:
rSUBSRCPND |= (0x01<<0 | 0x01<<1 | 0x01<<2);//触发串口0中断
rSRCPND |= (0x01 <<28);

按理说SUBSRCPND寄存器的判断应该满足条件才对啊!!!

(2)UFSTAT0寄存器的RX FIFO Count会自动统计RX FIFO数据长度吗???

rUFCON0 = (0x01<<4 | 0x01<<2 | 0x01<<1 | 0x01<<0);//发送FIFO为空时触发中断、接收FIFO触发等级为8Byte时触发中断
RX FIFO Full的Full概念有点模糊,是达到我设置的8字节触发等级就自动为Full还是怎么回事?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-9 08:27 , Processed in 1.062500 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表