一、原理
二、SCI常用寄存器(SciaRegs、ScibRegs、ScicRegs)
2.1 SCI通信控制寄存器(SCICCR)
Bit | Name | Description |
15~8 | RESERVED | |
7 | STOPBITS | 停止位个数 0:一位停止位 1:两位停止位 |
6 | PARITY | 奇偶校验位 0:奇校验 1:偶校验 |
5 | PARITYENA | 奇偶校验使能 0:禁止 1:使能 |
4 | LOOPBKENA | 自测模式(回送测试)使能 0:禁止 1:使能 |
3 | ADDRIDLE_MODE | 多处理器模式控制 0:选择空闲线协议 1:选择地址位协议 |
2~0 | SCICHAR | 字符长度控制 000:1位 ………… 111:8位 |
2.2 SCI控制寄存器1(SCICTL1)
Bit | Name | Description |
15~7 | RESERVED | |
6 | RXERRINTENA | SCI接收错误中断使能 0:屏蔽 1:使能 |
5 | SWRESET | SCI软件复位(低有效) 0:初始化SCICTL2和SCIRXST寄存器各标志位至复位状态 |
4 | RESERVED | |
3 | TXWAKE | SCI发送器唤醒方式选择 0:不唤醒 1:发送模式唤醒,地址位模式或空闲线模式 |
2 | SLEEP | SCI休眠 0:禁止休眠状态 1:启动休眠状态 |
1 | TXENA | SCI发送器使能 0:禁止发送器 1:使能发送器 |
0 | RXENA | SCI接收器使能 0:禁止发送 1:将接收的字符发送到SCIRXEMU和SICRXBUF |
2.3 SCI控制寄存器2(SCICTL2)
Bit | Name | Description |
15~8 | RESERVED | |
7 | TXRDY | 发送缓冲寄存器就绪标志 0:发送数据缓冲寄存器已满 1:发送数据缓冲寄存器准备接收下一个字符 |
6 | TXEMPTY | 发送器空标志 0:发送缓冲寄存器和发送移位寄存器未发送完 1:发送缓冲寄存器和发送移位寄存器为空 |
5~2 | RESERVED | |
1 | RXBKINTENA | SCI接收中断使能 0:屏蔽 1:使能RXRDY/BRKDT中断 |
0 | TXINTENA | SCI发送中断使能 0:屏蔽 1:使能TXRDY中断 |
2.4 SCI波特率设置寄存器(BRR = SCIHBAUD:SCILBAUD)
SCI波特率常用选择参数
理想波特率 | BRR |
2400 | 1952(0x7A0) |
4800 | 976(0x3D0) |
9600 | 487(0x1E7) |
19200 | 243(0xF3) |
38400 | 121(0x79) |
2.5 SCI接收状态寄存器(SCIRXST)
Bit | Name | Description |
15~8 | RESERVED | |
7 | RXERROR | SCI接收错误标志位 0:错误标志未置位 1:错误标志置位 |
6 | RXRDY | SCI接收就绪标志位 0:没有新数据可读 1:新数据可读 |
5 | BRKDT | SCI间断检测标志位 0:无间断事件 1:有间断事件 |
4 | FE | SCI数据帧格式错误 0:数据帧格式正确 1:数据帧格式错误 |
3 | OE | SCI数据覆盖错误 0:覆盖错误未发生 1:覆盖错误发生 |
2 | PE | SCI奇偶校验错误标志位 0:奇偶校验无错误或无奇偶校验位 1:奇偶校验错误 |
1 | RXWAKE | 接收唤醒位 1:表明收到一个唤醒接收功能的信号 |
0 | RESERVED |
2.6 SCI接收数据缓冲寄存器(SCIRXBUF)
Bit | Name | Description |
15 | SCIFFFE | SCI FIFO帧格式错误标志位 0:接收字符7~0位时,无帧格式错误 1:接收字符7~0位时,有帧格式错误 |
14 | SCIFFPE | SCI FIFO奇偶校验错误标志位 0:接收字符7~0位时,无奇偶校验错误 1:接收字符7~0位时,有奇偶校验错误 |
13~8 | RESERVED | |
7~0 | RXDT | 接收的字符 |
2.7 SCI发送数据缓冲寄存器(SCITXBUF)
Bit | Name | Description |
15~8 | RESERVED | |
7~0 | 发送的字符 |
2.8 SCI优先级控制寄存器(SCIPRI)
Bit | Name | Description |
15~5 | RESERVED | |
4~3 | FREESOFT | 当一个仿真暂停事件发生后,SCI模块的动作 00:暂停情况下立即停止 10:完成当前数据的发送/接收后停止 x1:连续运行,停止命令无效 |
2~0 | RESERVED |
2.9 SCI FIFO发送寄存器(SCIFFTX)
Bit | Name | Description |
15 | SCIRST | SCI复位 0:复位SCI接收与发送通道 1:SCI FIFO继续发送或接收 |
14 | SCIFFENA | SCI FIFO使能位 0:FIFO被屏蔽 1:FIFO使能 |
13 | TXFIFORESET | 发送FIFO复位 0:复位FIFO指针指向0并保持复位状态 1:重新使能发送FIFO |
12~8 | TXFFST | 发送FIFO状态 发送FIFO中有几个字节的数据 0x0:0个 ……… 0x10:16个 |
7 | TXFFINT | 发送FIFO中断 0:发送FIFO中断未发生 1:发送FIFO中断发生 |
6 | TXFFINTCLR | 发送FIFO中断清除位 0:无影响 1:清除发送中断TXFFINT标志 |
5 | TXFFIENA | 发送FIFO中断使能 0:屏蔽 1:使能TXFIFO中断 |
4~0 | TXFFIL | 发送FIFO中断级别位 每当FIFO状态位(TXFFST4~0)小于或等于FIFO中断级别位(TXFFIL4~0)时,发送FIFO会产生中断。 |
2.10 SCI FIFO接收寄存器(SCIFFRX)
Bit | Name | Description |
15 | RXFFOVF | 接收FIFO溢出 0:接收FIFO没有溢出 1:接收FIFO溢出,FIFO收到超过16帧数据,并且收到的第一帧数据已经丢失 |
14 | RXFFOVRCLR | RXFFOVF清除位 0:无影响 1:清除RXFFOVF标志位 |
13 | RXFIFORESET | 接收FIFO复位 0:复位FIFO指针指向0并保持复位状态 1:重新使能接收FIFO |
12~8 | RXFFST | 接收FIFO状态 接收FIFO中有几个字节的数据 0x0:0个 ……… 0x10:16个 |
7 | RXFFINT | 接收FIFO中断 0:接收FIFO中断未发生 1:接收FIFO中断发生 |
6 | RXFFINTCLR | 接收FIFO中断清除位 0:无影响 1:清除接收中断RXFFINT标志 |
5 | RXFFIENA | 接收FIFO中断使能 0:屏蔽 1:使能RXFIFO中断 |
4~0 | RXFFIL4~0 | 接收FIFO中断级别位。 每当FIFO状态位(RXFFST4~0)大于或等于FIFO中断级别位(RXFFIL4~0)时,接收FIFO会产生中断。 |
2.11 SCI FIFO控制寄存器(SCIFFCT)
Bit | Name | Description |
15 | ABD | 波特率自动检测位 0:非自动检测 1:自动检测 |
14 | ABDCLR | ABD清除位 0:无影响 1:清除ABD位 |
13 | CDC | CDC校准检测位 0:禁止波特率自动检测的校准 1:允许波特率自动检测的校准 |
12~8 | RESERVED | |
7~0 | FFTXDLY | FIFO发送延时(每个FIFO帧数据从FIFO传送到发送移位寄存器的间隔时间) 延时时间=波特率时钟的整数倍,范围是0~256个波特率时钟。 |
三、串口配置步骤
#include "uart.h"
void UARTa_Init(Uint32 baud)
{
unsigned char scihbaud=0;
unsigned char scilbaud=0;
Uint16 scibaud=0;
scibaud=37500000/(8*baud)-1;
scihbaud=scibaud>>8;
scilbaud=scibaud&0xff;
// step1 使能SCI外设时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
// step2 SCI初始化GPIO
InitSciaGpio();
// step3 SCI工作参数配置,包括数据格式、使能发送接收、波特率、FIFO等
SciaRegs.SCICCR.all=0x0007; // 1 stop bit, 8 char bits,
// No parity, No loopback
// async mode, idle-line protocol
SciaRegs.SCICTL1.all=0x0003; // 启用软件复位
// 使能SCI发送和接收功能
// 禁止RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all=0x0003; // 使能SCI发送和接收中断
// 波特率设置
SciaRegs.SCIHBAUD=scihbaud; // 4800 baud @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD=scilbaud;
SciaRegs.SCICTL1.all=0x0023; // 从复位状态释放
// FIFO初始化
SciaRegs.SCIFFTX.all=0xE040; // 使能发送FIFO
// 清除发送中断TXFFINT标志
SciaRegs.SCIFFRX.all=0x204F; // 使能接收FIFO
// 清除接收中断RXFFINT标志
// 接收FIFO中断级位为15
SciaRegs.SCIFFCT.all=0x0; // 禁止波特率自动检测功能
}
// SCI单字节发送函数
void UARTa_SendByte(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0); //查询发送完成标志
SciaRegs.SCITXBUF=a;
}
// SCI字符串(多字节)发送函数
// 函数参数是一个字符指针类型。
// 函数内当遇到字符串结尾‘\0’自动停止发送。
void UARTa_SendString(char * msg)
{
int i=0;
while(msg[i] != '\0')
{
UARTa_SendByte(msg[i]);
i++;
}
}
-------------------------------------------------------------------------------------------------------
void main()
{
char *msg;
Uint16 ReceivedChar=0;
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,200000);//200ms
UARTa_Init(4800);
msg = "Hello World!\r\n";
UARTa_SendString(msg);
msg = "You will enter a character, and the DSP will echo it back!\r\n";
UARTa_SendString(msg);
while(1)
{
msg = "\r\nEnter a character: ";
UARTa_SendString(msg);
// SCI接收字节函数
// 判断接收完成标志
while(SciaRegs.SCIFFRX.bit.RXFFST !=1);
// 接收数据
ReceivedChar = SciaRegs.SCIRXBUF.all;
// 回显字符
msg = " You sent: ";
UARTa_SendString(msg);
UARTa_SendByte(ReceivedChar);
DELAY_US(1000);
}
}