打印
[应用方案]

SPI从机收发数据的潜在风险及解决办法

[复制链接]
54|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小飞鸟f 于 2024-12-4 19:48 编辑

1、前言
  对于MCU来说,大部分应用采用SPI主机功能,也存在一些场景需要用到SPI从机。比如系统中存在一个主芯片,MCU作为从芯片,主芯片与MCU通过SPI进行通信。在“[APM32F0]
  APM32F003也能用于编码器?从应用角度分析适用于哪些方案”文章中的多圈系统方案中,APM32F003就是用到SPI从机功能。对于大部分MCU来说,SPI从机应用都会隐藏一个细节,如果不注意,将会导致通信一直失败。
2、SPI从机机制
  SPI从机是检测主机时钟信号来收发数据,基本特性如下:
  被动响应:SPI从机不会主动发起通信,它只会在被主设备选中(通过拉低其CS/SS线)后才参与数据传输。
  时钟同步:从机使用主设备提供的时钟信号(SCK)来同步数据的发送和接收。这意味着从机不需要自己的时钟源来维持通信。
  数据传输:SPI支持全双工通信,意味着数据可以在同一时间双向传输。从机可以在接收到主设备的数据的同时向主设备发送数据。
  配置模式:SPI有四种不同的工作模式(Mode 0到Mode 3),这些模式定义了时钟极性(CPOL)与时钟相位(CPHA)。从机必须配置为与主设备相同的模式才能正确地进行数据传输。
  多从机配置:当存在多个从机时,通常有两种连接方式:
  独立片选线:每个从机都有自己独立的CS/SS线,主设备可以通过拉低相应的CS/SS线来选择特定的从机。
  菊花链(Daisy Chain):所有从机共享同一个MOSI、MISO和SCK线,数据在一个从机到下一个从机之间串联传递。这种方式下,主设备通过发送特定的命令或地址来选择目标从机。
  硬件要求:从机需要具备SPI接口,包括SDO(Serial Data Out,串行数据输出)、SDI(Serial Data In,串行数据输入)、SCK(Serial Clock,串行时钟)和CS/SS(Chip Select/Slave Select,片选/从选)引脚。
  软件实现:除了硬件支持外,从机还需要相应的软件或固件来处理SPI通信协议,包括初始化设置、读写操作以及错误处理等。
3、SPI从机隐藏风险
  根据上述内容,SPI从机何时收发数据由SPI主机的时钟决定。SPI主机在每个周期输出的时钟数是8的倍数。如果SPI主机的时钟在某一个周期传输过程中被干扰了,从机识别到SPI主机时钟数与实际时钟数少一个或多一个,在下一个周期开始时,SPI从机时钟数是否可以从0开始。
  这里以SPI数据帧长度8位、LSB模式、CPHA=0、CPOL=1为例,从机发送0x84数据。如下图所示,当SPI从机在某个周期只识别到主机发送了7个时钟,从机只发送了7位数据D7:D1。当下一个周期到来时,该周期的第1个时钟,SPI从机会认为是上一个周期的第8个时钟,发送数据最低位D0;然后,在该周期的第2个时钟,SPI从机认为是新周期的第1个时钟,发送数据最高位D7,所以该周期从机发送数据0x42。如果没有纠正,以后的通信周期,SPI从机都发送数据0x42,数据传输错误。
4、SPI从机隐藏风险的解决办法
  根据上面描述,当SPI从机在某个周期识别到的时钟为7个时,以后每个周期的数据都会出错,无法自动恢复。如果借助CS使能信号是否可以解决该问题?答案是“否”。
  为了解决上述问题,目前只有通过CS信号或者定时器超时来判断当前通信周期是否结束。如果当前周期结束,则重新复位SPI模块,复位后在重新初始化,下一个通信周期能恢复正常。由于SPI从机当前时钟数清零机制,所以,只能对SPI进行复位。同时,主机需要判断从机数据准确性,如果有容错率的系统,该方法可以解决从站错位问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

14

帖子

0

粉丝