常州天狼网站建设,wordpress章节添加章节,视频制作和剪辑,网站建设和管理中 经验了解SPI通信对于我们了解通信有非常重要的意义。
SPI#xff08;Serial Peripheral Interface#xff09;是由Motorola公司#xff08;摩托罗拉#xff09;开发的一种通用数据总线
四根通信线#xff1a;
SCK#xff08;Serial Clock#xff09;#xff1a;时钟线Serial Peripheral Interface是由Motorola公司摩托罗拉开发的一种通用数据总线
四根通信线
SCKSerial Clock时钟线
MOSIMaster Output Slave Input主机输出从机输入线
MISOMaster Input Slave Output主机输入从机输出线
SSSlave Select从机选择线代替了I2C的从机寻址机制
另外由于SPI是单端通信所以SPI还需要另外的共地GND线。
注意
1.SPI是全双工不支持多主机
输出引脚就是输出输入就是输入不需要像I2C还需要输入输出转换唯一冲突在于SS从机线
2.SPI不存在数据应答机制的设计只有接收和发送数据。
不同设备名称可能不同却决于明确该设备身份为从机还是主机。
有时候对于数据线接口有很多不同我们往往有着更多的写法到底什么意思还是需要自己根据使用芯片是作为主机还是从机。 这里我们拿一个W25QXX一个外挂的Flash存储器为例子它一般作为从机所以DO就是从机输出主机输入DI就是从机输入主机输出。具体还是需要看设备本省需要作为从机还是主机。
当实在不清楚的时候我们可以查看具体的芯片手册。对于STM32来说STM32常常作为主机当然也有作为从机支持身份转换不过我们往往用做主机比较多。
硬件电路
所有SPI设备的SCK、MOSI、MISO分别连在一起主机另外引出多条SS控制线分别接到各从机的SS引脚代替了 从机寻址的软件操作但是需要多一根从机选择线的硬件资源。
输出引脚MOSI配置为推挽输出I2C为开漏输出是需要兼顾于多主机仲裁等等输入引脚MISO配置为浮空或上拉输入。
同样需要注意的地方SPI为单端信号他们的高低电平都是相对于各自GND需要要求通信双方共地。
SCLK时钟线为主机绝对掌控对于主机而言时钟线SCLK为输出对于从机而言SCLK时钟线为输入。
如果从机没有供电还需要引脚引出来主机引出供电线给予从机寄生供电
下面是大概框图 需要注意
在平时当中SS为高电平当主机需要时候会对相应的SS从机线置低电平当完成通信以后主机就会将SS拉回高电平代表通信结束。就不需要像I2C需要发送从机位地址进行选择从机从机寻址。
输出引脚配置为推挽输出高低电平均有很强的驱动能力上升/下降沿速度非常快
拉高拉低电平就会非常迅速信号变化的快就使得通信速度大大能达到MHZ但是由于I2C是半双工只有两根线经常需要切换输入输出模式同时需要兼顾多主机的时钟同步和仲裁问题就使得其只能使用开漏输出而开漏输出拉低非常迅速但是拉高就比较慢所以通信速度没有SPI那么快。
SPI不支持多主机不要考虑冲突唯一的冲突点在于主机的MISO主机一个输入而从机三个或者多个输出就会导致冲突因此SPI协议规定当从机未被选中从机的MISO引脚必须切换为高阻态不允许输出。
软件实现
主要就是理解一个移位的过程 SPI一般是高位先行我们利用时钟当时钟产生上升沿主机移出最高位的一个数据放在MOSI线上同时数据整体左移一位从机移出最高位的数据放到MISO上并且整体数据左移一位。当时钟产生下降沿主机从MISO线上把从机放在MISO线上数据移入放在最低位上同样的下降沿的时候从机从MOSI线上把主机放在线上的高位移入放在低位。
主机和从机都会进行采样输入直到数据完成交换过程这就是实际的过程。
SPI时序基本单元
起始条件SS从高电平切换到低电平 终止条件SS从低电平切换到高电平 SS低电平代表正在通信
SPI有两种可以配置的位
CPOL(Clock Polarity):时钟极性
CPHAClock Phase:时钟相位
综合起来可以有也就是四种模式
如下表 模式选择 时钟极性CPOL 时钟相位CPHA 模式0 0 0 模式1 0 1 模式2 1 0 模式3 1 1
注意
时钟极性CPOL的“0”和“1”决定了空闲状态SCLK的电平是高还是低决定了第一个时钟沿是上升沿还是下降沿。时钟相位CPHA 的“0”和“1”决定了SCK第一个边沿是移入还是移出数据也可以说是决定了主机是奇数边沿采样还是偶数边沿采样。
模式介绍
模式0:
交换一个字节模式0
CPOL0空闲状态时SCK为低电平
CPHA0SCK第一个边沿移入数据第二个边沿移出数据 模式0时序图
结合时序图讲解一下
首先SS由高电平变为低电平代表SPI通信的开始当SS由低电平变为高电平代表SPI通信结束。
SCK由于CPOL为0所以空闲为低电平所以开始数据交换时候第一个为上升沿第二个为下降沿。所以CPOL决定的往往就是SCK第一个为上升沿还是下降沿。
MOSI由于CPHA为0所以在第一个时钟沿进行数据移入操作(实际需要提前移出数据相位提前一个时期在第二个时钟沿进行数据移出操作。我们不断地进行操作可以发现永远是奇数移入操作偶数移出操作对于主机数据采集也可以说就是奇数边沿采样。
注意
MOSI,MISO两个线交叉代表可能发送地数据是“0”或者“1”MISO前面一个线代表上面说的高阻态防止主机数据交换地时候有其他从机输出影响主机数据读取。
模式1
交换一个字节模式1
CPOL0空闲状态时SCK为低电平
CPHA1SCK第一个边沿移出数据第二个边沿移入数据 模式1时序图
结合时序图讲解一下
首先SS由高电平变为低电平代表SPI通信的开始当SS由低电平变为高电平代表SPI通信结束。
SCK由于CPOL为0所以空闲为低电平所以开始数据交换时候第一个为上升沿第二个为下降沿。所以CPOL决定的往往就是SCK第一个为上升沿还是下降沿。
MOSI由于CPHA为1所以在第一个时钟沿进行数据移出操作在第二个时钟沿进行数据移入操作。所以要求我们要提前将数据移入到线上才能保证在第一个时钟沿保证进行的是数据移出的操作我们不断地进行操作可以发现永远是奇数移出操作偶数移入操作对于主机数据采集也可以说就是偶数边沿采样。
模式2
交换一个字节模式2
CPOL1空闲状态时SCK为高电平
CPHA0SCK第一个边沿移入数据第二个边沿移出数据 模式2时序图
首先SS由高电平变为低电平代表着SPI通信的开始当SS由低电平变为高电平代表着SPI通信的结束。
SCK由于时钟极性CPOL为1所以SCLK在空闲状态为高电平所以在通信时第一个时钟沿为下降沿第二个为上升沿。
MOSI由于CPHA为0所以在第一个时钟沿进行数据移入的操作在第二个时钟沿进行数据移出的操作。重复操作可以发现主机为奇数边沿采样。
模式3
交换一个字节模式3
CPOL1空闲状态时SCK为高电平
CPHA1SCK第一个边沿移出数据第二个边沿移入数据 模式3时序图
首先SS由高电平变为低电平代表着SPI通信的开始SS由低电平变为高电平代表着SPI通信的结束。
SCK:由于CPOL为1所以SCLK空闲状态为高电平所以SPI第一个时钟沿为下降沿第二个为上升沿
MOSI由于CPHA为1所以主机在第一个时钟沿进行数据移出的操作在第二个边沿进行数据移入的操作我们不断重复操作就可以发现主机永远是在偶数时钟边沿进行数据采样。
以上就是对SPI模式的讲解在实际使用过程当中往往模式0使用较多。