经常遇到一些朋友,在设计SPI主机和从机的逻辑互联时,会习惯性地仿照UART上的TXD和RXD交叉连接,而将SPI主机的MISO和从机的MOSI进行逻辑连接,SPI主机的MOSI和从机的MISO进行逻辑连接,结果导致设计错误。这里给大家提供一个不再出错而记忆简单的方法--- 理解MISO和MISO缩写的具体含义。
MISO和MOSI的含义以及为何主机从机不能交叉接
信号 MISO = Mast In Slave Out,即 在主机这边是输入,在从机那边是输出。
信号 MOSI = Mast Out Slave In,即 在主机这边是输出,在从机那边是输入。
根据输入接输出,输出接输入的原理,所以,就应该是
SPI主机的 MISO,直接 接 SPI从机的MISO,因为前者是输入,后者是输出。
SPI主机的 MOSI,直接 接 SPI从机的MOSI,因为前者是输出,后者是输入。
也就是,主机的MISO需要接从机的MISO,主机的MOSI需要接从机的MOSI,不能交叉接。
那SI和SO呢?
说到这里,可能有些朋友会说:“不对!我记得之前在TI或FreeScale的某个单片机上,主机的SO接的是MOSI,而不是MISO。“ 这是怎么回事呢?
这里,就需要理解一下,在FreeScale、NXP等某些单片机或SPI FLASH上,经常会看到 SI 和 SO 这样缩写,这里遵循的确实另外一个缩写含义:
SO = Serial Out 串行输出
SI = Serial In 串行输入
这里的S,不是MOSI里的Slave从机的意思,而是Serial串行的意思。所以,单纯看SO或SI,是无法判断对应的是MISO还是MOSI,需要根据这个设备,是SPI主机还是SPI从机,做进一步的分析判断。
比如,假设一个设备是SPI主机,如果其SPI接口管脚标注为SO(串行输出),因为是主机上的,所以就是主机输出,对应的意思就是Master Out,也就是Master Out Slave In,也就是 SPI接口的MOSI,所以就需要去另外一边的SPI设备的MOSI。
这样理解,是不是就好记住,不再犯错了?
总之,如果数据手册上信号标注的是MISO或MOSI,这里的S对应的是Slave。要注意不要交叉接。而如果数据手册上标注的信号名称是SI和SO,这里的S表示的是Serial,要根据是主机还是从机,决定对应的是MISO还是MOSI。
另外,有少部分单片机主机,可以通过管脚配置,自由选择SPI管脚所映射的管脚PAD,或者对MISO和MOSI管脚进行管脚交换映射。所以,当设计SPI接错线时,不要着急,先检查一下,这款单片机是否可以进行管脚配置的互换。如果可以,那么恭喜你,你只需要在单片机的配置寄存器里,进行一下互换映射就可以了而不必重新改板。但是遗憾的是,大多数单片机的管脚,都是不可以配置互换的。因此,在进行硬件设计时,千万不要犯迷糊弄错了。始终记住,SPI接线的MISO和MOSI信号不用交叉接!