那么今天再说说SPI吧,通过前面的IIC其实我们知道,通讯协议,其实就是通过时序来传输数据,通过自定义不同的函数来实现数据的传输(具体就是按照时序,来读写寄存器的标志位,来完成数据传输的具体操作),所以可以通过再定义不同的函数来读写相应存储传输数据的存储空间,以完成对数据的处理,那我们前面提到的IIC主要应用到的地方就是读写EEPROM,那今天说的SPI,就以读写FLASH来讲讲它的通讯原理。
其实我们知道它与IIC不同的是,它是由4条线路控制的
片选:
选择设备是根据片选线拉低电平来得到选中的,这就表示通讯开始了,通讯结束就拉高电平即可;其实很前面就说过它的通讯原理。
时钟:
那再说说它的时钟线,时钟的极性和相位可以决定四种通讯方式,配置的时候,就要看你的从设备是使用那种方式,来进行配置的,还有就是不同的SPI所在的总线不一样,不同的频率也不一样,但分频系数都一样,使用的时候具体查资料配置。
数据线:
还有即使两条数据线,以数据的传输方向来区分,类似与串口的那两条数据信号线路。
数据控制:
与IIC不同的是,这里引入了缓冲区,也就是在数据寄存器和移位寄存器之间加入了缓冲区,为什么要加入缓冲区?应该是SPI的传输速率较快,引入缓冲区来提高数据传输效率。
控制逻辑:
还是之前的那句话,通过读取状态寄存器相应位,来获取工作状态;当然还可以控制寄存器来配置工作模式,SPI信号中断,DMA请求。
主模式收发流程:
- 控制片选线,产生开始信号
- 将要发送的数据写入数据寄存器,改数据会被发往缓冲区
- 按照时钟,MOSI会把数据一位一位发送出去(通过移位寄存器),MISO反之
- 发送完一帧数据,SR的TXE置1表示发送缓冲区已空;接收完一帧数据,RXNE置1表示接受缓冲区非空。
- 当TXE为1,若还要继续发送数据,就向数据寄存器写数据;当RXNE为1,读取数据寄存器以获取接受缓存区里的数据
如若使能了TXE或RXNE中断,他们置1时会产生SPI中断信号,当然只会进入同一个中断服务函数,再里面检查相应位可以判断是那个事件触发的中断,以分别进行处理;也可以用DMA的方式来读取数据寄存器里的数据。
FLASH:
其实操作FLASH和EEPROM差不多,只不过他们的页大小不同,而且FLASH只能写入页或块,擦除的最小单位是扇区,而EEPROM可以擦写字节;FLASH写的时候要先擦除原来的内容;FLASH自身定义了一些操作,通过发送指令来完成一些特殊操作(命令定义为一个字节的数据来发送给flash)。SPI-FLASH是NORFLASH,它具有统一编址,所以可以按地址读写。注意存储代码的是在芯片内部的FLASH,与这里说的不是一个概念。