SPI是由Motorola公司提出的一种同步串行外围接口;它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用;
SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是一个主机和一个从机进行通信;
通信四种模式:
1、MISO(Master In Slave Out)
主机输入,从机输出;
2、MOSI(Master Out Slave In)
主机输出,从机输入;
3、SCK(Serial Clock)
串行时钟信号
4、SS(Slave Select)
从机选择信号,低电平有效;(即作从机时,该位置低)
SPI总线可在软件的控制下构成各种系统
SPI总线与多从机连接
SPI的基本结构相当于两个8位移位寄存器的首尾相接,构成16位的环形移位寄存器,从而实现了主机与从机的数据交换;
SPI接口的基本结构图
SPI主从模式
设置MSTR(主设备选择)和SPE位(使能位)来选择是否工作在主模式还是从模式;
stm32强大之处:因为从机NSS位必须接0,而主机NSS位接1;stm32可以有软件来设置相应的主从位;
SPI下时钟信号的相位和极性(设置由与之通信的具体芯片来设定)
SPI接口可由CPOL和CPHA设定4种不同传输格式的时序;
CPOL决定时钟脉冲SCK的有效脉冲方式(正脉冲、负脉冲)。CPHA决定数据线MOSI什么时候输出数据或采集数据;
根据CPOL和CPHA的组合数目,一共四种设置情况;
数据图分析:
数据帧的格式
根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB(高位先传)在先也可以是LSB(低位先传),根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或者16位,所选择的数据帧格式对发送/接收都有效;
SPI通信配置步骤:(在主模式下,串行时钟在SCK脚产生)
1、通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率;
2、选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系;
3、设置DFF位来定义8/16位数据帧格式;
4、配置SPI_CR1寄存器的LSBFIRST位定义帧格式;
5、如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式中,需要设置SPI_CR1寄存器的SSM和SSI位,如果NSS引脚工作在输出模式,则只需设置SSOE位;
6、必须设置MSTR和SPE位(只当NSS被连到高电平,这些位才能保存置位)。
在这个配置中,MOSI脚是数据输出,而MISO脚是数据输入;
SPI通信过程: