芯片通信乱成一锅粥,我差点被绕晕,原来选对总线的秘密
最近我在学嵌入式开发,发现芯片之间聊天有好多种方式,什么I2C、SPI、UART,名字差不多,功能却差很远。我一开始真被绕晕了,后来慢慢搞懂,其实每种总线都有它自己的脾气,选对了能省不少事。
先说I2C吧,它就像一根电话线,可以挂好多设备,大家共用两根线,但每次只能一个人说话。速度不快,适合读个传感器数据或者调个时钟。我拿它连过温湿度模块,挺好用,就是线太长容易出错。
SPI就不一样,它像专线,每个设备单独一根线,速度快很多,全双工,可以同时发和收。我用来读写Flash存储芯片,感觉比I2C快多了。但缺点也很明显,线多,占引脚,而且只能一个主机带一堆从机,不能像I2C那样多个主机抢着说话。
I2S是专门给音频用的,有三根线,左右声道分开传。我玩过一个小音频播放器,就是用I2S把数据送给编解码器,声音还不错。不过它只管传音频,控制还得靠I2C或SPI,所以经常两个一起用。
UART是大家最熟悉的,串口调试全靠它。两根线就能通信,没有时钟,靠约定好的波特率对准。我平时用115200看打印信息,简单可靠。但只能点对点,不能多设备,而且抗干扰一般,距离长了容易乱码。
JTAG是个神奇的东西,它像芯片的“后门”,可以读内部寄存器和内存,调试程序全靠它。我写代码出错了,就连上JTAG看哪里卡住了。不过这东西也有风险,要是被人开了后门,数据就危险了,所以有些产品会锁掉JTAG。
CAN总线很牛,在汽车和工业里用得特别多。它用两根差分线,抗干扰特别强,能传很远。而且多个设备可以同时发消息,通过优先级自动仲裁,谁重要谁先发。我接触过一些工控项目,CAN确实稳定,但协议复杂,需要控制器和收发器,成本也高。
SDIO主要用在Wi-Fi、蓝牙这些模块上,它基于SD卡接口,有四根数据线,速度也挺快。我试过用SDIO连Wi-Fi模块,传输数据比SPI快不少,但驱动写起来麻烦,时序要求严格,一不小心就卡住。
GPIO其实不算严格的总线,就是普通引脚,但可以扩展。比如引脚不够用,就加个I2C扩展芯片,一个变八个。我用来控制LED指示灯和按键,简单粗暴,速度慢点也无所谓。
选总线的时候,别光看参数,要想想你到底要什么。比如要挂很多传感器,就用I2C;要快,就用SPI;要远距离抗干扰,就用CAN;要调试,就用JTAG。没有万能的总线,都是权衡。
我有个朋友做智能家居,他用I2C挂了温湿度、气压和光照传感器,用SPI连了Flash存日志,再用UART连Wi-Fi模块上报数据,一套下来挺顺。不过也有翻车的时候,比如I2C上拉电阻没选对,信号乱跳;或者SPI片选忘了拉高,总线冲突。这些坑踩过就记住了。
现在总线也在进步,比如I3C要替代I2C,速度更快,还能动态分配地址。SPI也在往多线发展,速度快到200MHz。CAN FD升到8Mbps,能传更多数据。UART加了FIFO缓冲,更稳定。GPIO扩展芯片也智能了,可以带中断和PWM。
总之,搞懂总线就像学交朋友,每种性格不同,别硬凑。用对地方,芯片们就能好好聊天,用错了,就只能干瞪眼。我虽然不是什么高手,但把这些经验写下来,也算给自己做个笔记。