UART一般怎么使用?(422、485协议芯片)

[复制链接]
查看11 | 回复0 | 2007-5-17 16:25:07 | 显示全部楼层 |阅读模式
现像:开了接收中断,然后不断进入中断,而且P_UART_Command2寄存器读取值为0x00f1,而 P_UART_Data 值为0x0000。 分析:如果出现这样的情况,首先确定问题的所在,另外一端的UART发送是否存在问题,UART传输通道是否正常?等……如除SPCE061A外的器件、外围都正常,则检查一下MCU的IO口设置状态,一般会由于IOB7与IOB10设置有误才导至问题的出现的;解决:所以剩下的工作就是好好检查一下程序里面除了初始化程序外,是不是还有地方修改了IO的属性了?现像:开或者没有开串行口发送使能时,对IOB口(特别是IOB10)进行输出操作时,在PC端的接收程序中(串口测试程序)都可以收到一些串口数据,且多为0x00。 分析:这些问题与MCU无关,因为232的电平转换芯片没有使能端,所以,对IOB10口进行输出操作时,特别是有高低电平的交叉输出时,也会把信号送到232的电平转换芯片中去,这样就送到了PC端的串行口,所以有时就会在PC端那边的串行口会接收到数据;解决:所以当在用户的系统中会存在使用了UART也使用到IOB10口用作他用时,可以建议用户选用带使能的232电平转换芯片,或者通讯时采用数据包格式,同时作数据包的软校验处理。现像:打开UART IRQ中断后,程序会不断进入UART IRQ中断。 分析:……解决: 关于UART的IRQ使用方式,有以下几点需要注意: 1,一般我会建议在用UART IRQ中断时,初始化P_UART_Command1时只打开接收中断,而不打开发送中断;从教程或者DataSheet中可以得知,发送中断是由TxRDY信号触发的,而TxRDY信号的意义为:该标志位被置为“1”,表示发送器的数据缓存器为空,已准备好可以发送写入P_UART_Data单元的数据。问题就在这个解释里了,很多人没有注意到这个问题;串行口只要在闲置时,P_UART_Data寄存器里面是空的,肯定是随时准备好可以发送数据了,这时候TxRDY标志位应该为1的,也就会随时触发Tx IRQ中断(Tx中断打开时);所以就会出现打开串行发送、接收中断后,程序会不断地进UART IRQ中断里面去的现像了。所以建议在初始化串行口时,只打开Rx中断,而不打开Tx中断,当发送数据(需要用到Tx中断的话)后,再打开Tx中断,等全部数据发送完后,再关掉Tx中断,就不会出现这样的问题了。另外,这样的情况其实并不算是问题,本身MCU要发送数据就是可控的嘛!只要程序设计时考虑多一点就可以避免这样的麻烦了。 2,另外一点也是很重要的,关于Rx中断,其实很多人在做实验的时候关没有注意到,在避免第一种情况后,还是会出现不断进入UART IRQ中断的现像;这跟UART的寄存器设置没有太多关系,试一下,当有这样的现像时,把UART的Tx、Rx的管脚连上(当然前提是保证IO的设置是没有问题的),应该不会再有不断进入UART IRQ中断的现像。这个例子说明,在用UART IRQ中断时,要保证UART的通道有正确的连接,即IOB7、IOB10脚连到了UART的通讯通道上了(双机通讯连接也行、MCU和PC通讯连接也行,只要保证UART通讯管脚有效地连接上了且连对了),就可以避免这样的问题。 3,一般对UART IRQ应用的设置,我会如此建议:先设置好IOB的相应的端口,IOB7输出、IOB10输入——》设置正确的串行波特率——》打开Rx中断,而不打开Tx中断(原因前面已有述)——》使能发送、接收管脚——》读一次P_UART_Data,以清除之前的UART状态及错误——》再下面是用户自的程序了……。当然在用户的UART联IRQ中断里面要记得进中断后清中断标志了(读写P_UART_Data寄存器即可清除)。 PS: unsigned int b;
*P_IOB_Attrib |= 0x0480;
*P_IOB_Dir |= 0x0400; *P_IOB_Data = 0x0000;
*P_UART_BaudScalarLow = 0x0000; *P_UART_BaudScalarHigh = 0x0005;
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行