深究MAX3485收发转化时需加延时的根本原因
最近初次使用MAX3485芯片进行通讯时,遇到数据不能正常接收的情况,后来经过长时间的分析知道了是我在进行切换收发模式时,软件没有进行延时处理(也可以通过硬件延时)。
RS485_SEND_ON; //485开启发送功能
Uart1Write(Tilt_buff, send_len);//写数据
delay_ms(1); //延时函数,
RS485_REC_ON; //485开启接收功能
- 1
- 2
- 3
- 4
在上面的485发收模式切换的程序中,若未加延时函数delay_ms(1),将不能接收数据。那为什么要加延时函数呢?现在让我们从其根源深究吧!!!
其实根本原因不在MAX3485芯片,而是在主控单片机芯片上,要想明白其原因,我们首先得知道单片机的串口收发的工作原理。在这里我们以TI公司的MSP430F5XX单片机分析其串口数据收发详细过程及原理。
1.上图为MSP430F5XXUART模式下串行数据接收逻辑框图,在此对我们有用的部分进行简化,简化图如下:
接收数据可简化为以下三步(与上简化图一一对应):
①将要发送的数据写入发送缓冲寄存器
②发送缓冲寄存器将数据一位一位地移入发送移位寄存器,注意!若全部移入,即此时发送缓冲寄存器没有数据,全部进入发送移位寄存器,这个时候将由硬件产生发送中断标志位UCTXIFG,表明此时发送缓冲寄存器为空,可以接收另一个数据。
③移位寄存器将数据一位一位地发送到我们要接收数据的接口处,需要一定的时间T,而这个时间T正是我们要延时的时间delay(T)。
简单地了解串口发送数据的过程后,我们再进一步分析MAX3485发送接收模式切换需要延时的原因,在实际的通信过程中我们经常通过软件查询发送中断标志位UCTXIFG,(常用语句为while (!(UCA0IFG & UCTXIFG));如果UCTXIFG被置位则表示第二步②已经完成,也即是发送缓冲寄存器将数据全部移入发送移位寄存器,此时发送缓冲寄存器为空,可以接收另一个数据。)如果在查询中UCTXIFG被置位则跳出循环,若在此时MAX3485直接切换至接收模式如
RS485_SEND_ON; //485开启发送功能
*************************;//写数据
while (!(IFG2 & UTXIFG1));//查询发送中断标志位UCTXIFG
RS485_REC_ON; //查询后485立马开启接收功能
- 1
- 2
- 3
- 4
不加延时函数直接切换至接收模式意味着没有预留步骤 ③的时间,即移位寄存器将数据一位一位地发送到我们要接收数据的接口处要耗费一定的时间T,若不预留给此时T,移位寄存器还未将数据发出,此时若直接切换至接收模式,将导致数据会丢失。因为MAX3485是半双工的,不能同时进行接收和发送两种操作。因此我们需要进行延时处理,程序模板如下:
RS485_SEND_ON; //485开启发送功能
**********************;//写数据
while (!(IFG2 & UTXIFG1));//查询发送中断标志位UCTXIFG
**delay(T);//延时时间为T**
RS485_REC_ON; //查询后485立马开启接收功能
- 1
- 2
- 3
- 4
- 5
- 6
延时时间T与波特率有关,比如通讯时常将波特率设置为9600bps,即每秒发送9600bit(即每秒9600个二进制),因此移位寄存器将8位2进制一位一位发送出去所需的时间T=(1/9600)*8=0.83ms,(通常调用 delay_ms(1); 延时1ms)。