【接口协议】05.SPI
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
SPI
SPI 基础
简介
SPI(Serial Peripheral Interface)串行外设接口,高速,全双工,同步的通信总线,四根线。
硬件连接
- 多NSS独立片选方式
- 菊花链方式
DO(MOSI) | Master Output, Slave Input, SPI主控用来发出数据,SPI从设备用来接收数据,输出引脚设置为推挽输出 |
DI(MISO) | Master Input, Slave Output, SPI主控用来发出数据,SPI从设备用来接收数据,输入引脚设置为浮空或上拉输入,从机不输出时为高阻态。 |
SCK | Serial Clock,时钟 |
CS | Chip Select,芯片选择引脚,NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。 |
时序
- 起始:CS从高到低
- 终止:CS从低到高
SPI的时钟极性CPOL和时钟相位CPHA可以分别为0或1,由此构成了四种组合:
0 | 0 | 0 | CLK初始电平为低电平,在第一个时钟沿采样数据 |
0 | 1 | 1 | CLK初始电平为低电平,在第二个时钟沿采样数据 |
1 | 0 | 2 | CLK初始电平为高电平,在第一个时钟沿采样数据 |
1 | 1 | 3 | CLK初始电平为高电平,在第二个时钟沿采样数据 |
常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。
IIC有效字节流数据第一个字节是寄存器地址,之后是读写的数据,使用的是读写寄存器模型
SPI用指令码加读写数据模型,发送指令字节的方式来读取,从机中有指令集对应,
代码
io模拟
void MySPI_Start(void)
{
MySPI_W_SS(0);
}
void MySPI_Stop(void)
{
MySPI_W_SS(1);
}
uint8_t MySPI_SwapByte(uint8_t ByteSend) //交换字节,发送的话就不需要读取返回值,接收的话就发送0XFF接收返回的数据。
{
uint8_t i, ByteReceive = 0x00;
for (i = 0; i < 8; i ++)
{
MySPI_W_MOSI(ByteSend & (0x80 >> i));
MySPI_W_SCK(1);
if (MySPI_R_MISO() == 1){ByteReceive |= (0x80 >> i);}
MySPI_W_SCK(0);
}
return ByteReceive;
}
常见面试问题
SPI总线的工作频率
SPI是一种事实标准,由Motorola开发,并没有一个官方标准。已知的有的器件SPI已达到50Mbps。具体到产品中SPI的速率主要看主从器件SPI控制器的性能限制。
SPI最大传输速率受以下几个条件影响:
1)SPI的最大时钟频率;
2)CPU处理SPI数据的能力;
3)输出端驱动能力(PCB所允许的最大信号传输速率);
W25Qxx系列时钟频率:80MHz/160MHz(Dual SPI)/320MHz(Quad SPI)
SPI可以挂载多少个器件
独立片选方式:看GPIO引脚个数,不够也可以用译码器扩展
菊花链方式:看IO驱动能力,硬件方面考虑更多,会有信号延迟问题。
SPI是一种常见的串行通信协议,它通过主设备和多个从设备之间进行数据交换。在SPI菊花
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇【本专栏】 4.嵌入式Linux (建议PC端查看)