在线时间4063 小时
UID3441752
注册时间2017-11-21
NXP金币759412
TA的每日心情 | 开心 3 天前 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 31909
- 最后登录
- 2024-3-29
|
UART接口不够了?看看这篇就够了!
【方案】基于LPC802的SPI至UART接口扩展。随着电子系统的复杂度越来越高,越来越多的硬件设备通过各种接口如UART连接到微控制器。对于某些成本敏感型应用,有可能所选型的微控制器UART接口有限,面对众多的UART设备如蓝牙模块、WiFi模块、GSM模块和GPS模块等等,显得捉襟见肘。因此,UART接口扩展显得很有必要。
本篇小文来自客户对于UART的扩展需求,同时受恩智浦SPI/IIC扩展双UART芯片 - SC16IS752的启发,以基于LPC802的SPI扩展双UART为例,验证多UART扩展的可行性。希望本篇小文能够抛转引玉,激发大家对于多UART扩展的研究兴趣,设计出性能更加优秀的多UART接口扩展方案。
总体概述
本文以LPC802作为SPI从机,实现SPI扩展双UART的接口转换器。
为验证这个设计的可行性,本文采用如下应用场景: LPC804作为主控制器,同时也是SPI主机,通过命令操作接口转换器寄存器,实现与作为UART设备的LPC51U68的双向通信。
这个应用场景的系统构成如图1所示。
图1系统构成
寄存器
本文参考SC16IS752的设计思路,定义了一组寄存器以实现相关的功能。目前支持的寄存器如下表所示。
(提示:左右滑动查看完整表格)
IIR[5] | IIR[4] | IIR[3] | IIR[2] | IIR[1] | IIR[0] | 中断源 | 0 | 0 | 1 | 1 | 0 | 0 | 接收超时中断, | 产生于接收缓冲区数据数量小于由BCR[7:6]确定的阈值并且在100毫秒超时时间内没有接收到数据 | 0 | 0 | 0 | 1 | 0 | 0 | RHR中断, | 产生于接收缓冲区数据数量大于等于BCR[7:6]确定的阈值 | 0 | 0 | 0 | 0 | 1 | 0 | THR中断, 产生于发送缓冲区数据数量大于等于BCR[5:4]确定的阈值 |
传输类别
本文的传输可分为两大类:一类是对非0地址寄存器的操作,称为寄存器操作;一类是对0地址寄存器的操作,即THR和RHR寄存器操作,称为数据操作。按照传输方向,将从SPI主机经接口转换器到UART设备的传输称为下行传输或者写操作,将从UART设备经接口转换器到SPI主机的传输称为上行传输或者读操作。因此,按照上面的分类方式,传输就可以分为寄存器写、寄存器读、数据写和数据读四种方式。
操作时序
上面提到,传输可以分为寄存器操作和数据操作。这样划分源于非0地址寄存器和0地址寄存器在读写操作细节上存在差异。
对于写操作,对比图2和图4,区别是UART通道位CH1和CH0对于寄存器写操作是无意义的,因为寄存器值不会发给UART设备,而对于数据写操作,UART通道位CH1和CH0是至关重要的,因为需要指定数据发送给哪一个UART设备。
对于读操作,对比图3和图5,区别是接口转换器返回的第一个字节,如果是寄存器读操作,这个字节就是寄存器值,但是对于数据读操作,这个字节是信息字节,该字节表明从接收到的数据来自哪一个UART设备,从第二个字节开始才是真正的数据。
寄存器写、寄存器读、数据写和数据读的时序如图2至图5所示。无论是哪种操作,都需要首先发送一个命令字节,命令字节的格式如表5所示,之后才是一个或者多个数据字节。
图5 数据读
中断
本文支持三类中断,分别是THR中断、RHR中断和接收超时中断,具体可参考表3。这三个中断发生时,接口转换器的中断线IRQ产生负脉冲,并且根据中断源的类别设置IIR寄存器。当SPI主机检测到中断线IRQ的边沿之后通过读取接口转换器的IIR寄存器可以判断中断源类别,从而可根据中断源类别的不同进行后续的数据传输。
上行传输数据读流程
正如上文所述,上行传输包括寄存器读和数据读两种情形。寄存器读只需要SPI主机按照前面所述的时序进行操作即可,而数据读相对复杂,因而单独详细阐述。
前面讲过接口转换器共有两个接收中断,分别是RHR中断和接收超时中断。这两个中断描述清空接收缓冲区的两个条件,即当接收缓冲区数据数量等于接收触发阈值(由BCR[7:6]确定)时,RHR中断发生;当接收缓冲区数据数量少于接收触发阈值(由BCR[7:6]确定),而且超过预定的接收超时(100ms)没有从UART设备接收数据,接收超时中断发生。图6和图7分别对应这两种情况。当SPI主机检测到接口转换器中断线IRQ产生有效信号后,再读取RXLVL寄存器确定接收缓冲区的数据数量,之后再发起数据读操作从接口转换器接收缓冲区读取全部数据。
在进行数据读操作的时候,有一个要点值得注意。SPI是一种数据交换协议,也就是说无论SPI主机是进行读操作还是写操作,都需要SPI主机发送数据为SPI从机提供移位时钟。参考数据读时序,假如SPI主机需要从接口转换器读取N个字节的数据,那么应先发送1个命令字节,然后接口转换器返回一个信息字节表明接下来的数据是来自哪个UART设备,然后才是N个字节数据。这意味着,SPI主机要发送N+2个字节才能从接口转换器读取N个字节数据,这N+2个字节包括1个命令字节和N+1个任意数值字节,其中N+1个任意数值字节为接口转换器向SPI主机返回1个信息字节和N个数据字节提供移位时钟。
图6上行传输数据读 – RHR中断
图7上行传输数据读 – 接收超时中断
下行传输数据写流程
正如上文所述,下行传输包含寄存器写和数据写两种情形。寄存器写只要SPI主机按照前面所述的时序进行操作即可,而数据写相对复杂,因而单独详细阐述。
清空接口转换器发送缓冲区需要满足两个条件。第一个是发送缓冲区的数据数量等于
发送触发阈值(由BCR[5:4]确定)时,这时THR中断发生。第二个是发送缓冲区的数据数量小于发送触发阈值(由BCR[5:4]确定),并且超过预定的发送超时(100ms)没有从SPI主机接收数据,这时接口转换器不会产生任何中断,只是会将发送缓冲区的数据发送给指定的UART设备。图8和图9分别对应这两种情况。
图8 下行传输数据写 – THR中断
图9 下行传输数据写 – 数据量小于发送触发阈值
结果
参考最后结语中介绍的应用笔记,搭建好应用场景对应的软硬件环境,运行之后,可以在PC串口终端上观察到传输结果,如下图所示。
图10 上行传输(上) 下行传输(下)
在上行传输中,LPC51U68向LPC804发送两组数据,分别是0x00至0x3F和0x00至0x3E,分别对应清空接收数据缓冲区的两种情形 - RHR中断和接收超时中断。
在下行传输中,LPC804向LPC51U68同样发送两组数据,分别是0x00至0x3F和0x00至0x12,分别对应清空发送数据缓冲区的两种情形 – THR中断和数据量小于发送阈值。
通过对实际结果分析,LPC802接口转换器可以正确完成SPI至UART的扩展。
结论
本文以基于LPC802的SPI扩展双UART作为应用场景,验证多UART接口扩展的可行性。
文中给出了相关的设计思路,如寄存器、操作时序和上下行传输流程。
与本文配套的应用笔记(AN13066- LPC802-based SPI to USART Interface Conversion Bridge)和代码工程,描述了这个应用场景的细节,有兴趣的朋友可以查看。
能力所限,目前的设计思路还处于初级阶段,本文希望作为砖,能引出更优秀的玉。
|
|