本帖最后由 小飞鸟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进行复位。同时,主机需要判断从机数据准确性,如果有容错率的系统,该方法可以解决从站错位问题。
|