文章目录
参考
C2000 F280049 SCI模块开发串口通讯(源码讲解)_280049 串口传输-优快云博客
Serial Communication Interface (SCI)
文章参考TI的2806x参考手册,以及TI C2000Ware提供的参考代码
1.SCI基础介绍
SCI是一个两线异步串行端口,通常被称为UART。SCI模块支持CPU与使用标准非归零(NRZ)格式的其他异步外围设备之间的数字通信。SCI接收器和发送器各有一个4级深FIFO,用于减少服务开销,并且每个模块都有自己的使能和中断位。两者可以独立工作以实现半双工通信,也可以同时工作以实现全双工通信。
为了保证数据的完整性,SCI会对接收到的数据进行奇偶校验、溢出、帧错误检测。可以通过一个16位的波特率选择寄存器将比特率设置为不同的速度。
SCI模块特点:
-
两个外部引脚
– SCITXD: SCI发送引脚
– SCIRXD: SCI接收引脚
-
波特率可编程为64K不同速率
-
数据格式:
– 一位停止位
– 1到8位的数据位
– 可选奇偶校验
– 1到2位停止位
– 额外的地址区分位 (address bit mode only)
-
四个错误触发标志:奇偶校验、超限、分帧和中断检测、
-
两个唤醒多处理器模式:idle-line and address bit
-
半双工和全双工操作
-
双缓冲接收和发送功能
-
发送器和接收器的操作可以通过带有状态标志的中断驱动或轮询算法来完成
-
发送和接收中断有单独使能位(BRKDT除外)
-
NRZ 格式
增强特点
- 自动波特检测硬件逻辑
- 4级发送/接收FIFO(先入先出)
2. 引脚复用
必须配置GPIO mux寄存器以将该外设连接到设备引脚。为了避免引脚上的故障,必须首先配置GPyMUX位(同时将相应的GPyMUX位保持在默认的零),然后将GPyMUX寄存器写入所需的值。
一些IO功能是由独立于外设的GPIO寄存器设置定义的。应该将GPIO输入限定设置为异步模式,通过设置相应的GPxQSELn寄存器bit11。内部上拉可以在GPyPUD寄存器中配置。
3.多机处理和异步通信模式
SCI有两种多处理器协议, idle-line 多处理器模式和address-bit多处理器模式。这些协议允许在多个处理器之间进行有效的数据传输。
SCI提供通用异步接收/发送器(UART)通信模式,用于与许多流行的外设接口。异步模式需要两条线来连接许多标准设备,如使用RS-232-C格式的终端和打印机。
数据格式
异步通信
SCI异步通信格式采用单线(单向)或双线(双向)通信。在这种模式下,帧由1个起始位、1 ~ 8个数据位、可选的奇偶校验位和1 ~ 2个停止位组成。每个数据位有8个SCICLK周期。
接收方在收到有效的起始位后开始操作。有效的起始位由四个连续的SCICLK内部零周期标识。如果任何位不为零,则处理器重新开始并开始寻找另一个起始位。
对于起始位之后的比特,处理器通过在比特中间进行三个采样来确定比特值。这些采样发生在第四、第五和第六个SCICLK周期,位值的确定基于多数(三分之二)。图13-7说明了异步通信的格式,其中一个开始位显示了多数投票的位置。
由于接收器将自身与帧同步,因此外部发送和接收设备不必使用同步串行时钟。时钟可以在本地生成。
接收器信号
注:
-
标志位RXENA (SCICTL1, 0位)拉高,使能接收器。
-
数据到达SCIRXD引脚,检测到起始位。
-
数据从RXSHF转移到接收缓冲区寄存器(SCIRXBUF);请求中断。标记位RXRDY (SCIRXST,位6)变高表示接收到一个新字符。
-
程序读取SCIRXBUF;flag RXRDY自动清除。
-
下一个字节的数据到达SCIRXD引脚;检测起始位,然后清除。
-
数据继续在RXSHF中组装,但不传输到接收器缓冲区寄存器。
发送信号
每个字符3bit
注:
- 位TXENA(SCICTL1,位1)置为高电平,使发送器可以发送数据。
- SCITXBUF被写入;然后,(1)发射机不再空,(2)TXRDY变低。
- SCI 将数据传输到移位寄存器 (TXSHF)。发送器准备好传输第二个字符 (TXRDY 变为高电平),并请求中断 (中断使能的话,SCICTL2 寄存器的位 0 (TX INT ENA)必须设置)。
- 在TXRDY变为高电平之后,向SCITXBUF写入第二个字符。(在第二个字符写入SCITXBUF之后,TXRDY再次变为低电平。)
- 第一个字符的传输完成。第二个字符向TXSHF移位寄存器的传输开始。
- 位TXENA变低以关闭发射器;SCI完成当前字符的传输。
- 第二个字符传输完成;发送器已空,准备传输新字符。
4.SCI中断
SCI接收和发送可以中断控制。SCICTL2寄存器有一个标志位(TXRDY),它表示活动的中断条件,SCIRXST寄存器有两个中断标志位(RXRDY和BRKDT),加上RX ERROR中断标志,它是FE、OE、BRKDT和PE条件的逻辑或。发送器和接收器具有单独的中断启用位。如果不启用,则不会断言中断;但是,条件标志保持活跃状态,反映传输和接收状态。SCI对于接收端和发送端具有独立的外围中断向量。外围中断请求可以是高优先级的,也可以是低优先级的。这是由外设输出到PIE控制器的优先级位表示的。当RX和TX中断请求处于相同的优先级时,接收端总是比发送端具有更高的优先级,从而减少了接收端溢出的可能性。
如果设置了RX/BK INT ENA位(SCICTL2,位1),则当发生以下事件之一时,断言接收外设中断请求:
-
SCI接收到一个完整的帧,并将RXSHF寄存器中的数据传输到SCIRXBUF寄存器中。这个动作设置RXRDY标志(SCIRXST,位6)并启动中断。
-
发生中断检测条件(SCIRXD在缺少停止位后的9.625位周期内处于低电平)。这个动作设置BRKDT标志位(SCIRXST,第5位)并启动中断。
如果设置了TX INT ENA位(SCICTL2.0),则每当SCITXBUF寄存器中的数据被转移到TXSHF寄存器时,就断言发送器外设中断请求,表明CPU可以写入SCITXBUF;这个动作设置TXRDY标志位(SCICTL2,位7)并启动中断。
由RXRDY和BRKDT位引起的中断产生由RX/BK INT ENA位控制(SCICTL2, bit 1).
RX ERROR位引起的中断由RX ERR INT ENA位(SCICTL1, bit 6)控制。
5.SCI波特率
_BRR =(Uint16)((SCI_LSPCLK/(baud * 8))-1);
SciaRegs.SCIHBAUD.bit.BAUD=_BRR>>8;
SciaRegs.SCILBAUD.bit.BAUD=(_BRR&0XFF);
上面程序里的baud就是设定波特率。
6.SCI增强特性
6.1 FIFO
下面的步骤解释先进先出的特点,并帮助编程SCI与先进先出。
- 复位。在复位时,SCI以标准SCI模式上电,FIFO功能被禁用。FIFO寄存器SCIFFTX、SCIFFRX和SCIFFCT保持不活动状态。
- Standard SCI。标准SCI模式将在TXINT/RXINT中断作为模块的中断源时正常工作。
- FIFO enable。FIFO模式通过在SCIFFTX寄存器中设置SCIFFEN位来启用。SCIRST可以在其操作的任何阶段重置FIFO模式。
- 使能寄存器。所有的SCI寄存器和SCI FIFO寄存器(SCIFFTX, SCIFFRX和SCIFFCT)都是活跃的。
- 中断。FIFO模式有两个中断;一个用于发送FIFO, TXINT,一个用于接收FIFO, RXINT。RXINT是常见的中断SCI FIFO接收、接收错误、接收FIFO溢出等条件。标准SCI的TXINT将被禁用,该中断将作为SCI传输FIFO中断。
- 缓冲区。发送和接收缓冲区由两个4级fifo补充。发送FIFO寄存器是8位宽,接收FIFO寄存器是10位宽。标准SCI的发送缓冲区(SCITXBUF)在发送FIFO和移位寄存器之前起转换缓冲区的作用。SCITXBUF被加载到FIFO(当启用FIFO时)或TXSHF(当禁用FIFO时)。当启用FIFO时,只有在移位寄存器的最后一位被移出后,SCITXBUF才会加载到FIFO中,因此SCITXBUF不应被视为额外的缓冲区级别。启用FIFO后,在可选延迟值(SCIFFCT)之后直接从FIFO(而不是TXBUF)加载TXSHF。当SCI启用FIFO模式时,写入SCI- txfifo的字符将排队进入SCI- txfifo, SCI- rxfifo接收的字符可以使用SCIRXBUF读取。
- 延迟转移。FIFO中的字被传输到发送移位寄存器的速率是可编程的。SCIFFCT寄存器位(7−0)FFTXDLY7−FFTXDLY0定义字传输之间的延时。延迟定义为SCI波特时钟周期数。8位寄存器可以定义0波特时钟周期的最小延迟和256波特时钟周期的最大延迟。在零延迟的情况下,SCI模块可以在FIFO字前后移位的情况下以连续模式传输数据。在256时钟延迟下,SCI模块可以以最大延迟模式传输数据,FIFO字在每个字之间以256波特时钟延迟移出。可编程延迟便于与慢速SCI/UARTs通信,CPU干预少。
- FIFO状态位。发送和接收fifo都有状态位TXFFST或RXFFST(位12−8),定义在任何时候fifo中可用的字数。当这些位被清除为0时,发送FIFO复位位TXFIFO和接收复位位RXFIFO将FIFO指针重置为零。一旦这些位被设置为1,fifo就从开始恢复操作。
- 可编程中断级别。发送和接收FIFO都可以产生CPU中断。当发送FIFO状态位TXFFST(位12−8)匹配(小于或等于)中断触发电平位TXFFIL(位4−0)时,就会产生中断触发器。这为SCI的发送和接收部分提供了一个可编程中断触发器。接收FIFO的缺省值为0x11111,发送FIFO的缺省值为0x00000。
7.SCI寄存器
SCICCR
SCI通讯控制寄存器
bit | 简介 | |
---|---|---|
7 | STOPBIS | 停止位 该位指定传输的停止位的数目。 0h (R/W) =一个停止位 1h (R/W) =两个停止位 |
6 | PARITY | SCI奇偶选择 如果设置了奇偶校验位(SCICCR,第5位),奇偶校验位(第6位)表示奇偶校验(发送和接收字符中均为1的奇数位或偶数位)。 0h (R/W) =奇偶校验 1h (R/W) =偶奇偶校验 |
5 | PARITYENA | 启用SCI奇偶校验。 该位启用或禁用奇偶校验功能。如果SCI处于地址位多处理器模式(使用该寄存器的第3位设置),则地址位包含在奇偶校验计算中(如果奇偶校验已启用)。 对于少于8位的字符,应在奇偶校验计算中屏蔽剩余未使用的位。 0h (R/W) =禁用奇偶校验。在发送或接收过程中不产生奇偶校验位 1h (R/W) =奇偶校验开启 |
4 | LOOPBKENA | 使能回环测试模式。 该位启用回环测试模式,其中Tx引脚内部连接到Rx引脚。 0h (R/W) = Loop Back测试模式关闭 1h (R/W) = Loop Back测试模式使能 |
3 | ADDRIDLE_MODE | SCI多处理器模式控制位。 这个位选择一个多处理器协议。多处理器通信不同于其他通信模式,因为它使用SLEEP和TXWAKE函数(位SCICTL1,位2和SCICTL1,位3)。空闲线路模式通常用于正常通信,因为地址位模式在帧中增加了一个额外的位, 而空闲线路模式不增加这个额外的位,并且与RS-232类型的通信兼容。 0h (R/W) =选择的空线模式协议 1h (R/W) =地址位模式协议 |
2-0 | SCICHAR | 字符长度控制位2-0。 这些位选择SCI字符长度从1位到8位。 少于8位的字符在SCIRXBUF和SCIRXEMU中是右对齐的,在SCIRXBUF中用前导零填充。SCITXBUF不需要用前导零填充 0h (R/W) = SCICHAR_LENGTH_1 1h (R/W) = SCICHAR_LENGTH_2 2h (R/W) = SCICHAR_LENGTH_3 … 7h (R/W) = SCICHAR_LENGTH_8 |
SCICTL1
SCI控制寄存器1
bit | 简介 | |
---|---|---|
6 | RXERRINTENA | 使能SCI接收错误中断。 如果由于发生错误而设置RX ERROR位(SCIRXST,位7),则设置此位可以启用中断。 0h (R/W) =关闭接收错误中断 1h (R/W) =接收错误中断使能 |
5 | SWRESET | SCI软件复位(给低激活)。 写入0到这个位将初始化SCI状态机和操作标志(寄存器SCICTL2和SCIRXST)到复位条件。SW复位不影响任何配置位。 所有受影响的逻辑都保持在指定的复位状态,直到1被写入 SWRESET(复位后的位值显示在本节中的每个寄存器图下面)。因此,在系统复位后,通过向该位写入1来重新启用SCI。在接收器中断检测后清除此位(BRKDT标志,SCIRXST位,5位)。 影响的标志位如下: 1 TXRDY SCICTL2, bit 7 1 TX EMPTY SCICTL2, bit 6 0 RXWAKE SCIRXST, bit 1 0 PE SCIRXST, bit 2 0 OE SCIRXST, bit 3 0 FE SCIRXST, bit 4 0 BRKDT SCIRXST, bit 5 0 RXRDY SCIRXST, bit 6 0 RX ERROR SCIRXST, bit 7 0h (R/W) =写入0将SCI状态机和操作标志(寄存器SCICTL2和SCIRXST)初始化为复位状态。 1h (R/W) =系统复位后,通过在该位上写1重新使能SCI。 |
4 | RESERVED(保留) | RESERVED(保留) |
3 | TXWAKE | SCI发送唤醒方式选择。 TXWAKE位控制数据传输特性的选择,这取决于在ADDR/IDLE mode位(SCICCR,位3)指定的传输模式(空闲线路或地址位)。 0h (R/W) =未选择发射特性。idle-line模式:写1到TXWAKE,写数据到SCITXBUF寄存器,产生11个数据位的空闲周期。地址位方式:先写1到TXWAKE,再写数据到SCITXBUF寄存器,设置该帧的地址位为1 1h (R/W) =选择的传输特性取决于模式,空闲线或地址位:TXWAKE不是由SW RESET位(SCICTL1,位5)清除,它是由系统复位或TXWAKE转移到WUT标志清除。 |
2 | SLEEP | |
1 | TXENA | 发送使能,给1, 0不使能 |
0 | RXENA | 接收使能,给1, 0不使能 |
SCICTL2
SCI控制寄存器2
bit | 简介 | |
---|---|---|
7 | TXRDY | Transmitter buffer register ready flag. 当设置时,这个位表示发送数据缓冲寄存器,SCITXBUF,已准备好接收另一个字符。将数据写入SCITXBUF自动清除该位。当设置时,如果中断使能位TX INT ENA,则该标志断言发送器中断请求(SCICTL2.0),也设置。使能SW,使能TXRDY为1 SWRESET位(SCICTL1.5)或由系统复位。 0h (R/W) = SCITXBUF已满 1h (R/W) = SCITXBUF已准备好接收下一个字符 |
6 | TXEMPTY | Transmitter empty flag. 这个标志的值表示发送器缓冲寄存器(SCITXBUF)和移位寄存器(TXSHF)的内容。 活跃的SWRESET (SCICTL1.5),或系统重置,设置这个位。这个位不会引起中断请求。 0h (R/W) =发送器缓冲区或移位寄存器或两者都加载了数据 1h (R/W) =发射机缓冲区和移位寄存器均为空 |
5-2 | RESERVED | RESERVED |
1 | RXBKINTENA | 启用接收缓冲区/中断中断。 这个位控制由RXRDY标志或BRKDT标志(位SCIRXST.6和.5)被设置引起的中断请求。然而,RX/BK INT ENA不阻止这些标志的设置。 0h (R/W) =禁用RXRDY/BRKDT中断 1h (R/W) =使能RXRDY/BRKDT中断 |
0 | TXINTENA | 使能SCITTXBUF寄存器中断。 这个位控制由设置引起的中断请求TXRDY标志位(SCICTL2.7)。然而,这并不能阻止TXRDY标志不被设置(这表明SCITXBUF准备接收另一个字符)。 0 Disable TXRDY interrupt 1 Enable TXRDY interrupt. 在非fifo模式下,必须写入假(或有效)数据发生第一个传输中断的SCITXBUF。当您第一次启用传输中断时,以及当您重新启用(禁用然后启用)传输中断时,都会出现这种情况。 如果在向SCITXBUF写入数据后启用TXINTENA,则不会产生中断。 |
SCIRXST
SCI接收状态寄存器
bit | 简介 | |
---|---|---|
7 | RXERROR | SCI接收器错误标志。 RX ERROR标志表示接收器状态寄存器中的一个错误标志被设置。RX ERROR是中断检测、帧错误、溢出和奇偶校验错误使能标志的逻辑或(位5-2:BRKDT, FE, OE和PE)。 如果RX ERR INT ENA位,则该位上的1将导致中断(SCICTL1.6)已设置。这个位可以用于中断服务程序期间的快速错误状态检查。此错误标志不能直接清除,它可以通过活动的SW RESET或系统重置来清除。 0h (R/W) = No error flags set 1h (R/W) = Error flag(s) set |
6 | RXRDY | SCI接收器就绪标志。 当一个新字符准备好从scicxbuf寄存器中读取时,接收器设置这个位,如果RX/BK INT ENA位(SCICTL2.1)是1,则产生接收器中断。RXRDY被清除通过读取SCIRXBUF寄存器、使能SWRESET或者通过系统复位 0h (R/W) = SCIRXBUF中没有新字符 1h (R/W) =准备从SCIRXBUF中读取的字符 |
5 | BRKDT | break检测标志。 当break条件发生时,SCI将该位置高。当SCI接收器数据线(SCIRXD)连续保持低电平至少10位时,从丢失第一个停止位开始,就会发生break。如果RX/BK INT ENA位为1,则中断的发生会导致接收器中断,但不会导致接收器缓冲区被加载。即使接收器SLEEP位设置为1,也会发生BRKDT中断。通过的使能SW RESET或系统复位清除BRKDT。在检测到中断后,它不会通过接收字符来清除。 0h (R/W) = No break condition 1h (R/W) = Break condition occurred |
4 | FE | SCI帧错误标志。 当没有找到期望的停止位时,SCI设置该位。只检查第一个停止位。缺少停止位表明与起始位的同步已经丢失,并且该字符被错误地帧。FE位通过清除SWRESET或由系统复位。 0h (R/W) = No framing error detected 1h (R/W) = Framing error detected |
3 | OE | 覆写错误标志。 当一个字符被转移到寄存器SCIRXEMU和SCIRXBUF在前一个字符被CPU或DMAC完全读取之前,SCI设置这个位。前一个字符被覆盖并丢失。OE标志位通过使能的SWRESET或系统复位来清除。 0h (R/W) = 没有覆写错误发生 1h (R/W) =覆写错误发生 |
2 | PE | 校验错误标志。 当接收到的字符的1个数与其奇偶校验位不匹配时,设置此标志位。地址位包含在计算中。如果不启用奇偶校验产生和检测,则PE标志被禁用,读取为0。PE位通过SWREST或系统复位来清除。 0h (R/W) =无奇偶校验错误或奇偶校验已禁用 1h (R/W) =检测到奇偶校验错误 |
1 | RXWAKE | 接收唤醒检测标志位 0h (R/W) =未检测到接收机唤醒条件 1h (R/W) =该位值为1表示检测到接收端唤醒状态。在地址位多处理器模式下(SCICCR.3 = 1), RXWAKE反映SCIRXBUF中包含的字符的地址位的值。在idle-line多处理器模式下,如果检测到SCIRXD数据线为空闲,则设置RXWAKE。 RXWAKE是一个只读标志,可以通过以下方式清除: —将地址字节后的第一个字节转换为SCIRXBUF(仅在非fifo模式下) —SCIRXBUF的读取 -激活的SW RESET -系统复位 |
0 | RESERVED | RESERVED |
SCIRXEMU
正常的SCI数据接收操作是从SCIRXBUF寄存器读取接收到的数据。SCIRXEMU寄存器主要在调试连接期间使用,因为它可以连续读取接收到的数据以进行屏幕更新,而无需清除RXRDY标志。系统复位清除SCIRXEMU。这个寄存器应该在CCS监视窗口中使用,以查看SCIRXBUF寄存器的内容。SCIRXEMU不是物理实现的,它只是一个不同的地址位置来访问SCIRXBUF寄存器而不清除RXRDY标志。
7-0 为Receive emulation buffer data
SCIRXBUF
当接收到的当前数据从RXSHF转移到接收缓冲区时,RXRDY标志位被设置,数据准备被读取。如果RXBKINTENA位(SCICTL2.1)被设置,这种移位也会导致中断。当读取SCIRXBUF,重置RXRDY标志。通过系统复位清除SCIRXBUF。
bit | 简介 | |
---|---|---|
15 | SCIFFFE | FIFO帧错误标志位(仅适用于FIFO已启用) 0h (R/W) =接收到7-0位的字符时没有帧错误。这个位与FIFO顶部的字符相关联。 1h (R/W) =接收7-0位字符时发生帧错误。这个位与FIFO顶部的字符相关联。 |
14 | SCIFFPE | SCI FIFO奇偶校验错误标志位(仅当FIFO启用时适用) 0h (R/W) =在接收到7-0位的字符时没有奇偶校验错误。 1h (R/W) =在接收7-0位字符时发生奇偶校验错误。 |
13-8 | RESERVED | RESERVED |
7-0 | SAR | 接收字符位 |
SCITXBUF
要传输的数据位写入SCITXBUF。这些位必须右对齐,因为对于长度小于8位的字符,最左边的位将被忽略。将数据从这个寄存器传输到TXSHF发送器移位寄存器设置TXRDY标志(SCICTL2.7),表明SCITXBUF准备接收另一组数据。如果设置了位TXINTENA (SCICTL2.0),该数据传输也会导致中断。
7-0位 为数据位
SCIFFTX
bit | 简介 | |
---|---|---|
15 | SCIRST | 0 写0,复位SCI发送和接收通道。SCI FIFO寄存器配置位将保持原样。 1 SCI FIFO可以恢复发送或接收。即使自动波特逻辑工作,SCIRST也应该为1。 |
14 | SCIFFENA | FIFO 使能 0h (R/W) = SCI FIFO enhancements are disabled 1h (R/W) = SCI FIFO enhancements are enabled |
13 | TXFIFORESET | 发送FIFO复位 0h (R/W) =将FIFO指针复位为零并保持复位 1h (R/W) =重新使能发送FIFO操作 |
12-8 | TXFFST | FIFO status 0h (R/W) = Transmit FIFO is empty 1h (R/W) = Transmit FIFO has 1 words 2h (R/W) = Transmit FIFO has 2 words 3h (R/W) = Transmit FIFO has 3 words 4h (R/W) = Transmit FIFO has 4 words |
7 | TXFFINT | FIFO发送中断 0h (R/W) = TXFIFO中断未发生,只读位 1h (R/W) = TXFIFO中断已经发生,只读位 |
6 | TXFFINTCLR | 清除发送标志位 0h (R/W) =写0对txfift标志位没有影响,bit读回0 1h (R/W) =写1清除7位的TXFFINT标志 |
5 | TXFFIENA | FIFO发送中断使能 0h (R/W) =关闭TX FIFO中断 1h (R/W) =使能TX FIFO中断。当发送FIFO状态(TXFFST)位匹配(等于或小于)中断触发位TXFFIL (bits 4-0)时,该中断被触发。 |
4-0 | TXFFIL | FIFO发送中断级别 当TXFFST<=TXFFIL时产生中断 复位后,这些位的默认值为00000b。 |
SCIFFRX
SCIFFTX控制接收FIFO中断、接收FIFO复位和接收FIFO溢出状态。
bit | 简介 | |
---|---|---|
15 | RXFFOVF | 接收FIFO溢出。 这将作为标志,但不能自己产生中断。 当接收中断处于活动状态时,将发生这种情况。接收中断应满足此标志条件。 0h (R/W) =接收FIFO未溢出,只读位 1h (R/W) =接收FIFO溢出,只读位。超过FIFO接收到16个字,第一个字丢失 |
14 | RXFFOVRCLR | RXFFOVF清除 0h (R/W) =写0对RXFFOVF标志位没有影响,bit读回0 1h (R/W) =写1清除第15位的RXFFOVF标志 |
13 | RXFIFORESET | 接收FIFO复位 0h (R/W) =写0将FIFO指针复位为零,并保持复位。 1h (R/W) =重新启用接收FIFO操作 |
12-8 | RXFFST | FIFO状态 0h (R/W) =接收FIFO为空 1h (R/W) =接收FIFO有1个字 2h (R/W) =接收FIFO有2个字 3h (R/W) =接收FIFO有3个字 4h (R/W) =接收FIFO有4个字 |
7 | RXFFINT | FIFO接收中断 0h (R/W) = RXFIFO中断未发生,只读位 1h (R/W) = RXFIFO中断已经发生,只读位 |
6 | RXFFINTCLR | 接收中断清除 0h (R/W) = Write 0对 RXFIFINT标志位没有影响。Bit读回一个0。 1h (R/W) =写1清除第7位的RXFFINT标志 |
5 | RXFFIENA | FIFO接收中断使能 0h (R/W) = 接收FIFO中断关闭 1h (R/W) = RX使能FIFO中断。当接收FIFO状态(RXFFST)位匹配(等于或大于)中断触发位RXFFIL (bits 4-0)时,该中断被触发。 |
4-0 | RXFFIL | FIFO接收中断等级 当RXFFST大于或等于RXFFIL产生FIFO接收中断 复位后,这些位的缺省值为11111b。 |
SCIFFCT
SCIFFCT包含自动波特检测的状态,清除自动波特标志,并校准 A-detect位
bit | 简介 | |
---|---|---|
15 | ABD | 自动波特率检测位 0h (R/W) =未完成自动波特检测。“A”,“A”字符未成功接收。 1h (R/W) =自动波特硬件在SCI接收寄存器上检测到“A”或“A”字符。自动检测完成。 |
14 | ABDCLR | ABD清除位 0h (R/W) =写0对ABD标志位没有影响。Bit读回一个0。 1h (R/W) =写1清除第15位的ABD标志。 |
13 | CDC | CDC 校验 A-detect位 0h (R/W) =禁用自动波特对齐 1h (R/W) =启用自动波特对齐 |
12-8 | RESERVED | RESERVED |
7-0 | FFTXDLY | FIFO发送延迟 这些位定义了从FIFO传输缓冲区到传输移位寄存器的每次传输之间的延迟。延迟定义在SCI串行波特时钟周期的数量。8位寄存器可以定义0波特时钟周期的最小延迟和256波特时钟周期的最大延迟。 在FIFO模式下,移位寄存器和FIFO之间的缓冲区(TXBUF)应该只有在移位寄存器完成最后一位的移位之后才被填充。这是将传输之间的延迟传递到数据流所必需的。在FIFO模式下,TXBUF不应被视为一个额外的缓冲区级别。延迟传输特性将有助于创建一个没有RTS/CTS控制的自动流方案,就像标准UARTS一样。 |
8.开发板实操
LAUNCHXL-F28069M内置USB到UART适配器。这使得即使在隔离的环境中也可以很容易地将调试信息打印回主机PC。这个LaunchPad上的F28069M设备包含两个SCI (UART)外设,而LaunchPad有三个需要路由这些外设的地方。因此,一个串行连接复用器已添加到板,使SCI路由配置容易。路由通过两个跳线(JP6和JP7)配置。配置跳线,如下表所示,以实现所需的串行连接。
这里采用GPIO28和GPIO29.
采用轮询实现发送和接收,并打开FIFO。
GPIO配置
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; //上拉
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//Asynch input GPIO28
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;//引脚复用
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
EDIS;
SCI配置
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // 使能时钟
SciaRegs.SCICCR.bit.STOPBITS = 0; // 停止位 0:1停止位, 1:2停止位
SciaRegs.SCICCR.bit.PARITYENA = 0; // 奇偶校验使能位 0:失能 1:使能
SciaRegs.SCICCR.bit.PARITY = 0; // 奇偶校验选择位 0:奇校验 1:偶校验
SciaRegs.SCICCR.bit.LOOPBKENA = 0; // 循环测试模式 0:不启用 1:启用,内部rx和tx相连
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0; // 地址模式 0:不启用 1:启用
SciaRegs.SCICCR.bit.SCICHAR = 7; // 数据长度 0-7 1到8的长度
SciaRegs.SCICTL1.bit.RXERRINTENA = 0; // 接收错误中断使能位 0:失能 1:使能
SciaRegs.SCICTL1.bit.SWRESET = 0; // sci复位 0:sci复位, 1:在系统复位后写1恢复
SciaRegs.SCICTL1.bit.TXWAKE = 0; // sci 发送唤醒模式
SciaRegs.SCICTL1.bit.SLEEP = 0; // 睡眠模式
SciaRegs.SCICTL1.bit.TXENA = 1; // 发送使能
SciaRegs.SCICTL1.bit.RXENA = 1; // 接受使能
SciaRegs.SCICTL2.bit.TXINTENA = 0; // SCITXBUF-register interrupt disable.
SciaRegs.SCICTL2.bit.RXBKINTENA = 0; // Receiver-buffer/break interrupt disable.
// @LSPCLK = 22.5MHz (90 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x0024;
// FIFO配置
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2044;
SciaRegs.SCIFFCT.all=0x0;
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
EDIS;
主循环
for(;;)
{
//
// Wait for inc character
//
while(SciaRegs.SCIFFRX.bit.RXFFST ==0) //0h (R/W) = Receive FIFO is empty
//1h (R/W) = Receive FIFO has 1 words
//2h (R/W) = Receive FIFO has 2 words
//3h (R/W) = Receive FIFO has 3 words
//4h (R/W) = Receive FIFO has 4 words
{
//
// wait for XRDY =1 for empty state
//
}
//
// Get character
//
ReceivedChar = SciaRegs.SCIRXBUF.bit.RXDT;
//
// Echo character back
//
msg = " You sent: \0";
scia_msg(msg);
scia_xmit(ReceivedChar);
}
//
// scia_xmit - Transmit a character from the SCI
//
void
scia_xmit(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
{
}
SciaRegs.SCITXBUF=a;
}
//
// scia_msg -
//
void
scia_msg(char * msg)
{
int i;
i = 0;
while(msg[i] != '\0')
{
scia_xmit(msg[i]);
i++;
}
}
9.问题记录
9.1检测不到串口
将开发板USB接到电脑上查看串口助手发现没有检测到端口。
后在网上查资料得知,开发板上带的下载调试器是有JTAG和串口两个端口。
在设备管理器中找到TI的端口
勾选加载VCP,再查看串口助手就有端口了。上面Aux那个是串口,下面debug端口是JTAG的。
9.2 发送程序错误
采用ti的基础例程,开fifo,不开中断发送数据发现一串数据只能发两个字符开头和前的字符\0。比如"hello world\0",只能发送hd。
scia_fifo_init(); // Initialize the SCI FIFO
scia_echoback_init(); // Initalize SCI for echoback
将上面两句程序反过来就能正常发送了。
10.其他
【代码优化】字符串中数组与指针的区别_哔哩哔哩_bilibili
欢迎加入扣扣交流群,群号:807477521