1. 3?? 單片機(jī)與DSP通信的軟件實(shí)現(xiàn)
在異步通信中必須先規(guī)定3 件事: 一是字符格式,即傳輸?shù)拿恳粠瑪?shù)據(jù)的格式; 二是通信雙方要設(shè)置為相同的波特率, 且該波特率能適應(yīng)雙方的時(shí)鐘頻率; 三是通信雙方要有約定的通信協(xié)議, 也就是雙方要互相確認(rèn)后才能傳輸數(shù)據(jù)。
在本設(shè)計(jì)中, DSP 和單片機(jī)采用的數(shù)據(jù)幀格式是1 位起始位, 8 位數(shù)據(jù)位和1 位停止位。由于數(shù)據(jù)包采用校驗(yàn)和的方式進(jìn)行校驗(yàn), 因而在數(shù)據(jù)幀格式中沒有設(shè)置奇偶校驗(yàn)位。因而MCS51 單片機(jī)應(yīng)設(shè)置工作在串口方式1 狀態(tài)下, 此時(shí)串行口為8 位異步通信接口。為了保證數(shù)據(jù)傳輸具有較高的速率, 同時(shí)又有比較低的傳輸誤碼率, 因而選擇波特率為9600 b/ s。通過相應(yīng)的波特率設(shè)置計(jì)算公式計(jì)算出DSP 和單片機(jī)的初始化時(shí)寄存器的初值, 即可完成設(shè)置。這樣就保證了通信雙方幀格式的統(tǒng)一和波特率的統(tǒng)一, 從而使數(shù)據(jù)通信正確、可靠[。
DSP 的串口初始化設(shè)置程序如下:
EALLOW;
GpioMuxReg s. GPGMUX. bit. SCIRXDB_GPIOG5 = 1;/ / 設(shè)置SCI??RX 引腳外設(shè)功能
GpioMuxReg s. GPGMUX. bit. SCIT XDB_GPIOG4 = 1;/ / 設(shè)置SCI??TX 引腳外設(shè)功能EDIS;
ScibRegs. SCICCR. all = 0x07; / / 1 位停止位, 無奇偶校驗(yàn),8 位字符長度, 使用空閑線模式協(xié)議
ScibRegs. SCICTL1. all = 0x 03;/ / 使能發(fā)送和接收緩沖
ScibRegs. SCICTL2. all= 0x 02;/ / 使能RXRDY 中斷, 禁止T XRDY 中斷
ScibRegs. SCIPRI. all = 0x0000;/ / 禁止接收錯(cuò)誤中斷和休眠模式
ScibRegs. SCIH BAUD= 0x01;/ / LSPCLK = 37. 5 MH z, 波特率設(shè)為9 600 b/ s
ScibRegs. SCILBAUD = 0xE1; ??
ScibRegs. SCICTL1. all = 0x 0023;/ / 重新使能SCI
51 單片機(jī)串口初始化程序如下:
TMOD= 0x 21;/ / 定時(shí)器1 工作在方式2, 用于產(chǎn)生0 串口的波特率
SCON= 0x 50;/ / 串行口0 工作在方式1, 允許接收, 清標(biāo)志位
TH 0= 0xfd; / / 晶振12 MH z, 設(shè)置波特率為9 600 b/ s
TH 1= 0xfd; PS= 1; / / 串口中斷優(yōu)先
PCON| = 0x 00; / / 波特率不加倍
TR1= 1;
在本設(shè)計(jì)中, 采用自己規(guī)定的通信協(xié)議, 首先DSP發(fā)送出握手信號, C51 收到握手信號后, 進(jìn)入中斷子程序, 判斷握手信號是否正確, 若正確才握手成功, 開始接收數(shù)據(jù)包, 接收完成后對數(shù)據(jù)進(jìn)行和校驗(yàn), 正確后刷新液晶的顯示數(shù)據(jù)存儲區(qū); 若錯(cuò)誤則放棄本次數(shù)據(jù), 并將接收數(shù)據(jù)存儲區(qū)清零, 等待下一次通信。其程序流程圖如圖3 所示。
?
圖3?? DSP 和單片機(jī)的通信程序流程圖
?
DSP 向單片機(jī)的定時(shí)發(fā)送程序如下:
ScibRegs. SCITXBUF = Sci_VarRx [ i] ;/ / 將數(shù)據(jù)包寫入發(fā)送緩沖區(qū)
i+ + ; / / 依次發(fā)送數(shù)據(jù)包
if( i= = 12) i= 0; / / 重新計(jì)數(shù)
IER | = M_INT1; / / 清除中斷標(biāo)志位
EINT;
PieCtr lReg s. PIEACK. all = PIEACK_GROUP1;
51 單片機(jī)串口中斷服務(wù)程序如下:
Rx0_Buffer[ Rx0_Ptr] = SBUF; / / 讀取數(shù)據(jù)到接收數(shù)組
RI= 0; / / 清除接收標(biāo)志位
Rx0_Ptr+ + ; / / 計(jì)數(shù)加1
Rx_flag= 1;
評論