您当前的位置: 首页 >  ar

风间琉璃•

暂无认证

  • 2浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

阿尔法UART

风间琉璃• 发布时间:2022-02-07 16:39:45 ,浏览量:2

一、串口基础原理

串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。USART 的全 称 是 UniversalSynchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。 相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。 一般 USART 是可以作为 UART使用的,也就是不使用其同步的功能  

1.UART 通信格式

UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线: TXD(发送)、 RXD(接收)和 GND(地线) UART 的通信格式:

空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示数据线空闲,没有数据传输

起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输

数据位: 要传输的数据,数据位数可选择 5~8 位,一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输

奇偶校验位: 这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能

停止位:数据传输完成标志位,停止位的位数可以选择 1 位、 1.5 位或 2 位高电平,一般都 选择 1 位停止位

波特率:UART 数据传输的速率,每秒传输的数据位数,一般选择 9600、19200、 115200  

2.UART电平标准

UART 接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RXD 引脚,这些引脚低电平表示逻辑 0,高电平表示逻辑 1,这个就是 TTL 电平;RS-232 采用差分线, -3~-15V 表示逻辑 1, +3~+15V 表示逻辑 0

 

TTL 接口部分有 VCC、 GND、 RXD、 TXD、RTS 和 CTS。 RTS 和 CTS 基本用不到,使用的时候通过杜邦线和其他模块的 TTL 接口相连即可

RS-232 电平需要 DB9 接口, I.MX6U-ALPHA 开发板上的 COM3(UART3)口就是 RS-232 接 口的

现在基本上都是USB转串口 TTL 芯片,比如 CH340、PL2303 等。通过这些芯片就可以实现串口 TTL 转 USB。I.MX6UALPHA开发板就使用CH340 芯片来完成UART1 和电脑之间的连接,只需要一条USB 线即可  

3.常用寄存器

UARTx_UCR1控制寄存器

 ADBR(bit14):自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使 能自动波特率检测UARTEN(bit0): UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART

UARTx_UCR2控制寄存器

IRTS(bit14):为 0 的时使用 RTS 引脚功能,为 1 的时忽略 RTS 引脚,一般忽略 PREN(bit8):奇偶校验使能位,为 0 的时关闭奇偶校验,为 1 的时使能奇偶校验 PROE(bit7):奇偶校验模式选择位,为 0 的话就使用偶校验,为 1 的话就使能奇校验 STOP(bit6):停止位数量,为 0,1 位停止位,为 1 ,2 位停止位 WS(bit5):数据位长度,为 0 的时选择 7 位数据位,为 1 的时选择 8 位数据位,8位 TXEN(bit2):发送使能位,为 1 的时候打开 UART的发送功能 RXEN(bit1):接收使能位,为 1 的时候打开 UART的接收功能 SRST(bit0):软件复位,为 0 的是时软件复位 UART,为 1 的时候表示复位完成。复位 完成以后此位会自动置 1,表示复位完成。此位只能写 0,写 1 会被忽略掉

注:寄存器 UARTx_UCR3 中的位 RXDMUXSEL(bit2),这个位应该始终为 1  

UARTx_USR2状态寄存器

 TXDC(bit3):发送完成标志位,为 1 的时表明发送缓冲(TxFIFO)和移位寄存器为空,也 就是发送完成,向 TxFIFO 写入数据此位就会自动清零 RDR(bit0):数据接收标志位,为 1 的时表明至少接收到一个数据,从寄存器UARTx_URXD 读取数据接收到的数据以后此位会自动清零

串口时钟配置

UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的 时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0) 位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为 80MHz

UART波特率的设置:由寄 存 器 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR决定

UARTx_UFCR 中要用到的是位 RFDIV(bit9:7),用来设置时钟分频

 Ref Freq:经过分频以后进入 UART 的最终时钟频率。UBMR:寄存器 UARTx_UBMR 中的值。 UBIR:寄存器 UARTx_UBIR 中的值

设置 UART 波特率为 115200,可以设置 RFDIV 为5(0b101),也就是 1 分频,因此 RefFreq=80MHz。设置 UBIR=71, UBMR=3124,可以得到115200,官方也提供了相应的函数  

寄存器 UARTx_URXD 和 UARTx_UTXD,这两个寄存器分别为 UART 的接收和发送数据寄存器,这两个寄存器的低八位为接收到的和要发送的数据。读取寄存器UARTx_URXD 即可获取到接收到的数据,如果要通过 UART 发送数据,直接将数据写入到寄存器 UARTx_UTXD 即可  

二、串口编写

串口1原理图

 

1.设置 UART1 的时钟源

设置 UART 的时钟源为 pll3_80m,设置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位为 0 即可

2.初始化UART1

初始化 UART1 所使用 IO,设置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,设置内 容包括波特率,奇偶校验、停止位、数据位  

void uart_io_init(void)
{
	/* 1、初始化IO复用 
     * UART1_RXD -> UART1_TX_DATA
     * UART1_TXD -> UART1_RX_DATA
	 */
	IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);	/* 复用为UART1_TX */
	IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0);	/* 复用为UART1_RX */

	/* 2、配置UART1_TX_DATA、UART1_RX_DATA的IO属性 
 	*bit 16:0 HYS关闭
 	*bit [15:14]: 00 默认100K下拉
 	*bit [13]: 0 keeper功能
 	*bit [12]: 1 pull/keeper使能
 	*bit [11]: 0 关闭开路输出
 	*bit [7:6]: 10 速度100Mhz
 	*bit [5:3]: 110 驱动能力R0/6
 	*bit [0]: 0 低转换率
 	*/
	IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
	IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);
}

void uart_init(void)
{
	/* 1、初始化串口IO 			*/
	uart_io_init();

	/* 2、初始化UART1  			*/
	uart_disable(UART1);	/* 先关闭UART1 		*/
	uart_softreset(UART1);	/* 软件复位UART1 		*/

	UART1->UCR1 = 0;		/* 先清除UCR1寄存器 */
	
	/*
     * 设置UART的UCR1寄存器,关闭自动波特率
     * bit14: 0 关闭自动波特率检测,我们自己设置波特率
	 */
	UART1->UCR1 &= ~(1            
关注
打赏
1665385461
查看更多评论
0.0457s