IIC、SPI、USART、RS485、RS232、CAN外设通信总结 UART串口通信 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。 串口是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。 UART在发送数据时,将并行数据转换成串行数据来传输; UART在接收数据时,将接收到的串行数据转换成并行数据。 (1)同步串行通信(Synchronous serial communication),I2C、SPI等有时钟信号的协议,都属于这种通信方式。 (2)异步串行通信(Asynchronous serial communication),串口通信,就是这种通信方式。 在设置好数据格式及传输速率之后,UART负责完成数据的串并转换,而信号的传输则由外部驱动电路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485 等,它们定义了接口不同的电气特性,如 RS-232 是单端输入输出,而 RS-422/485为差分输入输出等。 COM口是指针对串行通信协议的一种端口,是PC上异步串行通信口的简写,大部分为9针孔D型。COM口里分RS232,RS422和RS485,传输功能依次递增。 当单片机 1 想给单片机 2 发送数据时,比如发送一个 0xE4 这个数据,用二进制形式表 示就是 0b,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD 首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一 位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把 8 位二进制数字 0b 全部发送完毕。这里就涉及到了一个问题,就是持续的这“一段时间”到底是多久?由此便引入了通信中的一个重要概念——波特率。 波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通 信波特率,必须保持一致,收发双方才能正常实现通信。 在 UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。如下图所示:
IIC通信(半双工) 在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 lIC协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯。而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以 NSS线被拉高作为结束信号。
两线式串行总线,由数据线SDA和时钟SCL构成,可发送或接受数据。 空闲状态:两个信号线均处于高电平。 起始信号:当SCL为高期间, SDA由高到低的跳变。 停止信号:当SCL为高期间, SDA由低到高的跳变。 应答信号:发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节,应答信号为高电平时,规定为非应答位(NACK), 一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。 数据有效性:IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
数据的传送 I2C中心以启动信号START来掌管总线,以停止信号STOP来释放总线;启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号。 写操作
读操作
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应( 或同步控制),即在SCL 串行时钟的配合下, 在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
IIC可以连接多少个外设? 所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。 IIC总线最多可以挂多少个设备由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。 I2C总线理论上挂接127个器件,但是在实际使用中,通常不会超过8个,一般六七个就到头了,I2C总线的驱动能力有限,太多的器件总线驱动不起来。 我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,那么这时候其余的空闲设备可能会受到总线干扰,或者干扰到总线,怎么办呢? 为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。 多主机会产生总线裁决问题,当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线。 SDA仲裁 SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致,是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。 I2C总线设备地址: 设备地址标识外设在总线上的唯一性,每一个外设都有唯一的设备地址,设备地址由原理图和芯片手册共同定义!CPU通过设备地址来访问到I2C总线上的某个外设! IIC主要特点: 通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。 IIC主设备功能:主要产生时钟,产生起始信号和停止信号。 IIC从设备功能:可编程的IIC地址检测,停止位检测。 IIC的一个优点是它支持多主控(multimastering), 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。 用途 主要用于近距离低速的芯片之间的通讯,成百上千米远距离的通讯不行,抗干扰能力差,它的成本低,结构简单。 目前主要用于服务管理。 这包括各个组件状态的通信。 例如,管理员可以查询各个组件以管理系统配置,并了解组件(如电源和系统风扇)的功能状态。 可随时监控内存、硬盘、网络和系统温度等多个参数,提高系统安全性,便于管理。 IIC数据传输速度有标准模式100 kbps、快速模式400 kbps、高速模式3.4 Mbps,其他变种实现了低速模式10 kbps、高速模式1 Mbps。 SPI通信(全双工,高速)4条线通信: 每个时钟周期传输一位数据,因此数据传输的速度由时钟信号的频率决定,SPI 通信始终由主机发起,因为主机配置并生成时钟信号。 传输速度 SPI总线的传输速率可以达到几MByte/s且这不是固定的,一般受到以下几个因素影响: 1)SPI的最大时钟频率(一般情况下,其最大时钟频率为系统时钟频率的1/2); 2)CPU处理SPI数据的能力; 3)输出端驱动能力(PCB所允许的最大信号传输速率)等,其最大速率主要看主从器件控制器的性能。 优点: 比 I2C 更高的数据传输速率(几乎是 I2C 的两倍) 独立的 MISO 和 MOSI 线,因此可以同时发送和接收数据。 MISO主设备数据输入, 从设备数据输出。 MOSI主设备数据输出, 从设备数据输入。 SCLK时钟信号,由主设备产生。 CS从设备片选信号(是否工作),由主设备控制。
SPI工作原理总结 硬件上为4根线。主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。串行移位寄存器通过MOSI信号线将字节传送给从机,也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
1.通讯的起始和停止信号
在图中的标号1处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。 2. 数据有效性 SPI使用MOSI及 MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及 MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行(高位先行)或LSB(低位先行)先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定,一般都会采用上图中的MSR先行(高位先行)模式。 观察图中的2345标号处,MOSI 及 MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及 MISO的数据有效,高电平时表示数据”1”,为低电平时表示数据”0″。在其它时刻,数据无效,MOSI及 MISO为下一次表示数据做准备。 SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。 数据帧格式 串行同行数据传输分为 MSB 和 LSB,也就是最高有效位在前,还是最低有效位在前。(注:最左边的比特位即为最高有效位)。 比如传输一个字节:0x95(1001 0101)。
如果按照MSB(高位在前),则发送顺序:1001 0101。 如果按照LSB(低位在前),则发送顺序反过来:1010 1001。 3. CPOL(时钟极性)/CPHA(时钟相位)及通讯模式 上面讲述的图中的时序只是SPI中的其中一种通讯模式,SPI一共有四种通讯模式,它们的主要区别是∶总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明,在此引入”时钟极性CPOL”和“时钟相位CPHA”的概念。 CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。 SPI_CR寄存器CPOL和CPHA位,能够组合成四种可能的时序关系。 3.1 CPOL就是决定SCLK这个时钟信号线,在没有数据传输的时候的电平状态。 CPOL(时钟极性)=0:空闲状态时,SCLK保持低电平 CPOL=1:空闲状态时,SCLK保持高电平
3.2 CPHA就是决定数据位传输是从第一个时钟(SCLK)边沿开始,还是第二个从二个时钟(SCLK)边沿开始。 CPHA=0:数据从第一个时钟(SLCK)边沿开始采集 CPHA=1:数据从第二个时钟(SLCK)边沿开始采集 3.3 CPOL和CPHA合体就形成了SPI四种模式。 如果CPHA(时钟相位)位置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。 如果CPHA位被清’0’,SCK时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。
SPI使用过程中,项目中遇到的问题 1、SPI1_SCK时钟引脚始终无法输出时钟信号 分析原因:SPI有些引脚对应的是特殊功能的引脚,以STM32F103C8T6为例,比如:PB3(SPI1_SCK)对应的是 JTDO,如果不配置则默认这个引脚的功能就是 JTDO的功能。芯片上电默认该引脚为调试引脚,电平为高电平,导致芯片的SPI1_SCK是无法拉低的。 找到芯片的复用重映射和调试I/O配置寄存器(AFIO_MAPR)的24:26位,可以看到相关解释说明:即通过修改这3位的配置可以关闭调试引脚配置,释放相应的IO口。实际使用中通过开启AFIO辅助时钟,将SWJ_CFG配置为2或者3即可当做普通IO使用,但如想作为SPI1时钟引脚,还需在MAPR寄存器开启SPI1的重映射!
开启SPI1的重映射才会有时钟信号输出!
具体解决方法,引脚重映射配置过程: 1. 使能GPIO时钟(重映射后的IO); 2. 使能功能外设时钟; 3. 使能AFIO时钟。重映射必须使能AFIO时钟: 4. 关闭PB3引脚的调试功能,并配置成为普通的IO引脚。 5. 开启重映射。 注意不建议配置为JTAG-DPDP,关闭SW-DP,那会导致芯片锁死,无法进行程序下载和程序调试!! 如芯片不小心被锁死可以通过以下方法尝试解决: 1、首先将电路板供电断开,包括3.3V电源供电和JLINK调试线供电等所有供电电源关闭; 2、找到芯片的BOOT0引脚,将BOOT0拉高。可以通过导线连接到一个3.3V的引脚,注意不要接入高于3.3V电压,否则烧坏板子! 3、BOOT0拉高以后,保持住这个高电平,打开电源,重新给板子上电。 4、接上JLink或者STLink,下载程序。下载完成以后,断开BOOT0,恢复低电平。 485通信(232通信) 区别:他们所定义的电压、阻抗不同。 RS232接口缺陷: (1)接口的信号电平值较高(+/-12V), 易损坏接口电路的芯片。 (2) 传输速率较低,在异步传输时,波特率为20Kbps。 (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 (4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。 RS485的特点包括(半双工): ①接口电平低,不易损坏芯片。RS485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示,逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS232降低了,不易损坏接口电路的芯片。 ②传输速率高。10米时,RS485的数据最高传输速率可达10Mbps,在1200m时,传输速度可达100Kbps。 ③抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。 ④传输距离远,支持节点多。RS485总线最长可以传输1200m以上(速率≤100Kbps)般 最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。 RS485推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为1200)。
在上面的连接中,如果需要添加匹配电阻,我们一般在总线的起止端加入,也就是主机和设备4上面各加一个120欧姆的匹配电阻。 CAN通信 物理层特征 CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。 显性电平对应逻辑:0,CAN_H和CAN_L之差为2V左右。 隐性电平对应逻辑:1,CAN_H和CAN_L之差为0V。 显性电平具有优先权,只要有一个单输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻来做阻抗匹配,以减少回波发射。 帧种类 CAN通信是以以下5种类型的帧进行的:
其中,数据帧和遥控帧有标准格式和扩展格式两种格式。 标准格式有11个位的标识符(ID),扩展格式有29个位的ID。 数据帧的格式。 ①,帧起始。表示数据帧开始的段。 ②,仲裁段。表示该帧优先级的段。 ③,控制段。表示数据的字节数及保留位的段。 ④,数据段。数据的内容,一帧可发送0~8个字节的数据。 ⑤,CRC段。检查帧的传输错误的段。 ⑥,ACK段。表示确认正常接收的段。 ⑦,帧结束。表示数据帧结束的段。
总线仲裁 规律: 1,总线空闲时,最先发送的单获得发送优先权,一但发送,其他单无法抢占。 2,如果有多个单同时发送,则连续输出显性电平多的单,具有较高优先级。 从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。 一、SPI、I2C、UART通信速率比较: SPI > I2C > UART1、同步通信>异步通信;2、同步通信时必须有一根时钟线连接传输的两端;3、都是串行通信方式,并行通信用于内部存储间的通信,如flash;4、适合传输的距离和通信速率成反比关系; SPI:2数据线、1时钟线、1CS(设备片选线)/串行 同步 通信全双工I2C:1数据线、1时钟线/串行 同步 通信半双工 传输距离比UART短UART:2数据线、 1地线/串行 异步 通信全双工 传输距离比I2C长些 (I2C接口是“器件间”接口,是在一块板子之内传输数据)(UART是 “设备间”接口,更多的是用于两台设备之间传输数据)
二、串行和并行、同步和异步的区别: 串行通信:利用一条数据线将数据一位一位的顺序传送,特点是通信线路简单,成本低,适合于长距离传送 并行通信:利用多条数据线将数据的各位同时传送,特点是传输速度快,适合于短距离传送 异步:在一个字符的传输时间范围内保持同步即可 同步:在数据传输过程中,需要一根时钟线同步,IIC总线,SPI总线 三、I2C接口与串行接口的区别: I2C 两线式串行总线UART 通用串行异步收发器 串口 UART是串行异步通信接口,它包括RS232、RS499、RS423、RS422和RS485等接口规范和 标准规范,即UART是串行异步通信口的总称。 I2C 是带地址的通讯,支持多方通讯,串口就搞不定;两者通讯的机制原理也不同;另外速度上I2C相对会快一些。I2C是一根线是时钟线,一根线是数据线,数据线是双向的,可以接收,也可以发送。 1、I2C接口是”器件间”接口,是在一块板子之内数据的,RS232串行接口是”设备间”接口,更多的是用于两台设备之间传 输数据。 2、从传输数据的距离来说,应该是RS232传输的距离较远。 3、串口是一根线传送数据,一根线接收数据 4、协议不同,波特率不同,串行接口,像单片机,时钟由内部MCU提供,而I2C接口要由器件来决定,不能太快。 5、I2C是同步串行传输,RS232(或称UART,通用异步收发器)是异步串行传输。 6、同步方式必须有一根时钟线连接传输的两端,i2c里的scl就是这根时钟线。因为同步方式不用花费额外的开销对其 数据,所以其传输速率一般比异步方式高。 四、总线接口 UART I2C SPI USB的异同点 1、UART 通用异步串行口,速率不快,可全双工,结构上一般由波特率产生器、UART发送器、UART接收器组成,硬件上两线,一收一发。 2、SPI 高速同步串行口,高速,可全双工,收发独立,同步接口,可实现多个SPI设备互联,硬件4条线。 3、I2C 双向、两线、串行、多主控接口标准。速率不快,半双工,同步接口,具有总线仲裁机制,非常适合器件间近距离经常性数据通信,可实现设备组网。 4、USB 通用串行总线,高速,半双工,由主机、hub、设备组成。设备可以与下级hub相连构成星型结构。 五、串口通信:UART、SPI、I2C区别: 1、UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。 2、SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格,不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部件之间的高速数据通信上面,如大容量存储器等。 3、I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复杂。一般单片机系统里主要用来和24C02等小容量存储器连接。 SPI:高速同步串行口。3~4线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢 UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能: 1、将由计算机内部传送过来的并行数据转换为输出的串行数据流。2、将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。3、在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。4、在输出数据流中加入启停标记,并从接收数据流中删除启停标记。5、处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备)。6、处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备)。7、可以处理计算机与外部串行设备的同步管理问题。8、有一些比较高档的UART还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250。9、现在如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART。 I2C: 能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存。 UART: 单端,远距离传输。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于远程采集设备的数据。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。具体的适用范围就可多了,军用,医疗…到处到能用。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/72580.html