本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
SPI通信
- SPI是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK、MOSI(主机输出从机输入)、MISO(主机输入从机输出)、SS
- 同步,全双工
- 支持总线挂载多设备(一主多从)
与IIC相比
优点:
- SPI传输速度更快,最大传输速度取决与芯片厂商的设计需求
- 设计简单,不复杂
缺点:
- SPI的硬件开销大,通信线的个数比较多
- 通信过程中,经常会有资源浪费的现象
- 仅支持一主多从,不支持多主机
硬件电路
- 所有的SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别连接各从机的SS引脚
- 输出的引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
- 一次只能选择一个SS引脚
- 从机未被选中时,该从机的引脚必须切换为高阻态
数据移位示意图
上升沿:数据移位 下降沿:采样数据
SPI时序基本单元
- 起始条件:SS从高电平切换到低电平
- 终止条件:SS从低电平切换到高电平
SS在低电平期间,表示选用该从机
SPI时序图
CPHA:时钟相位
模式1
- 交换一个字节(模式1)
- CPOL=0:空闲状态,SCK为低电平
- CPHA=1:SCK第一个边沿
(即上升沿)移出数据,第二个边沿(即下降沿)移入数据
SPI没有硬性规定MOSI的默认电平,但是从机的MISO必须置回高阻态
模式0(用的最多)
- 交换一个字节(模式0)
- CPOL=0:空闲状态,SCK为低电平
- CPHA=1:SCK第一个边沿移
(即上升沿)移入数据,第二个边沿(即下降沿)移出数据
为什么模式0最为广泛使用,明明模式1更符合常理?经过网上查证,大概分为以下几点
- 模式0是最早定义的SPI时序模式,兼容性强
- 模式0采用下降沿移出数据,稳定性好
- 很多人刚开始学的就是模式0,于是就模式0就成了默认模式了
SPI1挂载在在APB2上 SPI2和SPI3挂载在APB1上 GPIO全部都挂载在APB2上
配置时钟时要相对应
编程技巧
#define DE_BUG 1
#if DE_BUG
#define LED P0
#else
#define LED P1
//通过DE_BUG来使用不同的宏