本帖最后由 浪矢杂 于 2019-2-21 15:17 编辑
回归山顶洞人时期,简单聊一下IIC SPI UART
假如你在一个有电的山顶洞人时期,但你们若干个部落之间正懊恼如何通讯的呢,这时秀儿他来了。
IIC先解决一些基础问题,定下了一些规则。 1. 他在你们所有部落中架起了两条线,一条叫双向串行数据线(SDA),看名字就是到是用来传数据的,一条串行时钟线(SCL) ,相当你们部落的一个共同时间用来约定通讯时间让你们达到同步性。(一个I2C 总线只使用两条总线线路 ) 2. 这两条线上的部落都有一个通讯地址(相当于现在的门牌号),在通讯前你肯定要说你和哪个部落通电话是吧。不然不就乱套了嘛。(每个连接到总线的设备都有一个独立的地址 ) 3. 由于你们可能多个部落同时通讯,为了防止通讯错乱,就请一个人来做仲裁 ,决定先给哪个部落用通讯线路。(多个主机同时使用总线时,会利用仲裁方式决定由哪个设备占用总线) [size=12.0000pt]4. 还有就是你们说话的速度也要约定,不然你说两分钟我才听一分钟那就不行了。(具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s) 然后就来个通讯示范 file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F4A.tmp.jpg 芬儿在隔壁部落有一个恋爱对象彬儿,今晚芬儿想约彬儿去虚拟,于是。。。 他们得到了仲裁官牙儿的同意可以使用通讯线路 于是芬儿:S(起始信号,接下来就是他的表演时间了)+SLAVE ADDRESS (从机地址,彬儿部落的门牌号)+传输方向的选择位(芬选择要说还是要听) 于是彬儿:(应答ACK):好!你说吧! [从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据] 于是芬儿:(传输数据(DATA) ,数据包的大小为 8 位):今晚。。。。。 于是彬儿:(应答ACK):哦,知道了 。 。 。说多少话都没有限制,但是芬说完一句彬一定要回应,芬才会接着说,不然对方不在听而你还在自言自语。(主机每发送完一个字节数据,都要等待从机的应答信号(ACK),主机才能继续发送数据) 。 。 最后芬儿:(停止传输信号(P)):那今晚B3-4楼等你,再见宝贝!么么哒!(当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据) 写和读(反过来通讯)都差不多 不做过多解释!到现在你应该有一个比较清晰的总体框架了。那下面我就一本正经的补全你脑子里的框架了。(程序你只要单独写好下面几个部分的程序,然后配合使用就可以完成了) 一.起始&停止信号 file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F4B.tmp.jpg
二.发送&接收单个字节(数据有效性 ) file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F4C.tmp.jpg 三.三.应答&非应答 file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F5D.tmp.jpg
到此所有IIC通讯框架完成。通讯按规定来传输即可。
SPI由于IIC是在所有的部落中对照门牌号来找通讯部落的不方便花心的你,而且通讯只能一方说一方听,不方便心急的你,所以SPI来了。
file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F5E.tmp.jpg 这时你应该知道了吧,SPI可以让你边说边听,是不是相对于IIC来说通讯速率提高了。 而且它不用应答了。 下面就在一本正经的讲一下SPI: file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F5F.tmp.jpg SPI和IIC一样有起始和停止信号,数据有效性
1. 起始&停止信号 有点像现在的对讲机按下说话一样。起始信号:NSS 信号线(片选线 S)由高变低,是 SPI 通讯的起始信号。停止信号:NSS 信号由低变高,是 SPI 通讯的停止信号!
2. 数据有效性: 先根据上图模式来说,一个时钟周期传输一位数据,根据上面的图得MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在SCK 的下降沿时被采样。即在 SCK 的下降沿时刻, MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0” ,然后在其他时刻都没有效了,不管你说多少次想她她都听不到。还有SPI每次传输得数据可以是8位或16位,但是IIC就不行,因为IIC规定了8位后要应答一声,但SPI不需要。 3. 通讯模式:我也不知道是啥必要让发明他的人这么无聊。做这么多模式。
①根据SCK在通讯前的电平状态分为CPOL=0(SCK低电平)CPOL=1(SCK低电平) ②根据对MOSI 或 MISO 采样时刻是SCK的奇数还是偶数边沿,分为CPHA=0 (奇数边沿”采样 ),CPHA=1 (“偶数边沿”采样)上面讲的是CPHA=1的模式。 file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F60.tmp.jpg 各种语言代码的实现就根据电平的变化规则来写,难度不大了。 UART(串口异步通讯) 两个村落之间的单独通讯都有了,但是你们开始想做一个来大家开会用的,首领说所有村落都能听到,于是有了串口异步通讯这种方案,一般只使用3条线:TX:(首领和所有部落说话的通道),RX(首领听某个部落发言的通道),GND(你们之间的某种很必要的规定),然后这里需要注意的是首领的TX要和其余部落的RX接上,RX接其余部落的TX,不必要纠结这个线的接法与前面的SPI为啥不一样,总之嘛你们都是嘴对着对方耳朵的,这里只是无聊换了个叫法罢了。 file:///C:\Users\mayn\AppData\Local\Temp\ksohtml\wps4F70.tmp.jpg 由于是开大会嘛,大家就没有必要对门牌号了,接上线的大家都听到的,所以串口通讯不需要地址。说话的格式是:开始信号+话的内容+检验位(检验首领的话有没有传错避免三人成虎)+停止信号 这个就简单多了! 现在你们又有了新的对话的规则; 波特率: (官方话:波特率是衡量数据传送速率的指标=每秒钟通过信道传输的码元数)有点前面两种通讯的SCK一样,用来约定你说话的速度,前面IIC和SPI都是大家有一个共同时钟来做约定,比如一秒说一个字,现在不用拉时钟线了但是你说话的速度得有规定(码元的长度),不然下面就没办法听懂你说啥了(信号解码)。
主体数据内容:现在这个说话有一个不足啊就是你说话每一句有字数限制了(有效
数据的长度常被约定为 5、 6、 7 或 8 位长)
数据校验:就是检验你说的话有没有在传得过程中出错(校验方法有奇校验、偶校验,0校验,1校验以及无校验 )举个例子:“我爷我爸去你家玩+校验位”如果是奇校验得话就要求刚才说话的内容和检验位的“我”(通讯中数“1”)为奇数,所以检验为“我”,“我”才达到奇数 ,偶检验反之。1校验(检验位一直都是“1”)。0校验反之。无校验,没啥可说的。 GND:串口通讯常用有两种标准“RS-232标准”与“TTL 标准”(只是表示“0”“1”的电压不同)因此两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,以两个串口设备之间必须要使用地线连接,即共地来做约定。 UART与USART:前者就是异步串口通讯,后者就是同/异步串口通讯,简单区分就是否需要通讯同步通讯时钟信号来区分。
好了就先聊这三个通讯方式了,我们以开车来讲解一下通讯分类 1. 按数据传送的方式,通讯可分为串行通讯与并行通讯 以高速路小说一下:并行通讯就是很多个车道,车可以并排行驶,串行通讯就是单通道高速收费站每次只能有序的过一辆车。通讯速率快慢可想而知。
2. 根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯 。小说一下:全双工相当于双向车道,半双工相当于乡间小道那样,可以来往但是只通一架车。单工相当单向车道。IIC是半双工,而SPI,UART与USART是全双工。
3. 根据通讯的数据同步方式,又分为同步和异步两种 简单区分就是按是否需要通讯同步通讯时钟信号来区分。就像IIC,SPI都是同步,UART是异步,但是他的老相好USART是同步。
最后再来两句:以上3种通讯方式各有优缺点,但是最基本的原理都一样毕竟它们的世界只有0和1,只是自己的规则不同罢了。
|