嵌入式串口通信
串口通信是一种计算机硬件设备间的数据传输方法,它允许数据通过单一的通信线路按位(bit)顺序传输。串口通信广泛应用于各种设备,包括计算机、嵌入式系统、移动设备等。
串口通信是一种数据传输方式,它通过一条传输线将数据一位一位地顺序传送。串口通信的特点是通信线路简单,成本低,适用于远距离通信。串口通信通常使用两条线实现双向通信,一条用于发送,一条用于接收。
串行与并行通信介绍
并行通信
并行通信是指多个数据位同时通过多条传输线进行传输的方式。在并行通信中,数据的每一位都有单独的线路,这允许数据以较高的速度传输,因为所有位可以同时被发送和接收。
串行通信
串行通信是指数据以位为单位,按顺序通过单条或少量传输线进行传输的方式。在串行通信中,数据位一个接一个地传输,通常使用起始位、数据位、校验位和停止位来构成一个数据帧
串口通信的电平标准
TTL标准:
RS232标准:
信号线:RS232接口通常使用9针或25针的D-sub连接器。在9针的DB9连接器中,常用的信号线包括TXD(发送数据)、RXD(接收数据)、DTR(数据终端准备)、DSR(数据设备准备)、RTS(请求发送)、CTS(清除发送)、DCD(数据载波检测)和RI(振铃指示)。
采用负逻辑,-15V~-3V代表逻辑"1",+3V~+15V代表逻辑"0"。全双工工作模式
RS485标准:
差分信号,逻辑1:AB两根线压差:+2V ~ +6V,逻辑0:AB两根线压差-6V ~ -2V。
RS422标准
串口通信协议
串口通信协议定义了数据在串行接口上传输的规则和格式。这些协议确保了数据能够被正确地发送和接收。
起始位:数据传输的开始标志,通常是一个逻辑“0”的位。
数据位:实际要传输的数据,可以是5、6、7或8位长,具体取决于通信协议的设置。
奇偶校验位:用于错误检测的可选位。奇校验要求数据位和校验位中“1”的总数为奇数,偶校验则要求为偶数。无校验则不使用校验位。校验方法有奇校验(odd)、偶校验 (even)、0校验、无校验
1.奇校验要求有效数据和校验位中“1"的个数为奇数,比如一个8位长的有效数据为:01101001, 此时总共有4个"1”,为达到奇校验效果,校验位为"1",最后传输的数据将是8位的有效数据加上1 位的校验位总共9位。
2. 偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1"的个数为偶数,比如数据帧: 11001010,此时数据帧"1"的个数为4个,所以偶校验位为"0”。
停止位:数据传输的结束标志,可以是0.5、1、1.5或2位长,具体取决于通信协议的设置。通常是一个或两个逻辑“1”的位。
波特率:串口通信常用的是异步通讯,异步通讯中由于没有时钟信号,所以两个通讯设备之间需要规定好波特率。异步通信依赖于起始位和停止位来同步数据的发送和接收。数据传输的速率,以每秒传输的码元数(bits per second, bps)来衡量。常见的波特率包括300、1200、2400、9600、19200、38400、115200等。
流控制:控制数据流的机制,可以是硬件流控制(如RTS/CTS)或软件流控制(XON/XOFF)。
帧格式:数据的组织方式,包括起始位、数据位、校验位和停止位的组合。
编码方式:数据在传输过程中的表示方式,如NRZ(Non-Return-to-Zero)、RZ(Return-to-Zero)、NRZI(Non-Return-to-Zero Inverted)等。
握手信号:用于协调发送方和接收方的通信,确保数据的正确传输。
UART介绍
同步与异步通信
同步通信
同步通信是指发送方和接收方使用共享时钟信号来同步数据的传输。在同步通信中,数据通常以数据块(通常是字节的倍数)的形式传输,并且每个数据块的开始和结束都有特定的同步信号。
异步通信
异步通信是指发送方和接收方不使用共享时钟信号来同步数据的传输。在异步通信中,每个数据位或字符都是独立传输的,并且每个字符的开始和结束都有特定的起始位和停止位。
数据转换:
UART包含两个主要部分:发送器(Tx)和接收器(Rx)。发送器负责将微处理器的并行数据转换为串行数据流。这个过程包括将数据字节分解为单个位,并按照指定的格式(起始位、数据位、奇偶校验位、停止位)进行传输。接收器则执行相反的操作,它将串行数据流转换回并行数据,供微处理器使用。
数据帧格式:
UART传输的数据帧通常由以下几个部分组成:
停止位:一个或多个逻辑“1”的位,用于标志数据帧的结束。奇偶校验位:可选的位,用于错误检测。如果启用,UART会根据数据位中“1”的个数来确定奇偶校验位的值(奇校验或偶校验)。数据位:紧随起始位之后,通常是5到8位,表示实际传输的数据。起始位:一个逻辑“0”的位,用于标志数据帧的开始。
同步和校验:
接收器在检测到起始位时开始同步,尝试与发送器的波特率匹配,以便正确地采样数据位。如果启用了奇偶校验,UART会在数据位之后添加奇偶校验位,并在接收时进行校验,以检测数据传输中的错误。
状态指示:
UART通常提供一些状态标志,用于指示发送和接收过程中的各种状态,如奇偶错误、帧错误、溢出错误等。这些状态标志可以帮助软件检测和处理通信中的问题。
I.MX6ULL UART介绍
通用异步收发器(UART)通过级联转换器和RS-232电缆或使用外部电路将红外信号转换为电气信号(用于接收)或将电气信号转换为驱动红外LED的信号(用于传输),以提供低速IrDA兼容性。UART支持非归零(NRZ)编码格式、RS485兼容的9位数据格式和IrDA兼容的红外慢速数据速率(SIR)格式。
RZ编码(Return-to-Zero)编码
编码方式:在RZ编码中,逻辑“1”由一个高电平表示,而逻辑“0”则由低电平表示。重要的是,每个位周期结束后,信号都会返回到零电平。
自同步:由于信号在每个位周期结束后都会归零,RZ编码具有自同步的特性。这意味着接收方可以在信号归零后进行采样,从而恢复出时钟信号,而不需要额外的时钟信号线。
带宽效率:RZ编码的每个位周期都需要从非零电平回到零电平,这导致了大量的带宽用于传输“归零”信号,从而降低了数据传输的效率。
信号检测:接收方通过检测信号从零电平到非零电平的变化来识别逻辑“1”,而零电平则表示逻辑“0”。
NRZ(Non-Return-to-Zero)编码
编码方式:在NRZ编码中,逻辑“1”和逻辑“0”分别由恒定的高电平和低电平表示,而不是通过正负电平来区分。RZ编码不同,NRZ编码的信号在表示逻辑“1”或“0”时不会在每个位周期结束后返回到零电平。
自同步:NRZ编码不具备自同步特性,因为信号在逻辑“1”或“0”的整个位周期内保持恒定,没有归零的步骤来提供时钟信息。接收方需要额外的时钟信号来同步数据。
带宽效率:NRZ编码的带宽效率相对较高,因为它不需要额外的带宽来传输“归零”信号。然而,由于信号可能长时间保持在高电平或低电平,NRZ编码可能会引入直流偏移,这在某些传输介质中可能是一个问题。
信号检测:接收方通过检测信号的电平变化来识别逻辑“1”和“0”。如果信号电平从低变高或从高变低,这可能表示逻辑“1”;如果信号电平保持不变,则表示逻辑“0”。
NRZI(Non-Return-to-Zero Inverted)编码
编码方式:NRZI编码与NRZ编码的主要区别在于,NRZI编码使用信号的翻转来表示逻辑“1”,而信号保持不变表示逻辑“0”。这种编码方式在每个位周期的开始处,如果当前位与前一位不同,则信号会翻转。
自同步:NRZI编码提供了一种自同步机制,因为信号的翻转可以被用来恢复时钟信号。这种编码方式允许接收方通过检测信号的翻转来同步数据。
带宽效率:NRZI编码的带宽效率与NRZ编码相似,因为它同样不需要额外的带宽来传输“归零”信号。但是,NRZI编码可能会在信号中引入更多的高频成分,这取决于数据的模式。
信号检测:接收方通过检测信号的翻转来识别逻辑“1”,而信号保持不变则表示逻辑“0”。这种编码方式在USB等高速数据传输中非常常见,因为它提供了一种有效的同步机制。
UART 具有的基本功能:
• High-speed TIA/EIA-232-F compatible, up to 5.0 Mbit/s高速 TIA/EIA-232-F 兼容,最高可达 5.0 Mbit/s• Serial IR interface low-speed, IrDA-compatible (up to 115.2 Kbit/s)低速串行 IR 接口,与 IrDA 兼容(最高可达 115.2 Kbit/s)• 7 or 8 data bits for RS-232 characters, or 9 bit RS-485 formatRS-232 字符支持 7 或 8 位数据位,或 9 位 RS-485 格式• 1 or 2 stop bits1 或 2 个停止位• Programmable parity (even, odd, and no parity)可编程奇偶校验(偶校验、奇校验或无校验)• Hardware flow control support for request to send (RTS_B) and clear to send (CTS_B) signals支持请求发送(RTS_B)和清除发送(CTS_B)信号的硬件流控制• RS-485 driver direction control via CTS_B signal通过 CTS_B 信号控制 RS-485 驱动器方向• Status flags for various flow control and FIFO states各种流控制和 FIFO 状态的标志位• Transmitter FIFO empty interrupt suppression抑制发送 FIFO 空中断的内部时钟启用/禁用• UART internal clocks enable/disableUART内部时钟启用/禁用• Auto baud rate detection (up to 115.2 Kbit/s)自动波特率检测(高达115.2 Kbit/s)运行模式:• Serial RS-232NRZ mode• 9-bit RS-485 mode• IrDA mode
UART的重点寄存器
1.UART Receiver Register 数据接收寄存器(UARTx_URXD)
在 UART x_URXD寄存器中只需要考虑低八位,(RX_DATA)接收的数据,保存接收到的字符
2.UART Transmitter Register 数据发送寄存器(UARTx_UTXD)
在UARTx_UTXD寄存器中只需要考虑低八位,(TX_DATA)传输数据,用于并行传输数据输入
3.UART Control Register 1 控制寄存器(UARTx_UCR1)
UART使能(UART Enable)。用于启用或禁用UART(通用异步收发传输器)。如果在数据传输过程中UARTEN(UART使能)位被取消(negated,这里可能是指被清零或设置为0),发送器(transmitter)将停止发送数据,并将TXD(发送数据)线拉至逻辑1电平。在访问UTXD(发送数据寄存器)和URXD(接收数据寄存器)之前,必须将UARTEN设置为1,否则将返回传输错误
4.UART Control Register 2 (UARTx_UCR2)
TXEN [2] 发送器使能(Transmitter Enable)用于启用或禁用发送器(transmitter)在UART通信中,发送器使能位是一个重要的控制信号,它决定了发送器是否应该发送数据。如果发送器在传输过程中被禁用,它将停止发送当前字符,并开始发送连续的逻辑1,直到发送器再次被使能。此外,当TXEN位被清除时,发送器的FIFO将不再接受新的数据,以防止在发送器被禁用时数据被错误地发送出去。RXEN [1] 接收器使能(Receiver Enable)用于启用或禁用接收器(receiver)SRST [0] 软件复位(Software Reset)通过软件指令触发的复位过程,用于初始化或重置系统 软件复位是一种常见的功能,用于在软件控制下重置硬件状态,确保系统从一个已知的、干净的状态开始运行。通过控制SRST位,软件可以触发并管理复位过程。
STPB [6] 停止位控制(Stop)用于控制字符后发送的停止位(stop bits)的数量 停止位的使用有助于确保字符之间的界限清晰,减少字符间的干扰,并且为接收器提供了额外的时间来准备接收下一个字符。在不同的通信协议中,停止位的数量可能会有所不同,常见的有1个或2个停止位。
WS [5] 字长控制(Word Size)用于控制字符的长度。
PREN [8] 校验使能(Parity Enable)用于启用或禁用发送器中的校验生成器(parity generator)和接收器中的校验检查器(parity checker) 校验功能在串行通信中用于错误检测,通过确保数据位加上校验位的总和(偶校验或奇校验)符合特定的规则,来检测数据在传输过程中是否发生了错误。
IRTS [14] :配置发送器以忽略外部RTS信号的设置。在UART通信中,RTS信号通常用于硬件流控制,以协调发送器和接收器之间的数据传输
5.UART Control Register 3 (UARTx_UCR3)
RXD混合输入已选。为串行和红外输入信号选择合适的输入引脚。
注意:在这个芯片中,uart在MUXED模式下使用,所以这个位(RXDMUXSEL [2])应该总是被设置。
6.UART FIFO Control Register FIFO控制寄存(UARTx_UFCR)
RFDIV [9~7] 参考频率分频器。控制参考时钟的分频比。输入时钟为module_clock。分频器的输出为ref_clk,用于由BRM创建16倍波特率的过采样时钟(brm_clk)
在串行通信中,波特率是数据传输速率的度量,通常以每秒比特数(bps)来表示。通过调整参考频率分频器的分频比,可以影响最终的波特率,从而适应不同的通信需求和标准。16倍波特率的过采样时钟意味着在每个比特周期内,数据被采样16次,这有助于提高信号的质量和抗干扰能力。
7.UART Status Register 2 状态寄存器2 (UARTx_USR2)
TXDC [3] 发送器完成(Transmitter Complete)用于指示发送缓冲区(TxFIFO)和移位寄存器(Shift Register)为空,因此数据传输已经完成。当数据被写入TxFIFO时,TXDC(Transmit Data Complete)会自动清除。
- 自动清除(cleared automatically):当有新数据写入TxFIFO时,TXDC位会自动从1变为0,表示发送器又开始了新的发送过程。
在UART通信中,TXDC是一个重要的状态位,它允许软件检查发送器是否已经完成了所有数据的发送。这对于软件流程控制和同步发送操作非常重要。
RDR[0] 接收数据准备好(Receive Data Ready)。用于指示至少有一个字符已经被接收并写入接收缓冲区(RxFIFO)。如果读取URXD(接收数据)寄存器,并且RxFIFO中只有一个字符,那么RDR(Receive Data Ready)会自动清除。
- 自动清除(automatically cleared):当URXD寄存器被读取,并且RxFIFO中只剩下一个字符时,RDR标志位会自动从1变为0,表示没有更多的数据在RxFIFO中等待读取。
在UART通信中,RDR是一个重要的状态位,它允许软件检查接收器是否已经接收到了新的数据。这对于软件流程控制和同步接收操作非常重要。
8.UART BRM Incremental Register (UARTx_UBIR)和UART BRM Modulator Register (UARTx_UBMR)
Binary Rate Multiplier (BRM)
UART 传输器将根据 16 倍波特率时钟将数据移出。UART 接收器将根据 16 倍波特率时钟对串行数据线进行采样。输入和输出频率比在 UART BRM 增量寄存器 (UBIR) 和 UART BRM MOD 寄存器 (UBMR) 中进行编程。输出频率通过除以输入频率来产生此比率。对于整数除法,将 UBIR 设置为 0x000F 并将除数写入 UBMR 寄存器。将所有写入这些寄存器的值设置为实际值减 1 以避免除数为 0 (未定义) 的情况,并增加寄存器的最大范围。
更新 BRM 寄存器需要同时写入两个寄存器。必须在写入 UBMR 寄存器之前写入 UBIR 寄存器。如果只有其中一个寄存器由软件写入,则 BRM 将继续使用之前的值。
为了确定给定参考频率(reference frequency)和所需波特率(desired baud rate)时,需要将哪些值编程到UART BRM Incremental Register(UBIR)和UART BRM MOD Register(UBMR)中,可以使用以下方程:
示例:
在编程UART时,通过配置UBIR和UBMR寄存器,可以精确地控制UART的波特率,这对于串行通信的同步和数据传输的准确性至关重要。
INC [15~0] 增量分子(Incremental Numerator)用于存储BRM(二进制速率乘数,Binary Rate Multiplier)比率的分子值减一。UBIR(UART BRM Incremental Register)寄存器必须在UBMR(UART BRM MOD Register)寄存器之前更新,以便正确更新波特率。如果软件只写入其中一个寄存器,BRM将忽略这些数据,直到另一个寄存器也被软件写入。不建议使用字节访问(byte accesses)来更新此字段,这样做的行为是未定义的。
MOD[15~0] 调制分母(Modulator Denominator)。用于存储BRM(二进制速率乘数,Binary Rate Multiplier)比率的分母值减一。UBMR(UART BRM MOD Register)寄存器必须在UBIR(UART BRM Incremental Register)寄存器之后更新,以便正确更新波特率。如果软件只写入其中一个寄存器,BRM将忽略这些数据,直到另一个寄存器也被软件写入。不建议使用字节访问(byte accesses)来更新此寄存器,这样做的行为是未定义的。
I.MX6ULL UART编程
原理图:
B50 UART1_TXD
B46 UART1_RXD
IMX6ULL UART操作:编程步骤包括确定引脚、配置引脚为UART功能、设置串口参数(如波特率、数据格式等)以及根据状态寄存器读写数据。
波特率设置:通过设置UART BRM Incremental Register (UBIR) 和 UART BRM MOD Register (UBMR) 来配置波特率。
编程步骤:具体操作包括查看原理图确定引脚、使能UART、配置引脚功能、设置波特率和数据格式等。
编程实践:实际编程中,需要根据IMX6ULL的参考手册和数据手册来编写代码,设置相应的寄存器,以及处理中断和DMA等。
结语:
无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力