基于A(yíng)VR單片機的串口轉FSK的通信模塊設計
隨著(zhù)信息技術(shù)與網(wǎng)絡(luò )技術(shù)的飛速發(fā)展,信息交互應用業(yè)務(wù)給人類(lèi)生活帶來(lái)更多的便利,信息終端表現出巨大的市場(chǎng)潛力。但是由于終端用戶(hù)環(huán)境不同,用戶(hù)信息交互方式可能不同,目前常用的有IP方式、FSK方式以及無(wú)線(xiàn)通信方式等。為了能夠提高終端市場(chǎng)競爭力,減少系統開(kāi)發(fā)成本投入,通信模塊與終端程序獨立設計是較為理想的解決方案。本文采用ATmega48芯片及CMX865芯片實(shí)現FSK通信模塊,基于此模塊,用戶(hù)與業(yè)務(wù)平臺之間進(jìn)行FSK信息交互,相對于終端來(lái)說(shuō)就是簡(jiǎn)單的串口通信。
1 ATmega48介紹
ATmega48是基于A(yíng)VR增強型RISC(精簡(jiǎn)指令集)結構的高性能、低功耗的8位CMOS微控制器。微控制器具有可控制的上電復位和可編程的掉電檢測電路、經(jīng)過(guò)標定的片內RC振蕩器、片內外18個(gè)中斷源和5種休眠模式。由于其先進(jìn)的指令集以及單時(shí)鐘周期指令執行時(shí)間,ATmega48的數據吞吐率高達1 MIPS/MHz,運行速度比普通的單片機高出10倍,從而可以緩解系統在功耗和處理速度之間的矛盾。
其片內集成了4 KB的系統內可編程Flash、256字節的EEPROM、512字節的SRAM。其外設具有可編程的串行USART接口、可工作于主機/從機模式的SPI串行接口;存在2個(gè)具有獨立預分頻器和比較器功能的8位定時(shí)/計數器和1個(gè)具有預分頻器、比較功能和捕捉功能的16位定時(shí)/計數器、具有獨立片內振蕩器的可編程看門(mén)狗定時(shí)器等。ATmega48/88/168芯片硬件電路可以完全兼容,完全可以根據軟件實(shí)際需求靈活選擇AVR芯片,極大地方便系統的開(kāi)發(fā)與研制。
2 CMX865簡(jiǎn)介
CMX865是CML公司新出的一款DTMF編/解碼器/FSK調制解調器復合IC芯片,它采用單個(gè)高速串行總線(xiàn)控制,與大多數串行接口兼容。CMX865的主要特征是:
◆ 供電電壓2.7~5.5 V,低功耗操作模式;
◆ 支持V.23、Bell202 FSK 1200 bps編碼/解碼;
◆ 集成高可靠性DTMF編碼器/解碼器;
◆ 集成振鈴檢測功能,支持語(yǔ)音探測功能。
3 硬件設計
圖1為串口轉FSK通信模塊電路。系統主要以AVR單片機ATmega48芯片和CMX865調制/解調芯片為硬件架構,ATmega48芯片利用CBUS總線(xiàn)對CMX865芯片進(jìn)行控制操作,實(shí)現FSK通信。CMX865芯片的IRQN終端與CPU芯片的外部中斷0(INT0)相連,確保軟件可以采用中斷方式接收/發(fā)送FSK數據。CMX865芯片的時(shí)鐘信號、片選信號、響應應答數據信號、接收控制數據信號分別與ATmega48芯片的普通I/O接口引腳相連,CPU可以通過(guò)模擬口線(xiàn)方式對CMX865芯片進(jìn)行控制。
圖1 串口轉FSK通信模塊電路
圖1還提供了基本的FSK接收/發(fā)送數據接口電路和振鈴檢測電路。在FSK發(fā)送電路中,CMX865芯片TXA(15引腳)處外接電阻的目的是匹配芯片接口對線(xiàn)路的交流阻抗。在FSK接收電路中,CMX865芯片RXAFB(9引腳)與RXAN(10引腳)之間的電容以及隔離變壓器之間電容設計的目的是濾除高頻噪聲;通過(guò)調節接收電路中兩個(gè)電阻R1、R2的阻值即可改變接收端提供給CMX865芯片信號的幅度。在振鈴檢測電路中,IC1是光電耦合器,不振鈴時(shí)光電三極管截止,RING為高電平;振鈴時(shí),振鈴信號經(jīng)過(guò)電容耦合及穩壓管穩壓,振鈴電壓使IC1內發(fā)光二極管發(fā)光,照射到光電三極管的基極上導致光電三極管導通,RING為低電平,通過(guò)ATmega48引腳檢測到低電平的振鈴信號。
4 軟件實(shí)現
ATmega48芯片具有4 KB內部Flash和512字節的片內SRAM,軟件實(shí)現需考慮資源分配問(wèn)題,特別是SRAM使用情況。由于程序涉及串口通信、DTMF通信和FSK通信3種情況,理論上需要開(kāi)辟6個(gè)緩沖區。如果這樣,每一個(gè)緩沖區的大小顯然不能確保達到實(shí)際通信數據量的需求。結合FSK通信特點(diǎn),DTMF數據傳輸與FSK數據傳輸不可能同時(shí)發(fā)生,因此FSK與DTMF可共用相同緩沖區。同樣串口接收與FSK發(fā)送、串口發(fā)送與FSK接收都不會(huì )同時(shí)發(fā)生,這樣通信只需要開(kāi)辟兩個(gè)緩沖區就可以確保模塊正常通信,考慮實(shí)際業(yè)務(wù)平臺數據量情況,軟件設計中為FSK接收開(kāi)辟255字節緩沖區復用;FSK發(fā)送開(kāi)辟45字節緩沖區復用。
4.1 主程序實(shí)現流程
圖2 主程序流程
通信模塊主程序包括:CPU初始化、CMX865初始化、初始化建鏈、串口通信和FSK通信子程序等。主程序流程如圖2所示。初始化建鏈環(huán)節是模塊正常工作的基礎,通過(guò)初始化建鏈操作,信息終端可以根據線(xiàn)路環(huán)境以及平臺超時(shí)機制對通信模塊參數進(jìn)行設置,確保通信的穩定性。通信主流程循環(huán)執行3個(gè)子功能函數:線(xiàn)路狀態(tài)處理函數、串口數據解析與處理函數、鏈路保持函數。線(xiàn)路狀態(tài)處理函數設計了3種線(xiàn)路狀態(tài),即初始狀態(tài)、空閑狀態(tài)和摘機狀態(tài);正常工作時(shí)僅在空閑狀態(tài)和摘機狀態(tài)之間切換。其中在空閑狀態(tài)檢測振鈴、根據狀態(tài)位執行摘機、DTMF撥號等操作;在摘機狀態(tài)根據狀態(tài)位執行FSK收發(fā)、脫線(xiàn)檢測、掛機控制等操作。串口數據解析與處理函數包含串口數據按命令集解析、對解析命令進(jìn)行應答和狀態(tài)置位處理部分。這樣線(xiàn)路狀態(tài)處理函數和串口數據解析與處理函數通過(guò)狀態(tài)置位標志緊密連接起來(lái)。FSK數據采用中斷方式直接接收,接收完畢后在摘機狀態(tài)下直接通過(guò)串口發(fā)送給信息終端。由于串口發(fā)送應用相對單一,為簡(jiǎn)單處理串口發(fā)送采用即時(shí)應答處理方式,分散在通信主流程各子功能函數中實(shí)現,提高了通信效率。通過(guò)鏈路保持函數判斷串口通信是否異常,通信模塊周期性地向信息終端發(fā)送鏈路保持命令,如果3次重發(fā)均未收到終端應答命令,通信模塊將自動(dòng)鎖閉線(xiàn)路,重新執行初始化建鏈操作,實(shí)現串口異常的處理。
4.2 對外串口通信協(xié)議
模塊采用標準串口通信,波特率為19 200 bps,10位異步方式。定義串口通信數據包格式為:0x1E+命令+校驗和反碼(對命令的校驗和反碼),其中部分命令以變長(cháng)方式發(fā)送。串口通信主要命令有:模塊初始化、鏈路保持、DTMF接收/發(fā)送、FSK接收/發(fā)送、振鈴、掛機等,命令具體格式和描述此處不加詳述。模塊初始化上電后由通信模塊自動(dòng)發(fā)起,直到正確接收到終端應答初始化命令后,通信模塊才建鏈成功。信息終端初始化應答命令主要提供FSK通信模塊參數配置信息。上電后如果FSK模塊未收到終端初始化應答信息,則周期性地(每2 s)發(fā)送一次初始化建鏈命令,直到成功為止;模塊FSK通信過(guò)程中周期性地向終端發(fā)送鏈路保持命令,如果未收到終端應答信息,則斷開(kāi)FSK鏈接重新開(kāi)始模塊初始化。
4.3 串口通信實(shí)現
AVR單片機串口通信往往采用SPI通信方式[78],通信模塊串口通信采用UART0控制/狀態(tài)寄存器和數據寄存器實(shí)現。串口通信子程序主要由串口發(fā)送/接收中斷子程序、串口接收命令解析子程序和串口組包發(fā)送子程序3部分組成。其中串口中斷接收程序為:
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr (void){// UDR0數據寄存器,aHostRxBuf串口接收/FSK發(fā)送復用緩沖區,iHostRxWr接收數據指針
aHostRxBuf [ iHostRxWr ++ ] = UDR0;
}
串口中斷發(fā)送程序:
#pragma interrupt_handler uart0_tx_isr:21
void uart0_tx_isr (void){
if (g_ucUartSendNum) { //數據沒(méi)有發(fā)送完畢
UDR0 = aHostTxBuf [g_ucUartSendAddss];
g_ucUartSendNum--;
g_ucUartSendAddss++;
if (g_ucUartSendNum==0){ //字節發(fā)送完畢地址歸零
g_ucUartSendAddss = 0;
UCSR0B = ~0x28; //UCSR0B UART0控制/狀態(tài)寄存器
}
}
}
具體執行串口數據發(fā)送時(shí),需要提供發(fā)送數據長(cháng)度、發(fā)送起始地址、置UCSR0B寄存器值(UCSR0B |= 0x28)。串口接收命令解析子程序按照對外串口通信協(xié)議解析串口命令,并根據命令描述調用子程序代碼執行相應子功能操作。為了通信容錯處理,通信模塊需對接收串口數據進(jìn)行校驗,如果解析的串口命令格式正確,則向終端發(fā)送肯定應答;否則發(fā)送否定應答,等待終端重傳命令數據。串口組包發(fā)送子程序對接收的FSK數據以及線(xiàn)路狀態(tài)等信息數據,按照串口通信協(xié)議組包發(fā)送給信息終端。
4.4 FSK通信實(shí)現
FSK通信子程序主要由CMX865芯片寄存器操作、FSK收/發(fā)、DTMF收/發(fā)以及線(xiàn)路狀態(tài)檢測等子程序組成。ATmega48芯片采用模擬口線(xiàn)的方式對CMX865寄存器進(jìn)行讀/寫(xiě)操作,其中對CMX865芯片寄存器讀操作程序為:
unsigned int ReadModem (unsigned char _Register){
unsigned char i;
unsigned int iRecBuf,temp;
DisableInterrupts; //禁止中斷
CBUS_CSN_CLR; //MODEM片選CS口置低
CbusData (_Register, 8); //采用模擬口線(xiàn)對寄存器進(jìn)行寫(xiě)操作
Temp = 0x8000;
CBUS_CLK_CLR; //將位時(shí)鐘線(xiàn)置低電平,開(kāi)始接收
for (i=0;i16;i++){//循環(huán)接收16位的數據
CBUS_CLK_SET; //將位時(shí)鐘線(xiàn)置高電平,表示一個(gè)位接收完畢
if (PINB 0x01)
iRecBuf |=temp; //接收數據線(xiàn)上的數據
Temp>>=1;
CBUS_CLK_CLR; //將位時(shí)鐘線(xiàn)置低電平,開(kāi)始接收
}
CBUS_CSN_SET; //發(fā)送完以后MODEM片選CS口置高
EnableInterrupts; //打開(kāi)中斷
return iRecBuf;
}
FSK收/發(fā)、DTMF收/發(fā)子程序均以CMX865寄存器讀/寫(xiě)操作函數為基礎,通過(guò)設置CMX865寄存器的值,確定其工作模式。FSK數據發(fā)送、接收都可以通過(guò)CMX865芯片的IRQ中斷口線(xiàn)引起ATmega48芯片中斷,因此FSK數據收/發(fā)都通過(guò)中斷實(shí)現。芯片程序采用10 ms定時(shí)器循環(huán)檢測線(xiàn)路狀態(tài)。
結語(yǔ)
本文利用ATmega48芯片和CMX865芯片為硬件架構設計了串口轉FSK通信模塊。由于A(yíng)Tmega48芯片與ATmega88芯片除了Flash、EEPROM、SRAM容量差異外,性能完全相同。通信模塊可以不更改硬件電路,僅配置相應AVR芯片,對軟件稍作調整,能夠滿(mǎn)足通信業(yè)務(wù)對通信數據量增加的需求,節約模塊二次開(kāi)發(fā)的成本。目前本通信模塊已在一款新型的電子交易終端上使用,并與中興、精倫等電子交易平臺進(jìn)行信息交互,運行效果良好。
評論