一、IIC总线协议
1.简介
定义:是一种广泛用于嵌入式系统的同步、串行、半双工通信协议,用于在同一块电路板上的集成电路之间进行通信。
I2C总线:是一种物理通信架构,用于连接多个设备,实现设备之间的数据传输。
I2C协议:是一套规则,定义了IIC总线上数据通信的过程,包括如何启动通信、传输数据、应答信号、结束通信等。

特点:
1.双线通信;2.同步通信;3.串行数据传输;4.半双工传输;5.主从架构;6.支持多主多从;7.从机地址唯一性;8.速度灵活
2.协议规则
只能由主机产生:
a.起始信号:SCL线高电平的时候SDA线产生下降沿;
b.终止信号:SCL高电平的时候SDA线产生上升沿。
主机和从机都能产生:
a.应答信号:时钟线SCL高电平期间,SDA低电;
b.非应答信号:SCL高电平期间,SDA高电平。

总线空闲:SCL和SDA一直为高电平
数据有效:在时钟线高电平期间只能读数据,数据线电平不能变;低电平期间可以写入数据,数据线电平才能变
数据的传输单元:IIC线以字节为单位进行传输,顺序为高位开始传输
由主机发:从机地址为7位左移1位,加上数据传输方向位(0:写 ; 1:读)


3.数据手册
从机地址:

计算公式:

精度选择指令:

通信方式:

主机先写:发送设备地址(写方向)+ 寄存器/命令字节(Command),从机应答(ACK)。
主机再读:重新发起起始条件(或重复起始),发送设备地址(读方向),从机应答后返回 16 位数据(MSB 在前)。
带校验:数据之后跟随 CRC8,用于检查读数据的完整性。
终止:主机接收 CRC8 后应答(ACK),最后以停止条件(P)结束。
采集时间:

4.温湿度数据读取
ioc配置






二、SPI协议
1.简介
定义:SPI通信是一种同步通信,根据时钟信号,设备得以在正确的时机发送和接收数据,从而确保数据传输的有效性以及数据传输的速度。时钟信号由主设备产生,通过SCK引脚输出,主从设备的通信便根据SCK上的时钟信号进行数据收发。
边沿触发
总线接口 ( 引脚 ) SCK 、 MOSI (master out slave in)、 MISO (master in slave out)、 CS, CS信号线进行从机的选择
遵循一主多从或者一主一从的结构
数据帧长度 8bit 或 16bit 数据传输的格式 MSB 或 LSB。 MSB表示先发送最高位;LSB表示发送最低位。控制器可以自由配置先发高位还是低位


指定当前要和哪一个设备通信,只唤醒选中的那一个,其他设备保持沉默不抢数据
SPI 分离 GPIO 片选接法:
SCK、MOSI、MISO:直接连通 MCU 硬件 SPI 外设引脚与从设备对应引脚,属于 SPI 硬件专用功能脚。
CS 片选:不使用 SPI 外设自带 CS 引脚,而是单独拿出一个普通的通用 GPIO 引脚,软件控制高低电平来选中 / 释放从设备。
优点:一个 SPI 总线挂载多个从机时,只需多分配几个普通 GPIO 做各自 CS;大部分 MCU 硬件 SPI 的内置 NSS 引脚功能受限,软件 GPIO 控制 CS 逻辑更可控,适配绝大多数 SPI 传感器。
缺点:需要额外占用 一个普通 GPIO 引脚
SPI 硬件自带 CS 引脚接法:
MCU 硬件 SPI 模块自带专用 CS 引脚,直接连接到从设备 CS 脚,由 SPI 硬件外设自动控制片选电平,无需软件手动操作 GPIO。
优点:节省普通 GPIO 资源;硬件自动管理 CS 时序,发送数据时自动拉低、传输结束自动拉高,简化代码,适合高速连续传输。
缺点:一个 SPI 外设通常只有 1 个硬件 CS 脚,只能挂载单个从设备
时钟极性CPOL
Clock Polarity,简称CPOL,就是时钟极性,当主从设备之间没有数据传输的时候SCK时钟线的电平状态(即空闲状态)。当CPOL=1时,则SCK线空闲状态下是高电平;当CPOL=O时,则SCK线空闲状态下是低电平。
时钟相位CPHA
Clock Phase,简称CPHA,就是时钟相位。CPHA实际指的就是数据的采样时刻,CPHA=0时,则表示数据的采样是从时钟的第一个边沿,CPHA=1时,则表示数据的采样是从时钟的第二个边沿。

2.回环测试




三、Modbus TCP 协议控制外设
1.整体帧结构:
ADU = 7 字节 MBAP 报文头 + PDU(功能码 + 数据)
一帧完整 Modbus TCP 由 7 字节 MBAP 头 + 至少 1 字节 PDU 功能码 组成
a.MBAP 头部 7 字节固定结构
| 字段 | 长度 | 作用说明 |
|---|---|---|
| 事务处理标识符 | 2 字节 | 报文 ID,客户端自增,用于请求 - 应答配对,服务器原样返回,不参与运算 |
| 协议标识符 | 2 字节 | 固定 00 00,代表 Modbus 协议 |
| 长度 | 2 字节 | 后面所有字节总长度(单元标识 + PDU,即 N+2),用于分包解析 |
| 单元标识符 | 1 字节 | 等效 RTU 的从站地址;以太网靠 IP 区分设备,此字段可忽略,常用默认值 01 |
b.PDU 协议数据单元(和 RTU 核心一致)
由1 字节功能码 + N 字节数据组成,读写线圈、寄存器的指令逻辑完全复用 Modbus RTU。
对比 RTU:RTU 帧 = 从站地址 + PDU + CRC16 校验;Modbus TCP无 CRC 校验。
示例:

| 字节偏移 | 内容 | 名称 | 详细说明 |
|---|---|---|---|
| 0~1 | 00 01 | 事务处理标识符 (Transaction ID) | 相当于请求的 "流水号"。客户端发的包 ID 是 0x0001,服务器将来回复时,必须带上同样的 0x0001,这样单片机才能把 "回复" 和 "刚才的请求" 对上号。 |
| 2~3 | 00 00 | 协议标识符 (Protocol ID) | 固定为 0x0000,代表这是 Modbus TCP 协议。如果收到非 0000 的值,说明数据包不合法。 |
| 4~5 | 00 06 | 长度域 (Length) | 告诉服务器:后面还有 6 个字节的数据需要读。后面 6 个字节就是 01 03 00 00 00 01。这一点极其关键,单片机会根据这个数字去计算还要收多少包才算完整。 |
| 6 | 01 | 单元标识符 (Unit ID) | 相当于 Modbus RTU 里面的 "从机地址"。这里写 0x01,代表告诉第 1 号设备:"这包指令是发给你的"。 |
| 7 | 03 | 功能码 (Function Code) | 0x03 代表 "读保持寄存器"。告诉从机:我要读取数据。 |
| 8~9 | 00 00 | 起始地址 (Starting Address) | 告诉从机:"从你的第 0x0000 号寄存器开始读。" |
| 10~11 | 00 01 | 寄存器数量 (Quantity of Registers) | 告诉从机:"我一共要读 1 个寄存器(1 个寄存器占 2 个字节)。" |
2.实验现象

