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.0 SPI_I2S_FLAG_TXE】
此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。
接收缓冲器非空(RXNE)【3.0 SPI_I2S_FLAG_RXNE】
此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
注意在2.0的库中函数
SPI_SendData SPI_ReceiveData SPI_GetFlagStatus 等在3.0的库中 变为
SPI_I2S_SendData SPI_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) ;直接软件清除标志位。
}
上一篇:STM32 DMA理解
下一篇:STM32 EXIT
推荐阅读最新更新时间:2024-03-16 15:02