在异步通信中必须先规定3 件事: 一是字符格式,即传输的每一帧数据的格式; 二是通信双方要设置为相同的波特率, 且该波特率能适应双方的时钟频率; 三是通信双方要有约定的通信协议, 也就是双方要互相确认后才能传输数据。
在本设计中, DSP 和单片机采用的数据帧格式是1 位起始位, 8 位数据位和1 位停止位。由于数据包采用校验和的方式进行校验, 因而在数据帧格式中没有设置奇偶校验位。因而MCS51 单片机应设置工作在串口方式1 状态下, 此时串行口为8 位异步通信接口。为了保证数据传输具有较高的速率, 同时又有比较低的传输误码率, 因而选择波特率为9600 b/ s。通过相应的波特率设置计算公式计算出DSP 和单片机的初始化时寄存器的初值, 即可完成设置。这样就保证了通信双方帧格式的统一和波特率的统一, 从而使数据通信正确、可靠[。
DSP 的串口初始化设置程序如下:
EALLOW;
GpioMuxReg s. GPGMUX. bit. SCIRXDB_GPIOG5 = 1;/ / 设置SCI??RX 引脚外设功能
GpioMuxReg s. GPGMUX. bit. SCIT XDB_GPIOG4 = 1;/ / 设置SCI??TX 引脚外设功能EDIS;
ScibRegs. SCICCR. all = 0x07; / / 1 位停止位, 无奇偶校验,8 位字符长度, 使用空闲线模式协议
ScibRegs. SCICTL1. all = 0x 03;/ / 使能发送和接收缓冲
ScibRegs. SCICTL2. all= 0x 02;/ / 使能RXRDY 中断, 禁止T XRDY 中断
ScibRegs. SCIPRI. all = 0x0000;/ / 禁止接收错误中断和休眠模式
ScibRegs. SCIH BAUD= 0x01;/ / LSPCLK = 37. 5 MH z, 波特率设为9 600 b/ s
ScibRegs. SCILBAUD = 0xE1; ??
ScibRegs. SCICTL1. all = 0x 0023;/ / 重新使能SCI
51 单片机串口初始化程序如下:
TMOD= 0x 21;/ / 定时器1 工作在方式2, 用于产生0 串口的波特率
SCON= 0x 50;/ / 串行口0 工作在方式1, 允许接收, 清标志位
TH 0= 0xfd; / / 晶振12 MH z, 设置波特率为9 600 b/ s
TH 1= 0xfd; PS= 1; / / 串口中断优先
PCON| = 0x 00; / / 波特率不加倍
TR1= 1;
在本设计中, 采用自己规定的通信协议, 首先DSP发送出握手信号, C51 收到握手信号后, 进入中断子程序, 判断握手信号是否正确, 若正确才握手成功, 开始接收数据包, 接收完成后对数据进行和校验, 正确后刷新液晶的显示数据存储区; 若错误则放弃本次数据, 并将接收数据存储区清零, 等待下一次通信。其程序流程图如图3 所示。
图3 DSP 和单片机的通信程序流程图
DSP 向单片机的定时发送程序如下:
ScibRegs. SCITXBUF = Sci_VarRx [ i] ;/ / 将数据包写入发送缓冲区
i+ + ; / / 依次发送数据包
if( i= = 12) i= 0; / / 重新计数
IER | = M_INT1; / / 清除中断标志位
EINT;
PieCTR lReg s. PIEACK. all = PIEACK_GROUP1;
51 单片机串口中断服务程序如下:
Rx0_Buffer[ Rx0_Ptr] = SBUF; / / 读取数据到接收数组
RI= 0; / / 清除接收标志位
Rx0_Ptr+ + ; / / 计数加1
Rx_flag= 1;