EC_M031_SPI_TO_4_UART_V1.00.zip
(1.74 MB)
本范例代码主要演示 M031 实现 1 个 SPI 和 4 个 UART 之间进行数据交换。
范例里有两个工程。Master 文件夹下是主机程序,它通过 SPI 和从机通讯,设置 SPI 总线时钟为 16MHZ,定时给从机发送数据、检测到从机请求后读取和解析从机数据、记录并打印传输数据的长度。Slave 文件夹下是从机程序,它收到主机的 SPI 数据后,解析并通过 UART 发送给其他设备;收到其他设备的 UART 数据后,对数据进行编码并通知主机来读取数据。本文介绍了 SPI 速率和角色的设置、PDMA 基本操作模式和 Scatter-Gather 操作模式的配置、SPI+PDMA 的传输和传完判断。
主机和从机通过 SPI 通讯
帧头(1 字节)+ 帧长度(2 字节)+ 通道(1 字节)+ 数据(128 字节)+ CRC(1 字节) + 帧尾(1 字节)
从机和其他设备通过 UART 通讯,采用数据透传。当主机空闲时定时给从机发送数据,发送间隔受到从机接收 buffer 长度、数据解析和转发速度的影响。如果主机发送速度比从机转发速度快,会导致从机接收 buffer 溢出。本范例设置主机发送的间隔是 15 ms,那么主机 SPI 向 4 个 UART 都发送一帧(128 字节)数据需要 15*4=60 ms。从机 UART 以 115200 bps 波特率再将数据转发出去需要 128*4*10/115200=44 ms。因此从机转发速度比主机发送速度快,不会发生从机接收 buffer 溢出。当检查到从机请求后,读取从机 数据,读取的帧长度固定。主机的 SPI TX 和 RX 都使用 PDMA 基本操作模式搬运数据,完成搬运任务后 PDMA 会回到空闲状态,下一次搬运需要重新启动 PDMA。当从机收到主机(SPI)数据,解析后通过 UART 主动发送给其他设备。但当从机收到其他设备(UART)数据,不能主动发送给主机(SPI),需要通过 GPIO 通知主机,等待主机来读取。主机读数据的帧长度固定,如果从机数据不足,帧结尾会用 0 补齐。为了避免 UART 收到少量数据就触发一次 SPI 传输,从机每隔 2 ms 检查是否有数据需要发送给主机。从机的 SPI TX 和 RX也使用 PDMA 搬运数据。SPI TX 使用 PDMA 的基本操作模式,完成搬运任务后回到空闲状态;SPI RX 使用 PDMA 的 Scatter-Gather 操作模式,采用两张描述符表轮流将数据搬运到指定内存。作为从机,为了保证不丢失数据,需要设置较大的数据接收 buffer,收到的数据尽快发送给对应的设备。buffer 的大小跟接收速度、数据量以及转发速度都有关系。从机 SPI 需要接收主机发送给 4 个串口的数据,并且 SPI 传输速度比 UART 快,所以 SPI 的 buffer 需要比 UART的 buffer 大。
更多详情下载附件,内有源码工程可供使用
|