UART、RS232/485、IIC协议特点与工作原理介绍

一.UART(串口通讯)

Universal Asynchronous Receiver Transmitter(通用异步收发器),串行异步,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与设备间的通信。

并行通信与串行通信:“多车道”与“单车道”发送数据,并行通信虽然更快,但是串行通信的稳定性更好。

单工通信和双工通信:单工、半双工、全双工可以类比为“广播交流”、“对讲机交流”、“电话交流”。

波特率:波特率用于描述UART通信的数据传输速度,单位bps(bit per second)即每秒传送多少bit的数据。

数据按从低位到高位依次发送,校验位用于检验数据是否正确,一般是奇偶校验。

一些知识点以自问自答的方式体现:

Q:空闲状态是高电平还是低电平?A:空闲状态要求为高电平,这也就是为什么起始位为低电平的原因。

Q:000111与01的图像一样,怎么确定它发送的究竟是多少呢?A:对于数据发送而言,相互规定同样的速度去收发数据,这样每个数据所用的时间就一致,且时间长度已知,即可确定数据。这里提到的速度,就是波特率。

Q:为什么串口通信一次只能发送至多8位的数据?A:因为虽然相互规定了波特率,但是设备间的时间长度无法完全一致,二者计时上的误差累计可能导致数据发送出现问题,因此规定了每发完8位再重新发送新的,这样就可以保证不会出现因为时间不同步导致的数据接收错误。上述提到的二者计时是独立的情况,就是“异步”二字的缘由。

Q:UART通信时硬件连接是怎样的?A:TXD连接对方的RXD,一方发送,一方接收。

二.RS232/RS485

电气层协议,针对恶劣环境做了一定的处理,从编程上来说并不算新的协议。

UART只规定了信号的时序,按照上述时序发送的都可视为串口通信,UART没有定义接口的电气特性;UART通信时一般直接采用处理器使用的电平,也就是TTL电平,但不同的处理器使用的电平经常存在差异,所以不同处理器使用UART通信时一般不能直接相连;UART没有规定不同器件连接时连接器的标准,因此不同器件之间通过UART通信连接很不方便。所以产生了RS232/RS485这种电气层面的协议。

UART一般直接使用TTL信号来表示0和1,但TTL信号抗干扰能力很差,数据在传输过程中很容易出错,并且因为抗干扰能力不行,也很难胜任长距离通信,一般用于一个电路板上不同芯片间的通信。

1.RS232

RS232协议在1970年在美国诞生,是一种用于串行通讯的标准。该标准最开始是25个引脚,后由IBM简化为9引脚,至今,工业上RS232接口一般只使用RXD、TXD、GND三根线;该标准规定逻辑“1”的电平为-15V—  -3V,逻辑“0”的电平为+3V—+15V;该标准提高了通信的抗干扰能力,其传输距离一般可达15m。

前面提到,处理器一般是根据自身的电压产生TTL信号,不符合RS232的标准,这时我们需要添加外部电路对信号的电平进行转换。常见的芯片有MAX232,它可以将TTL信号与RS232信号相互转化。

但RS232也存在一些问题:接口的信号电平值较高,易损坏接口电路的芯片,且无法兼容TTL电平,必须使用电平转换芯片才能与TTL电路连接;传输距离虽然相对TTL有所提高,但也仅有15m;易产生共模干扰,抗噪声干扰性弱;通信速度也较低。

2.RS485

使用RS485标准的通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号,该标准允许连接多个收发器,即具有多站能力,可以利用单一的RS485接口方便地建立起一个设备网络。RS485标准规定采用差分信号进行数据传输,两根线之间的电压差为+2V到+6V表示逻辑“1”,两根线之间的电压差为-2V到-6V之间表示逻辑“0”;使用差分信号能有效地减少噪声信号的干扰,延长通信距离,RS485的通信距离可以达到1500m;RS485接口信号的电平比RS232降低了,所以不易损坏接口电路的芯片,且该电平与TTL兼容,可以方便地与TTL电路连接。

尽管多数处理器中会集成UART控制器,但处理器产生的信号一般都是TTL信号并不是符合RS485标准的信号,所以一般我们还需要在处理器外部添加电路将TTL信号转换成差分信号。常用的芯片有MAX485、MAX481、MAX483等等。

因为采用两线制,数据的收发又都是使用差分信号,故只能采用半双工的方式工作,在使用时要注意。

RS485接口电平值较低,不易损坏接口电路的芯片,且与TTL电平兼容,可方便地与TTL电路连接,通信速度比RS232更快,抗干扰能力也越强,传输距离达到1500m,可实现多节点组网。

三.IIC(嵌入式常用协议)

IIC总线是Philips公司在80年代初推出的一种串行、半双工总线,主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。

IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机,主机有权发起或结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(但同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;IIC总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。

1.通信过程

IIC总线通信过程:1.主机发送起始信号启用总线;2.主机发送一个字节数据指明从机地址和后续字节传送方向(注:这里就对应了前面为什么器件地址是7bit而不是8bit,最后一位用来确定数据方向,0为主到从,1为从到主);3.被寻地址的从机发送应答信号回应主机;4.发送器发送一个字节数据;5.接收器发送应答信号回应发送器;6.循环4和5,直至数据传送完成;7.通信完成后主机发送停止信号释放总线。

IIC总线上传送的数据是广义的,既包括地址,又包括真正的数据;主机在发送起始信号后必须先发送一个字节的数据,该数据高7位为从机地址,最低位表示后续字节的传送方向,“0”表示主机发送数据,“1”表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址进行比较,如果相同,则认为自己被主机寻址,然后根据第8位将自己定为发送器或接收器。

2.IIC总线信号实现

IIC总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送地位,发送器发完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧有9位。发送数据时,数据线上高电平为“1”,低电平为“0”。接收器的应答数据为其数据线上由高电平变低电平的一位作为对接收的8位数据的应答。

IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。

3.典型IIC时序

主机向从机发送数据:主机发送开始信号,从机地址+0,从机应答,主机发送数据,从机应答,直至主机发送完毕或从机不应答,主机发送结束信号退出总线;

从机向主机发送数据:主机发送开始信号,从机地址+1,从机应答,从机发送数据,主机应答,直至主机不再应答,主机发送结束信号退出总线占用。

主机先向从机发送数据,然后从机再向主机发送数据:主机发送开始信号,主机发送从机地址+0,从机应答,主机发数据,从机应答,直至主机发完或从机不应答,主机再次发送开始信号,发送从机地址+1,从机应答,后面参照从机发送数据的情况即可。

下面截取了STM32里面关于IIC的设置和操作函数:

#define CT_IIC_SCL_1 HAL_GPIO_WitePin(GPIO,GPIO_PIN_7,GPIO_PIN_SET) //SCL
#define CT_IIC_SCL_0 HAL_GPIO_WitePin(GPIO,GPIO_PIN_7,GPIO_PIN_RESET) //SCL
#define CT_IIC_SDA_1 HAL_GPIO_WitePin(GPIO,GPIO_PIN_3,GPIO_PIN_SET) //SDA
#define CT_IIC_SDA_0 HAL_GPIO_WitePin(GPIO,GPIO_PIN_3,GPIO_PIN_RESET) //SDA

#define CT_READ_SDA    HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_3) //输入SDA



//IIC所有的操作函数:
void CT_IIC_Init(void);  //初始化IIC的IO口
void CT_IIC_Start(void); //发送IIC开始信号
void CT_IIC_Stop(void);  //发送停止信号
void CT_IIC_Send_Byte(uint8_t txd);  //发送一个字节
uint8_t CT_IIC_Read_Byte(unsigned char ack);  //读取一个字节
uint8_t CT_IIC_Wait_Ack(void);  //等待ack信号
void CT_IIC_Ack(void); //IIC发送ACK信号
void CT_IIC_NAck(void); //IIC不发送ACK信号


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Red pole

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值