CC3220学习笔记---UART(翻译)

这一块相对较难吧,所以参考手册得细看,那就翻译吧。
6.1 概览
CC32xx包含两个通用异步接收/发送( Asynchronous Receivers/Transmitters (UART)),拥有如下特征:
  • 最高速度达3Mbps的可编程波特率发生器。
  • 独立的16×8发送(TX)和接收(RX)FIFO以减少CPU中断服务载荷。
  • FIFO长度可编程,包含1字节深度的操作以提供传统双缓冲接口。(FIFO英文全称个人推测应为First In First Out,也就是队列的特性---先进先出,这里把它当成队列即可
  • 1/8、1/4、1/2、3/4和7/8的FIFO触发级别。
  • 标准异步通过开始、结束、奇偶位。
  • Line-break(不懂是不是断行或换行,还是用原文吧)发生和检测。
  • 完全可编程串行接口特性
——5、6、7或8数据位
——奇、偶、stick或非奇偶位发生或检测
——可发生1或2个停止位
  • RTS和CTS硬件流支持
  • 标准FIFO级别和传输结束中断。
  • 使用微直接内存访问控制器(μDMA)进行高效传输。
——独立的发送和传输通道
——FIFO存在数据时的单独接收请求断言;FIFO级别可编程突发请求断言
——FIFO存在空间时的单独发送请求断言; FIFO级别可编程突发请求断言
  • 由系统时钟产生的波特率时钟。

6.1.1 框图

6.2 功能描述
所有CC32xx UART都执行并行到串行和串行到并行的转换功能。

UART可通过UART Control(UARTCTL)寄存器的TXE和RXE位来配置为发送或接收。发送和接收都在设备重置时可以使用。在任意控制寄存器被编程之前,必须通过清除UARTCTL寄存器的UARTEN位来禁用UART。如果在一个TX或RX操作期间禁用UART,当前传输会在UART停止前完成。

6.2.1  发送/接收逻辑
发送逻辑在从发送FIFO读取数据时执行并行到串行的转换。控制逻辑输出的是串行比特流,它起始于一个开始位,接下来是数据位(LSB在前),奇偶位,以及按照控制寄存器中编程配置的停止位。详细信息参考图6-2。

接收逻辑在检测到一个有效的开始脉冲后接收比特流时执行串行到并行的转换。还执行溢出、奇偶校验、帧错误检查和line-break检测。它们的状态伴随着写入到接收FIFO的数据。


6.2.2  波特率发生
波特率因子为一个22bit数字,包含一个16bit整数部分和一个6bit小数部分。由这两个值构成的数用于波特率发生器以决定位周期。拥有小数部分的波特率发生因子使得UART可产生所有标准波特率。

16bit整数从UART Integer Baud-Rate Divisor (UARTIBRD)寄存器载入,6bit小数部分从 UART Fractional Baud-Rate Divisor (UARTFBRD)寄存器载入。波物率因子( baud-rate divisor (BRD) )与系统时钟的关系如下(其中BRDI是BRD的整数部分,BRDF是小数部分,由小数点分离):

BRD = BRDI + BRDF = UARTSysClk / (ClkDiv * Baud Rate)

其中,UARTSysClk是连接至UART的系统时钟,ClkDiv的值为16(UARTCTL中的HSE置0)或8(HSE置1)。默认情况下,它是15.3.5节所描述的主系统时钟。

6bit小数数字(载入到UARTFBRD寄存器的DIVFRAC位字段)可以通过取波特率除数的小数部分来计算,乘以64,加上0.5的舍入误差:

UARTFBRD[DIVFRAC] = integer(BRDF * 64 + 0.5)

UART产生一个 8×或16×波特率下的整数波特率参考时钟(被称为Baud8及Baud16,取决于UARTCTL寄存器中的HSE位(第5位)设置)。此参考时钟除以8或16以产生发送时钟,并用于接收操作期间的错误检测。

UARTIBRD和UARTFBRD寄存器与 UART Line Control、High Byte (UARTLCRH) 寄存器一起,来自一个内部30bit寄存器。此内部寄存器仅在执行一个UARTLCRH写操作时更新,因此任何对波特率因子的改变必须跟随在对UARTLCRH寄存器写操作之后,以使更改生效。有四个可能的顺序来更新波特率寄存器:
  • 写UARTI BRD,写UARTF BRD,写UARTLCRH
  • 写UARTF BRD,写UARTI BRD,写UARTLCRH
  • 写UARTI BRD,写UARTLCRH
  • 写UARTF BRD,写UARTLCRH

6.2.3  数据传送
接收或发送的数据存储在两个16字节的FIFO中,接收FIFO有一个每字节额外4bit状态信息。对于发送来说,数据写入发送FIFO。如果UART可用,在UARTLCRH寄存器中参数的指示下,将导致一个数据帧开始发送。数据将持续发送直到发送FIFO中没有数据为止。当数据写入发送FIFO(如果FIFO非空)时,UART Flag (UARTFR)寄存器的BUSY位有效,并在数据发送期间一直有效。仅在发送FIFO为空,并且shift寄存器包括停止位中的最后一个字符已经发送的情况下,BUSY位才会无效。UART可被指示为繁忙,甚至在它不能使用的情况下。

当接收器空闲时(UnRx信号持续为1),且数据输入持续走低(已接收到一个起始位),接收计数器运行,并在Baud16的第8周期或Baud8的第4周期开始采样数据,这取决于UARTCTL中的HSE位(第5位)。

如果UnRx信号在Baud16的第8周期或Baud8的第4周期(HSE决定)持续走低,则开始位有效并被认出,否则将被忽略。在有效的起始位被检测出来后,连续的数据位在每个Baud16的第16周期或Baud8的第8周期进行采样(也就是一个位周期之后),此采样按照编程数据字符长度和UARTCTL中的HSE位进行。如果奇偶模式启用,则会检查奇偶位。数据长度物奇偶性在UARTLCRH寄存器中定义。

最终在UnRx信号为高时,一个停止位被确认,否则将会发生一个帧错误。当接收到一个完整的字符,数据及与该字符相关联的任意错误位将存储于接收FIFO。

6.2.3.1  流控制
流控制可由硬件或软件来完成。以下章节描述不同的方法。

6.2.3.1.1  硬件流控制(RTS/CTS)
两个设备间的硬件流控制需要进行以下连线: U1RTS输出连至接收设备的 clear-to-send输入,以及接收设备的request-to-send输出连至U1RTS输入。

U1RTS输入控制发送端。当U1RTS有效时发送端可以只发送数据。U1RTS输出信号指示接收FIFO状态。U1CTS保持有效,直到预设水印水平到达,它指示了接收FIFO已经没有空间存储字符。

UARTCTL寄存器的15位(CTSEN)和14位(RTSEN)指示流控制模式,如表6-1所示:

当RTSEN为1时,软件无法通过 UARTCTL寄存器的request-to-send (RTS)位更改 U1RTS输出值,并且RTS位状态将被忽略。

6.2.3.1.2  软件流控制(Modem Status Interrupts)
两个设备间的软件流控制需要使用中断来指示UART状态。可使用UARTIM寄存器第一位来让 U1CTS和U1RI信号分别产生中断。可通过使用UARTRIS和UARTMIS寄存器来检查源屏蔽中断。这些中断可使用UARTICR寄存器清除。

6.2.3.2  FIFO操作
UART有两个16×8 FIFO,一个用于发送,一个用于接收。两个FIFO都通过UART Data(UARTDR)寄存器访问。UARTDR寄存器读操作返回一个12bit值,它由8个数据位和4个错误标志位组成,而写操作将8bit数据放入发送FIFO。

复位后,两个FIFO都不可用,并被保持为1字节深度寄存器。FIFO可通过设置UARTLCRH寄存器中的FEN位来启用。

FIFO的状态可通过UART Flag(UARTFR)寄存器和UART Receive Status(UARTRSR)寄存器来监测。硬件监测空、满、溢出状况。UARTFR寄存器包含空和满标志位(TXFE、TXFF、RXFE和RXFF位),UARTRSR寄存器通过OE位显示溢出状态。如果禁用FIFO,则空和满标志位则按照1字节深度寄存器状态进行设置。

FIFO产生中断的触发点由UART Interrupt FIFO Level Select (UARTIFLS)寄存器控制。两个FIFO可单独配置以在不同水平上触发中断。可用的配置有 ?、?、?、?和?。例如,如果接收FIFO选择了?选项,UART会在接收到4个字节数据后再产生一个接收中断。复位后,两个FIFO都被配置为在 ?记号处触发中断。

6.2.3.3  中断
当检测到以下条件时,UART会产生中断:
  • 溢出错误
  • Break错误
  • 奇偶校验错误
  • 帧错误
  • 接收超时
  • 发送(当在UARTIFLS寄存器中的TXIFLSEL位定义的条件满足时,或如果UARTCTL中的EOT位置1,当所有发送数据的最后一个位离开串行器时)
  • 接收(当在UARTIFLS寄存器中的RXIFLSEL位定义的条件满足时)

所有中断事件在发送至中断控制器之前都会通过或运算加在一起,所以UART在任意给定时间仅能向控制器产生单个中断请求。软件则可以通过读取UART Masked Interrupt Status(UARTMIS)寄存器以在单个中断服务程序中服务多个中断事件。

中断事件可触发一个控制器级别中断,可通过设置UART Interrupt Mask(UARTIM)寄存器中相应的IM位来进行定义。如果中断不可用,源中断状态总是可以通过UART Raw Interrupt Status (UARTRIS)寄存器可见。

中断总是可以通过将 UART Interrupt Clear (UARTICR)寄存器相应的位置1来进行清除(对于UARTMIS和UARTRIS寄存器都是如此)。

在接收FIFO非空,并且在HSE位被清空的整个32bit周期,或在HSE位被设置的64bit周期内未接收到数据时产生一个接收超时中断。以下两种方式会清除接收超时中断:第一种是通过读取所有数据(或读取holding寄存器)确定FIFO变空时,第二种是在UARTICR寄存器相应位写1。

当以下事件之一发生时,接收中断改变状态:
  • FIFO启用并且接收FIFO到达编程触发电平时,RXRIS位置1。在从接收FIFO读取数据时接收中断被清除,直到它变为小于触发电平或在RXIC位写1清除中断。
  • 如果禁用FIFO(一个位置深度),并且接收数据从而填充了些位置,RXRIS位被设置。接收中断通过执行接收FIFO的单个读取来清除,或通过在RXIC位写1来清除。

当以下事件之一发生时,发送中断改变状态:
  • 如果FIFO启用,并且发送FIFO进程通过编程触发电平,TXRIS位被置1。发送中断是基于电平转换的,因此FIFO必须在编程触发电平之后或无更多发送中断发生时才会写入。发送中断在向发送FIFO中写入数据时清除,直到它大于触发电平,或通过将TXIC位置1清除中断。
  • 如果禁用FIFO(一个位置深度),并且此位置不存在数据,TXRIS位被设置。通过向发送FIFO执行单个写操作业清除它,或将TXIC位置1来清除中断。

6.2.3.4  回环操作
通过设置UARTCTL寄存器的LBE位可将UART设为内部回环模式,以用于诊断或调试工作。在回环模式中,UnTx输出的发送数据会被UnRx输入接收。注意,LBE位应在UART启用前设置。

6.2.3.5  DMA操作
UART提供了一个到 μDMA控制器的接口,并有单独的发送和接收通道。可通过UART DMA Control(UARTDMACTL)寄存器来启动UART的DMA操作。在启用DMA操作时,如果相关联的FIFO可传输数据,UART在接收和发送通道启用一个DMA请求。对于接收通道来说,无论何时,只要在接收FIFO中存在数据,会产生单个传输请求。无论何时,在接收FIFO数据量只要达到或高于UARTIFLS寄存器所配置的FIFO触发水平,都会产生一个突发传输请求。对于发送通道来说,只要发送FIFO中存在至少一个空位,都会产生单个的传输请求。无论何时,只要发送FIFO所包含的字符少于FIFO触发水平,都会产生突发请求。单个和突发传输请求是否由 μDMA控制器自动处理取决于DMA通道是如何配置的。

要为接收通道启用DMA操作,需设置DMA Control(UARTDMACTL)寄存器的RXDMAE位。要为发送通道启用DMA操作,需要设置UARTDMACTL寄存器的TXDMAE位。UART还可被配置为在接收错误发生时让接收通道停止使用DMA。当UARTDMACR寄存器的DMAERR位置1,并且发生了接收错误时,DMA接收请求会自动禁用。可通过清除适当的UART错误中断来清除此错误条件。

如果启用了DMA,当传输完成时, μDMA控制触发一个中断。中断发生在UART中断向量上。因此,如果中断用于UART操作并且DMA启用,UART中断处理程序必须设计为处理 μDMA完成中断。

6.2.4  初始化和配置
启用并初始化UART,需要进行以下步骤:
  1. 使用UART0CLKEN/UART1CLKEN寄存器启用UART模块。
  2. 为适当的引脚设置 GPIO_PAD_CONFIG的CONFMODE位。
本节讨论使用UART模块所需的步骤。此例中,UART时钟假设为80MHz,则所需的UART配置为:
  • 115200波特率
  • 8bit数据长度
  • 一个停止位
  • 无奇偶校验
  • FIFO不可用
  • 无中断
对UART进行编程的第一件事一情应为波特率因子(BRD),因为UARTI BRD和UARTF BRD寄存器必须在UARTLCRH寄存器之前写入。使用方式在6.2.2节中描述,BRD可使用如下公式进行计算:

BRD = 80,000,000 / (16 * 115,200) = 43.410590

这意味着UARTIBRD寄存器的DIVINT字段应设置为十进制的43或0x2B。将载 入UARTFBRD寄存器的值应按照如下公式进行计算:

UARTFBRD[DIVFRAC] = integer(0.410590 * 64 + 0.5) = 26

手握BRD值,使用以下顺序将UART配置写入模块:
  1. 清除UARTCTL寄存器的UARTEN位来禁用UART。
  2. 将BRD的整数部分写入UARTIBRD寄存器。
  3. 将BRD的小数部分写入UARTFBRD寄存器。
  4. 将所需串口参数写入UARTLCRH寄存器(此例为0x0000.0060)。
  5. 可选地,配置 μDMA通道并在UARTDMACTL寄存器启用DMA选项。
  6. 通过设置UARTCTL寄存器的UARTEN位启用UART。

剩下部分讲寄存器,大量图表,就不翻译了。看了这个理论部分,再查寄存器,应该很轻松了。




  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值