1、用哪种协议,首先肯定是看这个外设芯片支持什么协议。
2、其次再考虑如下两个因素:访问速度和主控IO口资源的多少。
不考虑电源和GND的情况下,两条线,SCL时钟线和SDA数据线,同一个IIC总线上可以挂载2^7-1一共127个设备,不过由于寄生电容的存在,挂载不了这么多,一般不超过8个IIC设备,但也算节省主控IO口资源。
同一条IIC总线上,不同设备靠设备地址区分。
由于只有两条线,共用数据线,所以是半双工通信,通信速度慢。如图:
不考虑电源和GND的情况下,SPI有四根线,片选信号SS,时钟SCLK,主输入从输出MISO,主输出从输入MOSI。
所以占用主控IO较多,不光要片选的IO口,数据线也有两条。
但与此同时,因为数据线主从一人一条,所以是全双工通信,所以传输速率较快。
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)。
如果喜欢我的文章,欢迎关注、点赞和转发,下面可以留言~~~
本文分享自 嵌入式Linux系统开发 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!