串口通信详解
IIC通信详解
SPI通信详解
CAN通信详解
计算机与外界的信息交互称为通信。
基本的通信方式分为两种:
串行通信:所传送的数据各位按顺序一位一位地发送或接受,占用资源少,速度相对较慢。
并行通信:所传送的数据的各个位是同时发送或接受。速度快,占用引脚资源多。
通信的速率:
比特率(bit rate):每秒能传输的二进制位数。
波特率(Baud rate):每秒能传输的码元数(不一定是二进制)。
对于数字信号而言,波特率=比特率。
串行通信的种类:
同步通信:带时钟同步信号传输,通讯双方是受同一个时钟源控制,如I2C、SPI、USART。
异步通信:不带时钟信号同步,不是同一个时钟源,按照一定规则传输,如USART、UART、单总线、CAN。
串行通信的方式:
单工:只允许单方向传输,只需一条信号线
半双工:允许非同时进行的双方向传输,只需一条信号线。
全双工:允许同时进行双方向传输,需要两条信号线。
通信协议是主控MCU与各类驱动器、传感器之间实现信息交互的基本逻辑,搞懂通信协议在机器人的电控系统中占有很重要的地位。在接下来的内容中,我将分别讲解串口、IIC、SPI和CAN通信协议的区别原理以及结合实际一些模块的代码部分。
串口,全称串行接口(Series Interface),是指以串口协议为基础,数据一位一位地按顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信。
根据串口具体实物表现的不同,我们将串口分为UART/USART、RS232、RS485等。其中UART只能异步通信,而USART既能够异步也能同步通信。
不同串口分类遵循相同的协议——串口协议。
它们的本质区别是遵循的通信方式和电平格式不一样:
UART/USART:全双工传输;TTL电平格式,常见以3.3V/5V高电平为1,以0V低电平为0。
RS232:全双工传输;负逻辑电平格式,-5V~-15V为1,5V到+15V为0。
RS485:半双工传输;差分传输电平格式,压差在-2V~-6V之间为1,在2V到6V之间为0。
(RS485通常适用于远距离传输)
以上,不管是串口的何种分类,不管电平格式或者通信方式有多大的不同,它们都遵循统一的一种协议,即串口协议,这也是为什么不管是RS232、RS485或者UART/USART,它们在程序上的写法都是一样的。
空闲状态:TX、RX信号线为“1”高电平。(电压表测USART线为3.3V/5V,测RS232线为-5—-15V)
传输状态:
*数据帧格式:把用于完成数据传输的格式称为数据帧。
在这一章的开头,我讲解过,要想学会MCU控制传感器、电机等,先要掌握MCU的三大基石——时钟、GPIO和中断。现在可以看到MCU三大基石在我们想要利用MCU控制一个模块时的作用。
发送函数中核心在于
USARTx->DR = (Data & (uint16_t)0x01FF)
其中将你要发送的数据Data与十六进制的01FF(二进制为0000 0001 1111 1111)做与运算,是因为我们讲过串口协议发送的数据位最高可以设置为9位。
Example:比如我要发送的数据为0x01(0000 0000 0000 0001),那么与0x01FF做与运算后就为我发送的数据本身。
(如果不与0x01FF与运算,那么当你实际写入一个0x11FF时,就会发生错误,接收方接收不到正确的信息,0x01FF的存在就是防止此类事件的发生)
前提:初始化开启USART外设中断
USART_GetITStatus位将默认为0(RESET),当串口中断发生时,将变为1(SET),所以通常利用此位的变化作为接收数据的标志。
TX(发送)、RX(接收)、VCC(提供传输电源)、GND(保证共地)
很显然,两个模块做通信时,发送方TX接接收方RX。
蓝牙模块通常有六个引脚:TX、RX、VCC、GND、MD0、MD1。
其中MD0和MD1用于蓝牙模块的模式选择,通常蓝牙模块有三种模式:
MD0 MD1
00:通信功能(在使用蓝牙模块进行通信时,将这两个管脚拉低即可)
01:固件升级
10:配置功能
(根据厂商不同,可能不一样)
引脚:TX、RX、VCC、GND
你需要一个RS232转TTL电平格式的模块才能用MCU去控制。如果你买到了一个独立的模块,可以把该模块作为MCU的一部分,也可以把它当成陀螺仪定位模块的一部分。
(比如当成MCU的一部分时,从MCU引出的USART_TX接该模块的USART_TX,把该模块引出的RS232_TX接定位模块RS232_RX)