SPI(Serial Peripheral Interface)总线系统是一种同步串行外设接口,可以是MCU与各种外围设备以串行方式进行通信以交换信息,该接口一般使用4条线:串行时钟线(SCLK)、主入从出数据线(MISO)、主出从入数据线(MOSI)和低电平有效的从机选择线(SS);其主要特点包括:可以同时发出和接收船型数据;可以作为主机或从机工作;发送结束中断标志;写冲突保护和总线竞争保护。
SPI总线架构示意图:
SPI是一个环形总线结构,有SS、SCK、SDI、SDO组成,在主设备和从设备之间进行双向传输,实现发送和接收数据,最高速率可达5Mbps。由SS信号来选定主设备通信的从设备,在某时间点内主设备和从设备之间可以实现点对点通信,不需要进行寻址操作。SPI共有4种工作模式,SP0、SP1、SP2、SP3,其中比较常用的是SP0、SP3。为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行设置。
如果时钟极性CPOL=0,则串行同步时钟的空闲状态为低电平;如果时钟极性CPOL=1,则串行同步时钟的空闲状态为高电平。
如果时钟相位CPHA=0,则在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果时钟相位CPHA=1,则在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设时钟相位和极性应该一致。
SPI总线4中工作模式的SCK示意:
SPI主要工作时序是在SCK的控制下,两个双向移位寄存器进行数据交换。
假设下面的8位寄存器装的是待发送的数据1010 1010,上升沿发送,下降沿接收,高位先发送。那么第一个上升沿来的时候数据将会是sdo=1,寄存器=0101 010x;下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101 010sdi,这样在8个时钟脉冲以后,两个寄存器的内容相互交换一次,从而完成了一个spi时序。
硬件SPI方式:
(1)写一个字节:
SPI_Writebyte(u8 data)
{
While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//等待发送缓冲区为空
SPI_I2S_SendData(SPI1,Data);
While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//等待接收到一个字节数据
SPI_I2S_ReceiveData(SPI1);
}
(2)读一个字节:
SPI_Readbyte(u8 data)
{
While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//等待发送缓冲区为空
SPI_I2S_SendData(SPI1,Data);
While(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//等待接收到一个字节数据
return SPI_I2S_ReceiveData(SPI1);
}
解析:当不使用FIFO时,只有一个中断,接收和发送共用一个,因为发送和接收是同时完成的:例如主机上升沿发送下降沿接收,那么从机就是上升沿接收下降沿发送,所以一串时钟之后,主机发送完了数据,从机也发送完了数据。
软件SPI:
软件SPI方式和硬件SPI方式的区别:
1.硬件SPI效率高些,编写程序时只需把要发送的数据写到寄存器中,硬件自动进行发送;软件SPI需要根据时序实现时钟拉高拉低,串行数据输出等。
2.硬件SPI必须要求处理器支持该功能;而软件SPI不需要特定要求,一般的IO口就可以使用
3.硬件SPI传输速度可以达到3Mbps,软件SPI传输速度一般700K左右。
总结:在使用SPI时,根据实际情况选择使用硬件SPI,还是软件SPI,注意在使用时确保时序的准确性。
全部0条评论
快来发表一下你的评论吧 !