ADC
工作原理
采样——保持——量化——编码
采样:间隔一定时间对模拟信号进行采样,单位时间对信号的采样次数被称为采样率
保持:保持电路将模拟信号保持一段时间,让后级的数字电路完成量化和编码
量化:将连续的模拟信号用有限个离散数字信号近似化
编码:将量化后的结果用二进制或其他进制的形式表示出来
- 分辨率:数字量变化最小量时模拟信号的变化量,定义为满刻度与2^n的比值,通常以数字信号的位数来表示
- 转换速率:AD转换一次所需时间的倒数,单位时间完成AD转换的次数
- 采样速率:两次采样(转换)的时间间隔的倒数,为了保证转换的正确完成,采样率必须小于等于转换速率,即采样时间大于转换时间
UART
UART:通用异步收发器,全双工,串行通信
UART帧格式
总线空闲时,处于高电平
起始位:拉低发送一个0表示起始位,随后进行数据发送
发送8位数据,先发送最低位,后发送最高位
奇偶校验位:校验数据的正确性
奇校验:1的数量为偶数则为1,反之为0,偶校验:1的数量为偶数则为0,反之为1
停止位:高电平表示传输停止
波特率
波特率用于描述UART通信时的通信速度,单位为bps,即每秒钟传输的bit数量
通信双方的波特率必须一致,使收发双方的时钟一致
RS232
规定逻辑1的电平在-5到-15V,逻辑0的电平为+5V到+15V,目的是提升抗干扰能力,传送距离可以达到15m
由于TTL电平不符合RS232的要求,往往需要加一个电平转换芯片,如MAX232
存在的问题:
- 通信速度较低
- 易产生通信干扰
- 传输距离短(15m)
RS485
半双工,允许连接多个收发器,使用差分信号进行传输
规定两线之间的电压差在+2V到+6V之间为逻辑1,-2V到-6V之间为逻辑0
A端>B端为1,A端<B端为0
需要使用电平转换芯片将TTL信号转换为485信号,如MAX485
- 抗干扰能力强
- 通信距离可达1500m
- 通信速度快
- 可以多节点组网
ModBus协议
基于RS485
帧与帧之间应间隔3.5字符的时间
1字符=1个UART帧
例:9600波特率 1UART帧 = 1bit起始位+8bit数据+1bit停止位
3.5 * 10 * 1 / 9600 = 0.0036s = 3.6ms
ModBus帧格式
地址码(ID) | 功能码 | 数据区 | 校验码(CRC) |
---|---|---|---|
8bit | 8bit | N * 8bit | 16bit |
0为广播地址,地址范围1~247,广播时,从机不回应指令 | 0x03读0x06写0x16写多个 |
主机命令帧
地址码(ID) | 功能码 | 寄存器地址 | 寄存器个数 | 校验码(CRC) |
---|---|---|---|---|
8bit | 8bit | 16bit | 16bit | 16bit |
01 | 0x03 | 0x00 0x00 | 0x00 0x02 | 0xC4 0x0B |
向地址为01的从机发送 | 读从机数据,要求从机返回数据 | 从地址00开始读 | 读两个寄存器,包含起始地址指向的寄存器 | CRC校验 |
从机回应帧
地址码(ID) | 功能码 | 字节数 | 数据1 | 数据2 | 校验码(CRC) |
---|---|---|---|---|---|
8bit | 8bit | 8bit | 16bit | 16bit | 16bit |
01 | 0x03 | 0x04 | 0x00 0x01 | 0x00 0x02 | 0x2A 0x32 |
向地址为01的从机发送 | 读从机数据,要求从机返回数据 | 寄存器个数 * 2 | CRC校验 |
I2C
半双工
I2C为多主机总线,I2C有冲突检测和仲裁的功能防止错误产生
每个连接到I2C的器件都有一个唯一地址(7bit)
同一时刻只能有一个主机,使用主机进行管理
使用一根时钟线SCL和数据线SDA进行通信
空闲时:SCL和SDA同时高电平
起始信号和停止信号都由主机发出
起始信号:SCL为高电平时,SDA由高电平跳变为低电平
停止信号:SCL为高电平时,SDA由低电平跳变为高电平
数据传输:
- 先发送高位后发送低位
- SCL为低电平时,允许发送数据,
- 发送完一个bit的数据后,要将SCL拉高,SDA不允许变化,保持稳定,等待接收器接收这个bit的数据
- 应答位:接收器将SDA拉低为应答(ACK),保持高为非应答(NACK)
应答位:接收器将SDA拉低为应答(ACK),保持高为非应答(NACK)
通信过程
- 主机发送起始信号启用总线,发送一个字节数据指名从机地址和读写方向(0:写,1:读)
- 被寻址的从机向主机回应应答信号
- 主机发送一个字节
- 从机回应
- ...
- 通信完成主机发送停止信号
I2C通信时序
1. 主机向从机发数据
起始信号 | 从机地址7bit | 读写位1bit | 从机ACK | 数据8bit | 从机ACK | 数据8bit | 从机ACK/NAK | 终止信号 |
---|---|---|---|---|---|---|---|---|
主机发送 | 主机发 | 主机发:0写 | 从机发:0 | 主机发 | 从机发:0 | 主机发 | 从机发:0/1 | 主机发送 |
当主机不想继续发送时,发送一个终止信号(SCL拉高的同时,SDA从低电平跳变到高电平)
当从机不想接收时,在接收完主机发送的最后一个字节后,向主机发送NAK
2. 从机向主机发送数据
起始信号 | 从机地址7bit | 读写位1bit | 从机ACK | 数据8bit | 主机ACK | 数据8bit | 主机NAK | 终止信号 |
---|---|---|---|---|---|---|---|---|
主机发送 | 主机发 | 主机发:1读 | 从机发:0 | 从机发 | 主机发:0 | 从机发 | 主机发:1 | 主机发 |
主机不想接收数据时,接收完最后一个字节后,发送一个NAK,再发送一个终止信号
3. 主机发完从机发
起始信号 | 从机地址 | 读写位 | 从机ACK | 数据 | 从机ACK/NAK | 起始信号 | 从机地址 | 读写位 | 从机ACK | 数据 | 主机NAK | 终止信号 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
主机发 | 主机发 | 主机发:0写 | 从机发:0 | 主机发 | 从机发:0/1 | 主机发 | 主机发 | 主机发:1读 | 从机发:0 | 从机发 | 主机发:1 | 主机发 |
主机发完一次数据后,重新开始一次(从起始信号开始),改变读写方向
第一次通信没有发送停止信号,不释放对总线的控制,可以继续进行通信
SPI
SPI有四根线,分别是SCLK时钟线,MOSI主出从入线,MISO主入从出线,CS片选线
全双工,不允许多主机
数据传输时,先发送高位
寻址方式
当主机要与从机通信时,需要相对应从机的片选线上发送使能信号(高电平/低电平,根据从机而定)
同步方式
1 bit数据传输:时钟线在上升沿或下降沿时,发送器发送数据,下一个下降沿或上升沿时,接收器从数据线读取数据
八个时钟周期可以完成1 Byte数据传输
极性和相位
极性(CPOL)表示SCLK空闲时的状态
- CPOL=0,空闲时SCLK为低电平
- CPOL=1,空闲时SCLK为高电平
相位(CPHA)表示采样时刻
- CPHA=0,每个时钟周期的第一个时钟沿(总线空闲时的第一个边沿,下降或上升沿)采样(从机接收数据)
- CPHA=1,每个时钟周期的第二个时钟沿采样
SPI有四种模式
CPOL | CPHA | 说明 |
---|---|---|
0 | 0 | 上升沿采样:SCLK空闲时(低电平),主机发1bit数据,SCLK上升沿(本时钟周期总线空闲后的第一个边沿)从机接收该数据,这是一个时钟周期;下一个时钟周期,SCLK拉低,总线空闲,主机发数据,上升沿,从机接数据... |
0 | 1 | 下降沿采样:SCLK空闲时(低电平),SCLK上升沿,主机发1bit数据,SCLK下降沿(本时钟周期总线空闲后的第二个边沿)从机接收数据,这是一个时钟周期;下一个时钟周期,SCLK拉低,总线空闲,上升沿,主机发数据,下降沿,从机接数据... |
1 | 0 | 下降沿采样:SCLK空闲时(高电平),主机发送1bit数据,SCLK下降沿(本时钟周期总线空闲后的第一个边沿)从机接收数据,这是一个时钟周期;下一个时钟周期,SCLK拉高,总线空闲,主机发数据,下降沿,从机接收数据... |
1 | 1 | 上升沿采样:SCLK空闲时(高电平),SCLK下降沿,主机发送1bit数据,SCLK上升沿(本时钟周期总线空闲后的第二个边沿)从机接收数据,这是一个时钟周期;下一个时钟周期,SCLK拉高,总线空闲,下降沿,主机发数据,上升沿,从机接数据... |