[PIC®/AVR® MCU]

使用SPI、I2c、USART协议的一点体会

[复制链接]
27261|25
手机看帖
扫描二维码
随时随地手机跟帖
suncat0504|  楼主 | 2022-1-12 13:36 | 显示全部楼层 |阅读模式
本帖最后由 suncat0504 于 2022-1-12 16:10 编辑

#申请原创#
SPII2cUSART协议,对于单片机电子开发爱好者而言,应该是非常熟悉的东西了。什么时候使用、怎么使用这些协议,我说说受自己的体会哈。
在我的就职经历中,更多的时间是参与纯软件的开发。作为程序员,编程、调试、测试、运用是必不可少的工作内容。程序编好了,是一定要进行测试的。通常的测试手段是加断点、单步调试;输出中间的运行结果等。这些手段都通过屏幕来查看。这些手段有些是可以在调试硬件的开发中使用的,比如嵌入式的linux开发的时候。但有些硬件开发是没有显示设备可用的。这个时候,为了能够看到调试过程、测试结果,我们一般采用USART协议,把数据发给计算机,通过串口助手之类的APP应用,获得调试数据。而大多数MCU都会提供USART
比如以下芯片:
4400061de67aa59eeb.png
这是早期的8031产品,1011脚是USART引脚。
6539861de67b927b28.png
AT89C51,引脚和8031完全一致,1011脚是USART引脚。
5155761de67c7b6972.png
1718脚就是USART引脚。
938561de67d57ff1f.png
STC89C52系列,标注RXDTXDUSART引脚
5996561de67e7108f7.png
ESP32ESP8266模块中的标注RXTXUSART引脚
1764361de67f68fd75.png
所以我觉得,学习硬件,USART协议是必学内容。那么USART协议是什么协议呢?作为电子爱好者,我们知道,按照数据传送的方式,通讯可分为串行通讯与并行通讯。大多数液晶使用的是并行通讯。比如LCD160212864。数据传输时,同时把指令或者数据提供到一个8位的IO引脚上,传送给目标。早期的计算机并口,也是使用并行通讯模式。这个模式的优点是数据同时提供,读一次IO口,就能得到完整的8位数据,数据传输速度快。但缺点也很明显,就是占用口位多。由此,进化出来了使用USART协议的串口。串口,顾名思义,数据串着来,就像我们吃的烤串一样。要发送的8位数据被分解为一个一个Bit位,一次传输。接收方按照发送方的发送顺序,一位一位再组合起来,形成完整的8位数据。当然,实际的串行传输,一般都伴随着协议走。实际的USART协议也让比较复杂,涉及波特率、开始位、数据位、校验位、停止位等,并不是简单地把数据变成串收发。我们通常用的USART协议,至少要有两个IO口线,即发送的TXDTX)、接收的RXDRX),再加上一个地线,有了这三根线,就能实现USART协议、传输数据了。早以前,串口的USART协议中,还有其他一些口线,但是现在已经不常用了。所以就不做介绍了。

使用USART协议的设备,可以组网,理论上最大允许255个设备组网。
7635061de682e96a84.png
除了USART协议,还有SPI协议、IIC协议、CAN总线协议等。
SPI协议是一种高速的,全双工,同步的通信总线协议,使用四根口线完成通讯
(1)MOSI– SPI总线主机输出/ 从机输入
(2)MISO– SPI总线主机输入/ 从机输出
(3)SCLK –时钟信号,由主设备产生
(4)CS – 从设备使能信号,由主设备控制,有的IC此pin脚叫SS。

和USART相比,这个协议不需要设置波特率。数据的传递,是通过MOSI、MISO输入输出。利用SCLK信号的高低电平脉冲信号,在MOSI、MISO取得输入输出数据信号。CS引脚是用来选择通讯设备的。由于CS引脚的设置,利用SPI协议组网时,稍微有些棘手,需要为每一个子设备提供一个CS引脚。
546261de6840c6e2d.png
显然,使用SPI协议组网,是相当不划算。所以应用于单个子设备的场合比较多。

IIC协议,使用的口线也只有两个SCL和SDA,也不需要波特率这种东西的。利用SCL信号的高低电平脉冲信号,在SDA总线上提供数据即可。是不是很简单?简单是简单,我们要记住一条,在数据通讯中,使用的口线越少,就会需要更复杂的通讯协议,来实现设备之间数据的正常收发。和SPI协议的区别上,我的理解是,把MOSI和MISO合并为SDA,省去CS,利用协议在数据中设置子设备地址,实现CS的功能。当然,SPI协议中,使用MOSI和MISO是能同时收发数据的。而IIC的数据传递,在同一个时刻,只能是发和收中的一个,不能同时完成。我们经常用的24xx系列存储芯片,使用的就是IIC协议,非常典型。
7313761de6852f26a1.png
A0-A2是设置器件物理地址,接入VCC或者GND就行,通过组合,可以实现0-8个物理地址000-111。使用IIC协议,因为使用口线少,是很容易组网的。
5185661de68777ba18.png
在嵌入式开发中,具体使用什么协议进行数据通讯,是和MCU有直接关系的。像早期的51系列单片机只提供了标准的串口通讯,而SPI和IIC协议通讯是需要通过标准IO来模拟才能实现。AVR系列的单片机以及后来衍生出来的其它51系列单片机、STM32系列的芯片中,已经集成了SPI和IIC协议类的引脚,可以直接使用,不用模拟了。比如:
2272261de6889e1e8f.png
Mega16中已经提供了支持SPI协议的引脚5-8,同时还提供了IIC协议的引脚22-34(也称TWI接口)。

我们自己的芯片公司------宏晶公司生产的STC单片机中,也有好多同时集成了SPI、I2c、USART协议的芯片,比如STC15系列的,
1370461de689b1cc43.png
SPI、I2c、USART这三个协议的具体内容很多,网上也很容易找到相关的资料,所以在这里我就不多说了。从实际使用角度,USART是最常用的,使用的口线少,实现起来也很容易,所以推荐优先使用USART协议来实现通讯。如果你的硬件中需要额外使用存储芯片,而且口线资源比较紧张,那么就推荐使用IIC协议的存储芯片。具体使用什么协议、接口,要根据自己的需要,以及可选用的芯片型号有关。
最后,总结一下这三个协议的异同点:
共同点:
1、都属于串行通讯的范畴
2、都可以用来组网
区别:
1、电气信号线不同,因而占用的资源不同
2、USART、SPI可以实现全双工,而IIC不能
3、传输速度IIC要比USART、SPI慢

使用特权

评论回复
评论
王栋春 2022-1-12 22:41 回复TA
介绍的比较详细,期待后续补充。 
内政奇才| | 2022-1-13 14:32 | 显示全部楼层
挺详细的

使用特权

评论回复
海洋无限| | 2022-1-19 12:09 | 显示全部楼层
能实现全双工吗

使用特权

评论回复
suncat0504|  楼主 | 2022-1-19 13:28 | 显示全部楼层

IIC总线协议,是没法全双工的。全双工,还是推荐USART协议。

使用特权

评论回复
jiekou001| | 2022-1-29 19:26 | 显示全部楼层
选择哪个都是要看你选择外设的接口是哪个。说实话你一般没的选

使用特权

评论回复
kyzhd| | 2022-1-31 22:19 | 显示全部楼层
一直没搞懂这玩意的软硬

使用特权

评论回复
xzy568| | 2022-2-2 11:03 | 显示全部楼层
跟PC通信还是USART最方便,硬件和软件支持都容易
如果是芯片间的通信,觉得还是SPI最快最方便,协议也是3种之中最简单的

使用特权

评论回复
磨砂| | 2022-2-5 09:39 | 显示全部楼层
这仨我倒是都用过 都还不错

使用特权

评论回复
晓伍| | 2022-2-5 09:51 | 显示全部楼层
最快的是哪种啊

使用特权

评论回复
评论
sxy4517 2022-2-13 09:35 回复TA
SPI协议最快,IIC次之。usart最慢 
caigang13| | 2022-2-5 14:34 | 显示全部楼层
ESP32智能家居上很多

使用特权

评论回复
八层楼| | 2022-2-5 15:47 | 显示全部楼层
哪种最省资源呢

使用特权

评论回复
tpgf| | 2022-2-5 15:51 | 显示全部楼层
肯定有自己的优势所在

使用特权

评论回复
观海| | 2022-2-5 15:56 | 显示全部楼层
iic是不可以双工的

使用特权

评论回复
guanjiaer| | 2022-2-5 16:05 | 显示全部楼层
是不是基本上所有芯片都支持这三种通讯方式呢

使用特权

评论回复
dxccy| | 2022-2-10 11:56 | 显示全部楼层
总结的真不错呀

使用特权

评论回复
yiy| | 2022-2-16 16:34 | 显示全部楼层
其实没啥区别,不是1就是0,高低电平

使用特权

评论回复
zqzqzqzqz| | 2022-2-18 10:58 | 显示全部楼层
12222222222222

使用特权

评论回复
guijial511| | 2022-2-19 12:29 | 显示全部楼层
总结详细

使用特权

评论回复
chenqianqian| | 2022-2-19 13:04 | 显示全部楼层
esp32挺好用啊

使用特权

评论回复
fiekis| | 2022-2-21 16:37 | 显示全部楼层
UART 只是点对点,  而I2C 和SPI 可以1对多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则