UART模拟串口
什么是UART
UART — Universal asynchronous receiver/
transmitter,通用异步数据接收/发送器。
UART典型使用三根线,TX,RX,GND,此处不涉及到RTS,CTS。NRF52芯片只有一个物理串口,如果需要NRF52芯片同时连接两个以上的串口外设就需要模拟更多的串口出来。
模拟串口方法
纯软件模拟
通常可以采用GPIO中断和定时判断高低电平这类纯软件的方式去模拟接收,使用延时控制IO口高低电平的方式去模拟发送,这种方法的缺点很明显,那就是在BLE功能开启的情况下,GPIO和定时器中断都会被延迟,从而导致无法正确接收和发送数据位。即使在无BLE开启的情况下,由于CPU处理中断的延时也会导致正常传输数据的波特率不会太高。
硬件+软件的模拟方法
本文着重讲一种纯硬件方式去模拟串口的方法,模拟发送数据使用NRF52的PWM+DMA的方式,高位1的点空比为0,低为0的点空比为每位的总时长;模拟接收数据采用NRF52的GPIOTE+PPI+SAADC+DMA的方式,当接收到数据流的起始位时GPIOTE中断会触发ADC开始按每位时长进行采样,采样值超过门限值为1,反之为0,DMA将ADC的每位采样值存储到指定内存空间,当采集完成后,CPU参与解析接收到的每位采样值。
接收数据有三个比较麻烦的地方,一是需要额外增加一个IO口扮演RX的角色,这个IO主要用作判断数据流的起始位,在数据接收过程中,禁止此IO中断,数据接收完成后才重新打开中断监听新的数据流;二是ADC停止采样后,不能在ADC中断中立即设置新的接收BUFFER,需要等ADC完全停止后才能重新设置,否则ADC无法停止采样;三是采样到的数据解析,由于串口每位的时间无法和时钟的TICK完全整除,所以我们采样的时间点一定会有误差,我们做不到精确的在每一位进行一次采样,可以通过变通的方法,每次采样的时间是每位时长的一半多2-5个TICK,那么可以保证每位最多两次采样且至少会有一次采样,解析时如果发现缺少一个相同的采样位,并且与下一个采样位值不同,我们认为此次采样为一个有效的位。