I2C和SPI总线对比

 

单工、半双工、全双工
单工数据传输只支持数据在一个方向上传输;
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

I2C是半双工,SPI的全双工,uart是全双工。

 

同步是阻塞模式,异步是非阻塞模式。

在总线通信上 同步异步主要看有没有时钟线控制数据传输,spi i2c 有时钟线 所以是同步方式,而uart没有,靠的是通信双方约定好的波特率传输数据。属于异步通讯

 

 

 

下面主要总结一下2种总线的异同点:

1 iic总线不是全双工(半双工),2根线SCL SDA。spi总线实现全双工,4根线SCK CS MOSI MISO

2 iic总线是多主机总线,通过SDA上的地址信息来锁定从设备。spi总线只有一个主设备,主设备通过CS片选来确定从设备

3 iic总线传输速度在100kbps-4Mbps。spi总线传输速度更快,可以达到30Mbps以上。

4 iic总线空闲状态下SDA SCL都是高电平。spi总线空闲状态MOSI MISO也都是 SCK是有CPOL决定的

5 iic总线scl高电平时sda下降沿标志传输开始,上升沿标志传输结束。spi总线cs拉低标志传输开始,cs拉高标志传输结束

(注意:有的控制器TRAN_CSR寄存器, GoBusy位: 向该位写 0 不起作用,写 1 将该位置 1 并启动一次传输,传输结束后该位自动清零(软复位亦可将 该位清零)。发起新的传输前,软件应查询该寄存器,该寄存器为 0 时才可发起新传输)

6 iic总线是SCL高电平采样。spi总线因为是全双工,因此是沿采样,具体要根据CPHA决定。一般情况下master device是SCK的上升沿发送,下降沿采集

7 iic总线和spi总线数据传输都是MSB在前,LSB在后(串口是LSB在前)

8 iic总线和spi总线时钟都是由主设备产生,并且只在数据传输时发出时钟

9 iic总线读写时序比较固定统一,设备驱动编写方便。spi总线不同从设备读写时序差别比较大,因此必须根据具体的设备datasheet来实现读写,相对复杂一些。

I2C 仲裁详解 :

https://blog.csdn.net/u010027547/article/details/47779975

 

 

 

 wudanyu:I2C线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。

 

 

 

USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器
UART:universal asynchronous receiver and transmitter通用异步收发器

 

 

最近项目要考虑串口传输速率的影响,特意去看了一下之前串口传输速率和波特率的选择。
波特率115200 = 115200 (位/秒)

如果没有校验位,就应该除以 10,得到的是每秒字节数:
波特率115200 = 115200 (位/秒) = 11520 (字节/秒) 

再除以 1024,就是每秒 KB 数:
波特率115200 = 115200 (位/秒) = 11.25 (KB/秒) 

============================

如果有一位奇偶校验位,就应该除以 11,得到的是每秒字节数。

最后:
波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)奇偶校验位,就应该除以 11,得到的是每秒字节数。

最后:
波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)

 

 

SPI 设备: GPS  ,有些LCD

I2C 设备:TP, camera 前置和后置作为从用一路i2c,G-sensor,有些charge充电模块

 

 

 

下面转自https://blog.csdn.net/txf1984/article/details/46812091

I2C的概念原理网上都有就不说了,这里只把我把两个开发板通过I2C通讯的调试经验记录分享一下。

I2C要求要有一个主设备,负责发起请求和控制时钟;其它为从设备,通过设备ID地址来识别并响应主设备请求。主从设备要轮流控制SDA。一开始我没搞明白这一点,直接加了写I2C数据代码,然后用示波器在SDA和SCL脚测量,却只能找到些凌乱的波形,没有预期的效果。后来把从设备接上,两边写好代码,互相有了响应,这才在示波器上看到波形。

 

 

 

补两张自己画的i2c write和read的图:

i2cset -y 5  0x4c 0x11 0x11

 

root@linaro-developer:~# i2cget -y 5  0x4c 0x11
0x11

 

 

 

SPIFLASH  写

CPOL:

          Clock Polarity 0:SCK 空闲时为低电平 1:SCK 空闲时为高电平 
CPHA:

          Clock Phase 0:片选有效后 SCK 第一个时钟沿开始采样数据 1:片选有效后 SCK 第二个时钟沿开始采样数据

{CPOL, CPHA}组成了 SPI 的 4 种工作模式。

 

串口波形图

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值