首先需要注意,串行通信模块的寄存器是8位的。
一、串行通信接口的物理结构
1、两个IO引脚
SCIRXD SCI接收数据引脚
SCITXD SCI发送数据引脚
2、一个16位的可编程的波特率选择寄存器。
3、1-8位的可编程数据字长度。
4、可编程的停止位。
5、内部产生的串行时钟。
6、全双工或者半双工。
7、双缓冲的接收和发送功能。
二、SCI模块的结构
1、一个发送器
SCITXBUF 发送数据缓冲寄存器,存放待发送的数据。
TXSHF 发送移位寄存器。从SCITXBUS载入数据,并每次一位地将数据移位到SCITXD引脚。
2、一个接收器
RXSHF 接收移位寄存器。每次一位地将SCIRXD上的数据移入。
SCIRXBUF 接收数据缓冲寄存器。接收由RXSHF移入的数据。
3、一个可编程的波特率发生器。
4、数据存储器映射的控制和状态寄存器。
三、SCI模块的寄存器
SCICCR SCI通信控制寄存器 定义SCI使用的字符格式、协议和通信模式
SCICTL1 SCI控制器1 控制TX/RX和接收器错误终端使能、内部时钟和SCI软件复位
SCIHBAUD SCI波特率选择寄存器的高8位
SCILBAUD SCI波特率选择寄存器的低8位
SCICTL2 SCI控制器2 包括发送器缓冲使能等
SCIRXST SCI接收状态寄存器
SCIRXEMU SCI仿真数据缓冲寄存器
SCIRXBUF SCI接收数据缓冲寄存器
SCITXBUF SCI发送数据缓冲寄存器
SCIPRI SCI优先级控制寄存器
下面是一个简单的串口通信实例,已经调试通过:
void cpu_init(void) { SCSR1 = 0x83fe; WDCR = 0x0e8; asm(" SETC INTM"); asm(" CLRC OVM"); asm(" CLRC CNF"); asm(" CLRC SXM"); IMR = 0x0000; IFR = 0x0ffff; }
void sci_init(void) { MCRA |= 0x03; SCICCR = 0x07; SCICTL1 = 0x13; SCICTL2 = 0x03; SCIHBAUD = 0x02; SCILBAUD = 0x07; SCICTL1 = 0x33; SCIPRI = 0x60; IMR |= 0x10; asm(" CLRC INTM"); }
void send(char *var) { int i; for(i=0; i<strlen(var); i++) { SCICTL2 &= 0x0c0; while(SCICTL2 != 0x0c0); SCITXBUF = var[i]; } }
void main(void) { cpu_init(); sci_init(); send("ni hao!");
while(1); }
|
阅读(2493) | 评论(0) | 转发(0) |