目录
IIC
物理层:支持多主多从
两根线,SDA,SCL
更多细节看手册
协议层:
I2C 通讯过程的基本结构:
一个是主机写数据到从机,一个是主机读数据到从机。
地址位7或10位。
![](https://i-blog.csdnimg.cn/blog_migrate/591c678b29f96f0e075a1c96469160b7.png)
这个是IIC通讯复合格式:
![](https://i-blog.csdnimg.cn/blog_migrate/33d9e7c670795efee0b9f405885be925.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0ad1cf44c1e710a059d27ed59ebb3d28.png)
除了基本的读写,
I2C
通讯更常用的是复合格式,即第三幅图的情况,该传输过程有两次起始信
号
(S)
。一般在第一次传输中,主机通过
SLAVE_ADDRESS
寻找到从设备后,发送一段“数据”,
这段数据通常用于表示从设备内部的寄存器或存储器地址
(
注意区分它与
SLAVE_ADDRESS
的
区别
)
;在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读
写地址,第二次则是读写的实际内容。
![](https://i-blog.csdnimg.cn/blog_migrate/05d01a6fc7ac5242dd2e52a1fa1cc11d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/65e38d2953836c2ca9d45fbefb508ef2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee9b745ae729a4ad47d7f9d96eee1be1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0dbe6f0cb1e06c8ec8ba45f1a420d6f.png)
数据有效性:
SCL 为高电平的时候 SDA 表示的数据有效,当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。每次数据传输都以字节为单位,每次传输的字节数不受限制。
IIC架构剖析:
![](https://i-blog.csdnimg.cn/blog_migrate/a4aebc3b034fcbe721540cb0d466916e.png)
IIC初始化结构体:
typedef struct {
2 uint32_t I2C_ClockSpeed; /*!< 设置 SCL 时钟频率,此值要低于 40 0000*/
3 uint16_t I2C_Mode; /*!< 指定工作模式,可选 I2C 模式及 SMBUS 模式 */
4 uint16_t I2C_DutyCycle; /* 指定时钟占空比,可选 low/high = 2:1 及 16:9 模式
*/
5 uint16_t I2C_OwnAddress1; /*!< 指定自身的 I2C 设备地址 */
6 uint16_t I2C_Ack; /*!< 使能或关闭响应 (一般都要使能) */
7 uint16_t I2C_AcknowledgedAddress; /*!< 指定地址的长度,可为 7 位及 10 位 */
8 } I2C_InitTypeDef;
SPI
物理层:
一主多从,NSS作为片选信号,NSS,MOSI,MISO,SCK四根线。SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。
协议层:
与 I2C 的类似,SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
数据有效性:
SPI
使用
MOSI
及
MISO
信号线来传输数据,使用
SCK
信号线进行数据同步。
MOSI
及
MISO
数
据线在
SCK
的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,
MSB
先行或
LSB
先行并没有作硬性规定,但要保证两个
SPI
通讯设备之间使用同样的协定,一般都
会采用图
SPI
通讯时序
中的
MSB 先行模式。数据帧长度可设置为 8 位或 16 位。
CPOL/CPHA 及通讯模式:
SPI 一共有四种通讯模式,由CPOL(时钟极性),CPHA(时钟相位)控制。
实际中采用较多的是“模式 0”与“模式 3”。
SPI架构剖析:
SPI初始化结构体:
typedef struct
{
uint16_t SPI_Direction; /* 设置 SPI 的单双向模式 */
uint16_t SPI_Mode; /* 设置 SPI 的主/从机端模式 */
uint16_t SPI_DataSize; /* 设置 SPI 的数据帧长度,可选 8/16 位 */
uint16_t SPI_CPOL; /* 设置时钟极性 CPOL,可选高/低电平 */
uint16_t SPI_CPHA; /* 设置时钟相位,可选奇/偶数边沿采样 */
uint16_t SPI_NSS; /* 设置 NSS 引脚由 SPI 硬件控制还是软件控制
*/
uint16_t SPI_BaudRatePrescaler; /* 设置时钟分频因子,fpclk/分频数 =fSCK */
uint16_t SPI_FirstBit; /* 设置 MSB/LSB 先行 */
uint16_t SPI_CRCPolynomial; /* 设置 CRC 校验的表达式 */
} SPI_InitTypeDef;
知识点:
发送缓冲区为空 (TXE),接收缓冲区非空 (RXNE)。