本文参考:浅谈单片机通信,化繁为简UART、I2C、SPI学习全家桶,你值得拥有!_哔哩哔哩_bilibili
单片机的数据都是以0、1发送的,每一位发送多少时间取决于波特率 。
波特率是发送二进制数据位的速率,单位是bps,即每秒传输二进制位的数量,如256bps = 256bit/s,两个单片机要进行通信必须保持一致的通信波特率
通用异步收发器,是一种通用串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,常用于单片机与单片机或外部辅助设备之间的通信。
下面我们用UART来发送0X96这个数据,UART发送数据时,先发低位再发高位
当总线在空闲状态时,线路保持高电平,发送数据前会先发送一个0(起始位),让总线从高电平变为低电平,提醒数据接收方做好准备,然后依次从低位到高位发送8位数据位, 8位数据完成传输后会发送一个1,让总线重新回到高电平状态(停止位)。所以UART传输数据时一次发8位,加上起始位和停止位 一共是10位数据。若要发送新的字节,需要重新发送起始位,并重复该过程
一种两线式、串行、半双工同步通信总线,可以挂载多个参与通信的器件,常用于板内通信,比如单片机与外围芯片之间短距离、低速的信号传输。
I2C总线有两条线,一条SCL时钟线用于同步,一条SDA数据线用于传输数据,I2C总线能挂载多个器件,且支持多主机模式,即线路上的任一器件都可以作为主机,但由于只有一根信号线,同一时刻,只能有一个主机,主机拥有该时刻下总线的控制权,也就是发起和结束一次通信的权利,而从机只能被主机呼叫。
主机如何识别自己要呼叫的从机呢?
在I2C总线中,每个器件都有一个固定的号码,它是一个七位的地址。
例如,当MCU为主机,要读取E2PROM里的数据时,先会向总线发送E2PROM的地址找到E2PROM。
I2C发送数据的规则和时序:
假设我们要向地址为0x31的E2PROM发送0x96这个8位数据。I2C是从高位到低位依次发送的,当总线空闲时,SCL时钟线和SDA数据线均保持高电平,当主机要开始传输数据时,会先将SDA电平拉低,而此时SDA这个从高到低的跳变沿就是起始位,接下来就是进行器件寻址,在SCL低电平时,以此发送七位地址位,0x32发送完毕后,主机会发送一个读写指示位,低电平表示要发送数据,高电平表示要请求数据,主机发送完以上数据,从机如果成功接收,会发送一个应答位到总线上,这里要特别注意的是,只有SCL低电平时,SDA才能发送变化,SCL高电平时,SDA需要保持,以方便数据接收方读取操作。
发完地址位,主机找到要发送的器件,主机开始正式发送数据,发送的过程和寻址过程一样。主要说明的是,当一个字节八位数据发送完后,要有一个应答才能发送下一个字节,当要传输的所有数据发送完毕后,主机要将SCL时钟电平拉到高电平,并将SDA数据线从低电平拉到高电平,这个从低到高的跳变沿表示停止位。
I2C 通信一般流程:
1、主机发送起始位并进行从机寻址
2、得到应答后主机开始发送/读取数据位
3、数据发送/读取完成主机发送停止位结束此次通信
串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和E2PROM、FLASH、实时时钟、数字信号处理器等器件的通信,它主要是主从方式通信,通常只有一个主机和数个从机。
标准的SPI有四根线,分别是SCLK、MOSI、MISO、CS
SCLK:时钟信号,由主机产生
MOSI:主机给从机发送指令或数据的通道
MISO:主机读取从机的状态或数据的通道
CS:从机片选使能信号
其中SCLK是必须的,其他三条线可以进行删减
在同一时刻,主机只能与一个从机进行通信,当总线存在多个从机时,需要进行片选,将从机的CS借口电平拉高或者拉低 (取决于从机的片选使能信号)
SPI和I2C一样,数据从高位到低位依次发送。
SPI的时钟线 SCLK在空闲时可以是高电平也可以是低电平。
以空闲时刻位高电平进行说明,空闲时刻为高电平,当SCLK出现下降沿从高电平跳到低电平时进行数据输出,当SCLK出现上升沿,从低电平跳变到高电平时进行数据采样 。和I2C相比,SPI没有起始位、结束位、应答位,规则上简单很多。
上述提到,SCLK在空闲时可以是高电平也可以是低电平,其实这反应了时钟的极性
CPOL时钟极性:
CPOL=0,SCLK空闲状态为低电平
CPOL=1,SCLK空闲状态为高电平
时钟的相位决定了什么时候进行数据传输、什么时候进行数据采样
CPHA时钟相位:
CPHA=0,每个周期的第一个跳变沿采样
CPHA=1,每个周期的第一个跳变沿输出
以上两两组合就构成了SPI通信的四种工作模式