一.SPI总线
#1.SPI总线的电气连接
- 描述通信总线的方式:
- 同步 全双工 串行
- 异步 半双工 并行(速度快,占的资源多,8的倍数条线)
单工
SPI总线(同步 全双工 串行总线):一般情况使用的是一个主设备多个从设备。
至少四条线:
SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)
特点:
1.SPI一般是单主机多从机的通信方式
2.SPI是一种高低位先行可选择的(MSB高位先行,LSB低位先行),8bit和16bit数据位可编辑的通信方式
3.SPI是摩托罗拉公司研发的通信总线协议
4.SPI通信速率最大可以达到18MHZ
5.SPI的时钟线一般由主机控制,由主机发起SPI通信
典型SPI总线图
2.SPI时序
2.1 SPI4种工作模式
例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
2.2 SPI 时序详解
SPI框图:
整体传输过程大概可以分为以下几个过程:
- 主机先将NSS信号拉低,这样保证开始接收数据;
- 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
- 由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。
- 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
- 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;
3.通信方式
- 寻址方式:与I2C发送一个字节数据寻址方式不同,SPI当主机和某个从设备进行通信时,主设备需要先向从设备的片选线上发送使能信号(高电平或者低电平,根据从机而定)表示选中该设备。
- 通信过程:串口:先发低位后发高位
I2C:先发高位后发低位
SPI:先发高位后发低位(MSB为最高位,LSB为最低位);数据线高电平表示‘1’,低电平表示‘0’;一个字节发送完成以后无需应答可以再发一个字节;SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,再紧接着的下降沿或着上升沿时接收器从数据线上读取数据,完成一位数据的传送,八个时钟周期即可完成一个字节数据的传送。(没有起始信号,没有终止信号,没有应答)
SPI四种模式详解图解
模式一代码示例:
//SPI的模式1:
u8 SPI_ReadWriteOneByte(u8 tx_data)
{
u8 i,rx_data=0;
SCK=0; //空闲电平(默认初始化情况)
for(i=0;i<8;i++)
{
/*1. 主机发送一位数据*/
SCK=0;//告诉从机,主机将要发送数据
if(tx_data&0x80)MOSI=1; //发送数据
else MOSI=0;
SCK=1; //告诉从机,主机数据发送完毕
tx_data<<=1; //继续发送下一位
/*2. 主机接收一位数据*/
rx_data<<=1; //默认认为接收到0
if(MISO)rx_data|=0x01;
}
SCK=0; //恢复空闲电平
return rx_data;
}
版权声明:本代码为CSDN博主「void*_」的原创文章,遵循CC 4.0 BY-SA版权协议,
原文链接:https://blog.csdn.net/qq_36612961/article/details/89349880
参考博文:SPI协议详解(工作特点、时序图)
SPI四种模式
https://www.kemaowang.org.cn/n/578001.html