基于CAN總線與RS-485的DSP通信接口設(shè)計(jì)
1.概述
本文引用地址:http://2s4d.com/article/157872.htm現(xiàn)場(chǎng)總線是一種開放式、數(shù)字化、多點(diǎn)通信的控制系統(tǒng)局域網(wǎng)絡(luò),是當(dāng)今自動(dòng)化領(lǐng)域中最具有應(yīng)用前景的技術(shù)之一,CAN總線是現(xiàn)場(chǎng)總線中的應(yīng)用熱點(diǎn)。由于CAN總線具有通信速率高、開放性好、報(bào)文短、糾錯(cuò)能力強(qiáng)以及控制簡單、擴(kuò)展能力強(qiáng)、系統(tǒng)成本低等特點(diǎn),越來越受到人們的關(guān)注。
TI公司的TMS320LF2407型DSP微控制器以其處理能力強(qiáng),外設(shè)功能模塊集成度高及存儲(chǔ)器容量大等特點(diǎn)廣泛應(yīng)用于數(shù)字化控制與通信領(lǐng)域。CAN總線控制器與TMS320LF2407微控制器連接,可以實(shí)現(xiàn)CAN總線的通信。TMS320LF2407微控制器內(nèi)嵌的異步串行口(SCI)支持CPU與其它使用標(biāo)準(zhǔn)格式的異步外設(shè)之間的數(shù)字通訊,通過RS-485接口可以方便地進(jìn)行DSP之間或DSP與PC機(jī)之間的異步串行通信。
RS-485是一種多發(fā)送器的接口標(biāo)準(zhǔn),它擴(kuò)展了RS-422A的性能,允許雙絞線上一個(gè)發(fā)送器驅(qū)動(dòng)32個(gè)負(fù)載設(shè)備,負(fù)載設(shè)備可以是被動(dòng)發(fā)送器、接收器或收發(fā)器,RS-485最大傳輸距離為1200m,最大傳送速率可達(dá)10Mb/s。因此,RS-485在遠(yuǎn)程通信和多機(jī)總線系統(tǒng)中具有很大的吸引力,在實(shí)際設(shè)計(jì)中得到了廣泛應(yīng)用。
本設(shè)計(jì)以PC機(jī)為主機(jī),以TMS320LF2407為從機(jī),實(shí)現(xiàn)了主從機(jī)之間的基于RS-485的串行通信,以及TMS320LF2407與CAN總線的通信。其中PC機(jī)與TMS320LF2407的RS-485通信,采用MAXIM公司生產(chǎn)的MAX48X/49X系列收發(fā)器芯片,完成RS-485標(biāo)準(zhǔn)接口通信。由于PC機(jī)上提供的是標(biāo)準(zhǔn)的RS-232C串行接口,因此,需要RS-232C/RS-485轉(zhuǎn)換器進(jìn)行接口轉(zhuǎn)換。如圖1所示。應(yīng)用TMS320LF2407內(nèi)嵌的CAN模塊和總線接口芯片PCA82C250,實(shí)現(xiàn)了TMS320LF2407與CAN總線的串行通信。
2.TMS320LF2407的RS-485通信設(shè)計(jì)
TMS320F2407有較強(qiáng)的串行通信能力,設(shè)計(jì)到的控制類寄存器較多,這使系統(tǒng)設(shè)計(jì)比較靈活。設(shè)計(jì)時(shí),首先對(duì)控制類寄存器進(jìn)行初始化,包括數(shù)據(jù)格式、中斷使能、中斷優(yōu)先級(jí)、波特率等參數(shù)的設(shè)置。初始化完成以后,就可以發(fā)送和接收數(shù)據(jù)了。如果要發(fā)送數(shù)據(jù),只要把數(shù)據(jù)寫入SCITXBUF即可,由串行通信SCI模塊自動(dòng)完成發(fā)送數(shù)據(jù)。如果要接收數(shù)據(jù),只要把SCIRXBUF的內(nèi)容讀出即可(從引腳SCIRXD/IO移位來的信息由串行通信SCI模塊本身自動(dòng)去掉起始位、停止位、校驗(yàn)位,并將數(shù)據(jù)放到SCIRXBUF中)。代碼如下:
初始化TMS320LF2407的SCI模塊
?。猄CICCR=0x0007;//1個(gè)停止位,不使能奇偶校驗(yàn),8位字符
*SCICTL1=0x0023;//使能接受和發(fā)送
?。猄CICTL2=0x0003;//使能接受中斷
?。猄CIHBAUD=0x0001;
?。猄CILBAUD=0x0089;//設(shè)置波特率=9600bps,此時(shí)系統(tǒng)時(shí)鐘為30M
?。猄CIPRI=0x0010;//高優(yōu)先級(jí)
TMS320LF2407接收上位機(jī)中斷響應(yīng)程序
Voidinterruptint1()//SCI高優(yōu)先級(jí)中斷,屬于DSP的INT1中斷
{
if(*PIVR==0x0006)//查詢中斷向量判斷是否發(fā)生了串口接收中斷
?。?/p>
…//對(duì)接受數(shù)據(jù)進(jìn)行處理
arm(“clrcINTM”);//開總中斷
return;//返回
?。?/p>
else
?。?/p>
arm(“clrcINTM”);//開總中斷
return;//返回
?。?/p>
TMS320LF2407給上位機(jī)發(fā)送數(shù)據(jù)程序
Voidsend(char*p)//把欲發(fā)送的數(shù)據(jù)采用指針方式傳遞
?。?/p>
while(*p!=’