【嵌入式】化繁为简 UART、I2C、SPI整理

本文参考:浅谈单片机通信,化繁为简UART、I2C、SPI学习全家桶,你值得拥有!_哔哩哔哩_bilibili 

单片机的数据都是以0、1发送的,每一位发送多少时间取决于波特率 。

波特率是发送二进制数据位的速率,单位是bps,即每秒传输二进制位的数量,如256bps = 256bit/s,两个单片机要进行通信必须保持一致的通信波特率

UART

通用异步收发器,是一种通用串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,常用于单片机与单片机或外部辅助设备之间的通信。

 下面我们用UART来发送0X96这个数据,UART发送数据时,先发低位再发高位

当总线在空闲状态时,线路保持高电平,发送数据前会先发送一个0(起始位),让总线从高电平变为低电平,提醒数据接收方做好准备,然后依次从低位到高位发送8位数据位, 8位数据完成传输后会发送一个1,让总线重新回到高电平状态(停止位)。所以UART传输数据时一次发8位,加上起始位和停止位 一共是10位数据。若要发送新的字节,需要重新发送起始位,并重复该过程

I2C

一种两线式、串行、半双工同步通信总线,可以挂载多个参与通信的器件,常用于板内通信,比如单片机与外围芯片之间短距离、低速的信号传输。

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、数据发送/读取完成主机发送停止位结束此次通信
 

SPI

串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和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通信的四种工作模式
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值