IIC和SPI协议的优缺点及选择因素

2021-05-28 10:13:22 浏览数 (1)

1、用哪种协议,首先肯定是看这个外设芯片支持什么协议。

2、其次再考虑如下两个因素:访问速度和主控IO口资源的多少。

IIC

不考虑电源和GND的情况下,两条线,SCL时钟线和SDA数据线,同一个IIC总线上可以挂载2^7-1一共127个设备,不过由于寄生电容的存在,挂载不了这么多,一般不超过8个IIC设备,但也算节省主控IO口资源。

同一条IIC总线上,不同设备靠设备地址区分。

由于只有两条线,共用数据线,所以是半双工通信,通信速度慢。如图:

SPI

不考虑电源和GND的情况下,SPI有四根线,片选信号SS,时钟SCLK,主输入从输出MISO,主输出从输入MOSI。

所以占用主控IO较多,不光要片选的IO口,数据线也有两条。

但与此同时,因为数据线主从一人一条,所以是全双工通信,所以传输速率较快。

代码语言:javascript复制
SCLK: Serial Clock (output from master);
MOSI; Master Output, Slave Input(output from master);
MISO; Master Input, Slave Output(output from slave);
SS: Slave Select (active low, outputfrom master).

如图所示:

SPI协议可以用在主控周围的flash通信中,比如常用的W25Q64或者W25Q128,分别是64K和128K的flash,支持SPI通信。

IIC协议可以用在主控和EEPROM flash通信中,如P24C64E。

曾经遇到一个bug,我们使用主控和EEPROM flash通信(IIC),使用的页写,连续写入128K数据,发现经常丢失数据。后来发现,EEPROM是有响应时间的,连续访问寄存器也有时间限制。不同类型的芯片时间不一样,有的芯片有有的芯片没有。

解决方法:发设备地址选中(初始化)这个器件后,需要给IIC设备一段延时,加一个usleep(500),给它响应时间。另外,页写过程中最好也加几段延时,让它保存数据。比如写入128K数据,除了初始化后的一段延时,再在中间加入四段usleep(500)。

如果喜欢我的文章,欢迎关注、点赞和转发,下面可以留言~~~

0 人点赞