本章目标,
1、学习SPI的通讯原理以及stm32spi外设
2、通过软件SPI和硬件SPI分别读写W25Q64芯片
暂时没有完结(8.30号只写了软件模拟spi测试,硬件还没写,测试完成之后会拿几款spi的芯片做测试,这周先把can写完,之后回更新硬件spi的)
一、原理部分
1、什么是SPI通讯
SPI通讯相对于IIC来说要更加的简单、因为IIC想用一根线解决的事情直接被SPI分出了三根线去解决,IIC只有一根数据线,要完成开始、停止、输入、输出、输出应答、输入应答这么多信号有些麻烦。
但是在SPI中变得相对简单,SPI主机发送数据有专门的MOSI引脚直接发送、接收有MISO接收、甚至设备号都不需要,大家学了IIC就知道通过IIC写数据我们得先发送其实信号,之后发送设备号,然后是指定地址、指定数据,这个发送设备号是需要我们发送完起始信号接着发一个字节数据来确定的(废话有点多,就当复习下IIC好吧),但是SPI不需要,他是每个从机都有一根信号线,我要用你我直接操作你的信号线(土豪哥玩法),然后发送接收数据都有单独的线,这个发送接收的时序和方式后面写到了再说。
然后这个协议是全双工,可以同时收发,但是只能说一主动从,从机的片选线必须连接到主机。
2 SPI硬件连接图
和IIC一样,这里还是以总线的方式连接的,除了SS这种每个从机一根的片选信号,然后输出的MOSI位推挽输出,输入的MISO为了防止两个设备同时相应造成短路,所以这里主机没有呼叫到的时候他们片选线都为高组态的状态(这时候引脚就相当于没有输出,防止有两个从机同时输出造成短路,因为SPI是可以推挽输出的这也就让传输的速率提高了很多,相比于IIC的几百k,SPI能到达几十兆甚至百兆,IIC由于是若上拉,所以信号从低跳到高还是有很大的延迟的)
3 数据交换示意图
SPI主机和从机的数据都来自与各自的移位寄存器,这里在时钟的上升沿或者下降会触发一次数据移位(这个上升或者下降触发是看你自己配置的模式后面会写模式)
在第一个时钟沿,会把最左边(高位)的数据放到数据发送寄存器上,然后左移,这时候会把MOSI和MISO置为为相同的电平,这是发送的过程。
在下一个时钟沿到来时,主机从机会读取数据,这个时候就把数据存放到刚刚的最低位就会形成这样,
然后进过八个时钟信号(8个完整的上升下降)最后两个移位寄存器的数据就交换了,这里发送的数据也到了从机,从机返回的数据也到了主机,虽然是实现了全双工是吧(但是我们大多数场景就是单读和单写,所以另外一边的寄存器大概率是随便填写一些数据能把对方的数据换过来就行的,直接造成了资源浪费,但是没关系- -快和方便嘛)
4 协议时序图
1、起始和停止
这个起始和停止对比IIC什么SCK和SDA相互配合来完成爽多了好吧,很简单的图,右边是SPI的,左边的IIC的,SPI我们只需要将相应从机的SS,拉低为起始,拉高为结束
2、 交换字节的时序
这个之前说过了,上升沿采集还是发送这个是可以配置的,记得从机不被呼叫他的发送线就得为高阻态哈,虽然这个是从机的事情。
比如这的模式0(也是常用的模式):CPOL:代表空闲时SCK的状态:为0就是空闲时SCK为0
CPHA