SPI特征
3线全双工同步传输
带货不带第三根双向数据线的双线单工同步传输
8或16位传输帧格局挑选
主或从操作
8个形式波特率分频系数
从形式频率
主形式和从形式的快速通讯:最大SPI速度达到了18MHz
主形式和从形式均能够由软件或硬件进行NSS办理:主/从操作形式的动态改动
可编程的时钟极性和相位
可编程的数据次序
可触发中止的专用发送和承受标志
SPI总线忙状况标志
支撑牢靠通讯的硬件CRC
一般SPI经过4个管脚与外部器材相连
MISO:主设备输入/从设备输出管脚,该管脚在从形式下发送数据,在主形式下接纳数据
MOSI:主设备输出/从设置输入管脚,该管脚在主形式下发送数据,在从形式下承受数据
SCK:串口时钟,作为主设备的输出,从设置的输入
NSS:从设置挑选,这是一个可选的管脚,用来挑选主/从设置,他的功用是用来作为片选管脚,让主设备能够独自的与特定从设备通讯,防止数据线上的抵触,从设备的NSS管脚能够由主设备作为一个规范的IO来驱动,一旦被使能SSOE位,NSS管脚也能够作为输出管脚,并在SPI设置为主形式时拉低,此刻一切NSS管脚连接到主设备NSS管脚的SPI设备,会检测到低电平,假如他们被设置NSS硬件形式,就会主动进入从设备状况
时钟信号的相位和极性
SPI_CR存放器的CPOL和CPHA位,能够组合成四种或许的时序联系,CPOL(时钟极性)位控制在没有数据传输时时钟的闲暇状况电平,此位对主形式和从设备下的设备都有用,假如CPOL被清0,SCK引脚在闲暇状况坚持低电平;假如CPOL被置1,SCK引脚在闲暇状况坚持高电平
假如CPHA时钟相位位被置1,SCK时钟的第二个边缘(CPOL位为0时便是下降沿,CPOL位为1时便是上升沿),进行数据位的采样,数据在第二个时钟边缘被锁存
CPOL时钟极性和CPHA时钟相位的组合挑选数据捕捉的时钟边缘
SPI从形式
在从装备里,SCK引脚用于接纳到主设备来的串行时钟,SPI_CR1存放器的BR的设置不影响数据传输速率
装备进程
1、装备DFF位以界说数据帧格局为8位或16位
2、挑选CPOL和CPHA位来界说数据传输和串行时钟之间的相位联系,为确保正确的数据传输,从设备和主设备的CPOL和CPHA位有必要装备成相同的方法
3、帧格局(MSB在前仍是LSB在前取决于SPI_CR1存放器中的LSBFIRST位)有必要和主设备相同
4、硬件形式下,在完好的数据帧发送进程中,NSS引脚有必要为低电平,软件形式下,设这SPI_CR1存放器中的SSM位并铲除SSI位
5、铲除MSTR位,设置SPE位,使呼应引脚作业于SPI形式下
在这个装备里,MOSI引脚是数据输入,MISO引脚是数据输出
数据发送进程
数据字被并行地写入发送缓冲器
当从设备接纳到时钟信号,而且在MOSI引脚上呈现榜首个数据位时,发送进程开端,榜首个位被发送出去,余下的位(关于9位数据帧格局,还有7位;关于16位数据帧格局,还有15位)被装进移位存放器,当发送缓冲器中的数据传输到移位存放器时,SPI_SR存放器里的TXE标志被设置,假如设置了SPI_CR2存放器上的TXEIE位,将会发生中止
数据接纳进程
关于接纳方,当数据接纳完结时
移位存放器中的数据传送到承受缓冲器,SPI_SR存放器中的RXNE标志被设置
假如设置了SPI_CR2存放器的RXEIE位,则发生中止
在最终一个采样时钟边缘后,RXNE位被置1,移位存放器中接纳到的数据字节被传送到承受缓冲器,当读SPI_DR存放器时,SPI设备回来这个值。读SPI_DR存放器是,RXNE位被铲除。
SPI主形式
在主装备时,串行时钟在SCK脚发生
装备进程
1、经过SPI_CR1存放器的BR位界说串行时钟波特率
2、挑选CPOL和CPHA位,界说数据传输和串行时钟的相位联系
3、设置DRR位来界说8位或16位数据帧格局
4、装备SPI_CR1存放器的LSBFIRST位界说帧格局
5、假如NSS引脚需求作业在输入形式,硬件形式中在整个数据帧传输器材应把NSS脚连接到高电平;在软件形式中,需设置SPI_CR1存放器的SSM和SSI位,假如NSS引脚作业在输出形式,则只需设置SSOE位
6、有必要设置MSTR和SPE位
在这个装备中,MOSI脚是数据输出,而MISO脚是数据输入。
数据发送进程
当一字节写进发送缓冲器时,发送进程开端。
在发送榜首个数据位时,数据字被并行地(经过内部总线)传入认为存放器,然后串行地溢出到MOSI脚上;MSB在线仍是LSB在线,取决于SPI_CR1存放器中的LSBFIRST位,数据从发送缓冲器传输到移位存放器时TXE标志将被置位,假如设置SPI_CR1存放器中的TXEIE位,将发生中止
数据接纳进程
关于接纳器来说,当数据传输完结时
移位存放器里的数据传送到接纳缓冲器,而且RXNE标志被置位
假如SPI_CR2存放器中的RXEIE位被置位,则发生中止。
在最终采样时钟沿,RXNE位被设置,在移位存放器中接纳到的数据字被传送到承受缓冲器,读SPI_DR存放器时,SPIU设备回来承受到的数据字,读SPI_DR存放器将铲除RXNE位。
一旦传输开端,假如下一个将发送的数据被放进了发送缓冲器,就可认为之一个接连的传输流,在企图写发送缓冲器之前,需承认TXE标志应该是1
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
SPI_Cmd(SPI2, DISABLE);//有必要先禁能,才干改动MODE
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;//两线全双工
SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//主
SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;//8位
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;//CPOL=1时钟悬空高
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;//CPHA=1 数据捕获第2个
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//软件NSS
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_2;//2分频
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//高位在前
SPI_InitStructure.SPI_CRCPolynomial =7;//CRC7
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
//spi的装备完毕了能够使用了。
也可用 函数SPI_StructInit 把SPI_InitStruct中的每一个参数按缺省值填入
_____________________________________________________________________________________
发送缓冲器闲暇标志(TXE)【3.0SPI_I2S_FLAG_TXE】
此标志为’1’时标明发送缓冲器为空,能够写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被铲除。
接纳缓冲器非空(RXNE)【3.0SPI_I2S_FLAG_RXNE】
此标志为’1’时标明在接纳缓冲器中包括有用的接纳数据。读SPI数据存放器能够铲除此标志。
注意在2.0的库中函数
SPI_SendData SPI_ReceiveData SPI_GetFlagStatus 等在3.0的库中 变为
SPI_I2S_SendDataSPI_I2S_ReceiveData SPI_I2S_GetFlagStatus
写一个发送/承受函数
static u8 SPIByte(u8 byte)
{
while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
SPI2->DR = byte;
//SPI_I2S_SendData(SPI2,byte);
while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))==RESET);
return(SPI2->DR);
//returnSPI_I2S_ReceiveData(SPI2);读存放器用硬件铲除标志位。
//SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;直接软件铲除标志位。
}