之前用STM32的SPI需要控制很多外部芯片,可是一个SPI的外设只有一个片选,要实现独立片选一主多从,怎么实现呢?
SPI总线拓扑
一般地,SPI总线按照下图方式进行连接,一主多从。
如上图:
每个从设备都有独立的片选引脚,主机同一时间段内,与一个从设备进行通信,也即选中一个从设备。
MOSI/MISO/SCLK并联在一起
MISO须是三态门,当从设备未选中时,该脚须设置为高阻态,而不能是输出态,否则会影响总线!
对于MOSI/SCLK,虽然并联在一起,但是由于仅一个输出,多输入。
但是你看STM32的SPI外设,一个SPI仅有一个NSS信号,以STM32F407的SPI2为例:
那么要实现前面说的一主多从,怎么办呢?有朋友说,直接用GPIO去模拟不就可以了。
不错,SPI总线要用GPIO模拟还是很容易的,但是这样做波特率做不高,需要占用CPU时间,效率比较低!而用SPI外设控制器,底层bit流的收发由外设控制器实现,用GPIO模拟则需要CPU参与。
怎么破呢?
菊花链拓扑
这种方案,省引脚。但是要移位控制,相对独立片选效率还是低不少。
独立片选拓扑
SPI外设的MOSI、MISO、SCK还是照用不误,但是片选我们不用,设置成通用输出模式,再用其他的GPIO片选从芯片即可。
上代码看看:
初始化SPI外设
从而原来SPI的收发函数前后加上片选信号即可:
如此一来,一个SPI外设就可以控制多个从芯片了。你如果有兴趣,不妨照这个思路试试看。