串口:
UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发传输器,简称串口。
抓取日志、还有很多的外设也是用串口进行通讯,例如GPS模块、蓝牙模块、电表、锁板等
串口硬件及原理图
串口内部结构
以s3c2440为例,其串口内部结构如下:
串口内部结构
从图可知,串口内部由以下单元组成:
baud-rate generator(波特率生成器), transmitter(发送器), receiver(接收器), control unit(串口控制单元)。
发送器和接收器都包含有FIFO(先入先出缓冲区)和Shifter(移位器)
工作流程:
程序预先通过串口控制单元设置波特率,由波特率发生器产生相应时钟,当cpu给串口发送数据时,程序将数据写入内存,通过interrupt 或者 DMA方式写进FIFO,Transmit Shifter移位器每次从FIFO中取出1bit数据发送出去(TX);反之,串口给cpu发送数据时,Receive Shifter读取RX信号,每次写1bit数据给FIFO,随后通过interrupt 或者 DMA方式写进内存由cpu处理数据
串口根据硬件接入方式
常用的有TTL、RS232、RS485三种
TTL:
TTL示意图
TTL:全双工(逻辑1: 2.4V--5V 逻辑0: 0V--0.5V),传输距离短,用于MCU之间通信,传输距离通常1m左右。
RS232:
232示意图
RS-232:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V),传输距离可达15m左右,常用于MCU与PC间通讯,
由于MCU使用的是TTL电平,PC使用232电平,为此之间需要接入电平转换芯片。
RS485:
485示意图
RS485:半双工、(逻辑1:+2V--+6V 逻辑0: -6V---2V)这里的电平指AB 两线间的电压差,采用AB双绞线差分信号传输,抗干扰强,传输距离远,可达1KM左右。
由于485采用差分传输,因此485是半双工传输,不能同时收发,因此,需要使能DE/RE 达到切换发送/接收,通常有如下两种方式:
GPIO使能:
485原理图接线(一)
如上图所示,GPIO_RX485_CTL输出电平使能DE/RE
硬件使能:
485原理图接线(二)
MAX485真值表
如上图所示,UART_EE_C_TX作为发送端TX,又作为控制脚使能DE/RE,查看MAX485真值表可知,
UART_EE_C_TX为1,DE=RE=0,DI=1,485此时输出为高阻态,接收端AB电平由外部电路即R79对VDDAO分压决定,此时为高电平;
UART_EE_C_TX为0,DE=RE=1,DI=0,485此时AB输出 -6V---2V,接收端AB此时为低电平。
串口通讯协议
串口参数
串口参数
串口参数由波特率、数据位、校验位、停止位、流控组成
数据格式
串口通信数据格式
起始位:上位机发出低电平0并维持一段时间,表示传输开始,下位机接收到0准备开始通讯;
波特率:指每秒最大可发送多少位数据,确定了串口通信周期;
数据位:指一帧数据中有效数据有多少位;校验位:用于对数据的完整性校验,可设置奇校验、偶校验和无校验,比如发送0001 0000这个数据,若采用偶校验,则这个校验位写1,保证有偶数个“1”,反之,采用奇校验则这个校验位写0,保证有奇数个“1”;
停止位:可设置1/1.5/2位,当一帧数据发完后,发出高电平并维持一段时间,表示1帧数据传输结束;
流控:当发送和接收端处理串口数据速度有较大差别时,会造成数据没有被及时读取而丢失,此时可通过软件或硬件的方式来控制数据发送的速度,即为流控。
硬件流控:需要在TX、RX外再额外接入RTS/CTS两条线,当接收端串口控制器FIFO数据快满时,接收端串口控制通过使能RTS告知发送端数据还没处理完,请稍等,当接收端FIFO数据被处理及时时,接收端串口控制器发送CTS告知发送端数据已被处理,你可以接着发送数据了!
软件流控:不需要额外接线,接收端程序通过TX发送数据告知发送端先别发送或接着继续发送,这种方式虽然不需要额外接线,但是这种流控方式本身也占用了串口数据。
串口时序
串口时序
上位机发送端空闲时,其TX维持高电平
上位要发送数据时,将其TX由高电平拉低,并维持1bit时间,下位机RX被中断收到起始信号,准备接收数据,这一位即起始位;
上位机根据设置的数据位个数逐个发送相应个数的数据,下位机在每1/2位的时间采样一次下位机RX数据,即端发送的即数据位的数据;
上位机发送完数据位数据后,上位机串口控制器根据程序设置的校验方式补一位1或补一位0(如果设置了无校验,这一步跳过)并发送给下位机RX;
上位机发送校验位数据后,意味着此帧数据发送完毕,发送高电平并维持设置好的相应停止位数的时间
停止位后上位机被保持高电平,处于空闲状态,直到下一次传输时起始位被拉低。
上图,为1位起始位,8位数据位,偶校验,1位停止位,发送0001 0000数据时序图,有助理解以上内容