UART

UART


简介

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART),是一种异步收发传输器,是电脑硬件的一部分,将资料由串行通信与并行通信间作传输转换。UART通常用在与其他通讯界面(如EIA RS-232 RS-422 RS-485)的连结上。

特性

  1. 异步:通信双方不需要时钟同步
  2. 双线:只有Tx和Rx两根数据线(不需要Clock线)
  3. 波特率:通信双方需要事前约定好相同的波特率

异步串口通信协议,工作原理是将传输数据的每个字符以串行方式一位接一位的传输。

工作模式

  • UART数据图

uart数据

  • UART协议图

uart时序

协议图中每一位数据的意义:

  1. 起始位:先发出一个逻辑”0”的信号,表示传输开始。
  2. 数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。传送方式LSB/MSB。
  3. 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
  4. 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
  5. 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
  6. 波特率:是衡量数据传送速率的指针。表示每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=1200波特。

UART协议代码分析

开发环境

  • 飞思卡尔FRDM-K64F开发板
  • KDS3.2集成开发环境
  • 飞思卡尔官方KSDK2.0开发库
  • ubuntu16.04操作系统

代码实例

参考KSDK2.0 UART/interrupt例程设计,主程序如下:

UART_GetDefaultConfig(&uart_config);
uart_config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
uart_config.enableRx = true;
uart_config.enableTx = true;
UART_Init(DEMO_UART, &uart_config, CLOCK_GetFreq(DEMO_UART_CLK_SRC));

/* 使能接收溢出中断、接收中断、线路空闲中断 */
UART_EnableInterrupts(DEMO_UART, kUART_RxOverrunInterruptEnable | kUART_RxDataRegFullInterruptEnable | kUART_IdleLineInterruptEnable);

/* Interrupt handler */
void UART4_RX_TX_IRQHandler(void)
{
    uint32_t status = UART_GetStatusFlags(DEMO_UART);

    /* Receive data */
    if (status & (kUART_RxDataRegFullFlag | kUART_RxOverrunFlag)) {
        rx_buffer[receive_data_len] = UART_ReadByte(DEMO_UART);
        receive_data_len++;
    }
    /* UART bus idle */
    if (status & kUART_IdleLineFlag) {
        is_receive_all = true;
        uint8_t data = DEMO_UART->D;
    }
}

问题分析

  1. 在串口接收数据的过程中,如何判断一帧数据?

    frem-k64f单片机的uart模块,在中断选项中有idle(线路空闲)中断,该中断工作方式如下:

    • 当一帧数据发送完成时IDLE Detection功能会从最后一个数据的STOP位开始检测,当检测到连续10或者13个高电平时,即表示没有start位过来了,即判断上一帧数据已经传输完毕,此时UART可以产生IDLE Line中断(即在整个传送过程中只有这一次中断),在此中断中可以置一个数据帧接收完成标志,然后在主程序可以对接收到的数据进行解包处理。

#: idle-uart线路空闲

你可能感兴趣的:(FRDM-K64F)