基于STM32和SIM900A的無線通信模塊設(shè)計(jì)
發(fā)布時(shí)間:2019-11-05 來源:霍濤,賈振堂 責(zé)任編輯:wenwei
【導(dǎo)讀】設(shè)計(jì)一個(gè)可以實(shí)現(xiàn)短信收發(fā)與數(shù)據(jù)無線傳輸?shù)哪K的要求,本文采用了ARM Cortex—M3內(nèi)核的主流產(chǎn)品STM32作為主控芯片,采用SIMCom公司的SIM900A作為通信芯片。在查閱大量相關(guān)文獻(xiàn)以及相關(guān)芯片的數(shù)據(jù)手冊(cè)之后,本文設(shè)計(jì)了一個(gè)遠(yuǎn)程無線通信模塊。該模塊在實(shí)驗(yàn)室試運(yùn)行一周后,沒有出現(xiàn)掉線的情況,數(shù)據(jù)收發(fā)的速度也很快。該模塊具有性能穩(wěn)定,外形小巧,性價(jià)比高等優(yōu)點(diǎn)。廠方投入使用之后,反應(yīng)良好。
隨著網(wǎng)絡(luò)和現(xiàn)代通信技術(shù)的不斷發(fā)展,遠(yuǎn)程無線通信技術(shù)經(jīng)過多年的研究與實(shí)際應(yīng)用,現(xiàn)如今在工業(yè)控制領(lǐng)域有了非常重要的地位,并且發(fā)揮著越來越大的作用。文中根據(jù)廠家的要求,設(shè)計(jì)的無線通信模塊,主要實(shí)現(xiàn)了短信與數(shù)據(jù)收發(fā)功能,并且做到了模塊的穩(wěn)定,掉線之后能夠自動(dòng)重連。
1、無線通信模塊整體設(shè)計(jì)方案
模塊主要有電源部分、主控部分、通信部分、數(shù)據(jù)傳輸部分4個(gè)部分組成。通信模塊采用SIM900A進(jìn)行無線通信。主控模塊采用STM32作為主控芯片,來控制短信的收發(fā)與數(shù)據(jù)傳輸?shù)捻樌M(jìn)行。遠(yuǎn)程終端可以是手機(jī)或者上位機(jī)的數(shù)據(jù)中心軟件,經(jīng)過處理之后,儲(chǔ)存下來,方便日后的查詢。本模塊具有低功耗,方便靈活,操作簡單并且穩(wěn)定,掉線之后可以自動(dòng)連接,運(yùn)行過程十分穩(wěn)定,并且成本較低。
2、無線通信模塊硬件設(shè)計(jì)
2.1 功能需求
本文設(shè)計(jì)的無線通信模塊,要求單12V電源輸入,模塊上電運(yùn)行后有相應(yīng)的指示燈來指示模塊的運(yùn)行狀態(tài)。另外要求模塊能夠?qū)崿F(xiàn)短信以及數(shù)據(jù)透傳兩大主要功能,在手機(jī)發(fā)送短信給模塊之后,模塊能夠動(dòng)作,并給出回應(yīng)。最后要求在建立TCP鏈接時(shí),仍然能夠收發(fā)短信。
圖1 無線通信模塊結(jié)構(gòu)圖
2.2 電源部分
在主電路中,主控芯片STM32的工作電壓為2.0~3.6 V,通信芯片SIM900A的工作電壓為3.1~4.6 V,為使模塊各個(gè)部分正常工作,必須對(duì)兩者進(jìn)行分別供電,電源供電電路如下:
圖中V12外接12 V電源,經(jīng)過電容濾波后輸入到LM2576,實(shí)現(xiàn)12 V到4 V的轉(zhuǎn)換,R1、R2在線路中起到分壓作用,D2燈亮起時(shí),表示模塊已經(jīng)正常供電。LM2576是美國國家半導(dǎo)體公司生產(chǎn)的3 A電流輸出降壓開關(guān)型集成穩(wěn)壓電路,具有完善的保護(hù)電路,比較穩(wěn)定。
圖2 電源模塊
2.3 主控芯片
主控模塊采用STM32單片機(jī)作為微控制器,該芯片能工作于-40~105℃的溫度范圍,MAX3232芯片用于串行口的電平變換,實(shí)現(xiàn)控制器與通信接口之間的通信。串口1與電源電平轉(zhuǎn)換芯片Max3223相連,USART1_TX(輸出,所以在配置GPIO時(shí),定義該口的模式為推拉輸出,USART1_ RX為輸入,定義為懸浮輸入模式。串口2與SN65LBC184D通信,實(shí)現(xiàn)數(shù)據(jù)的收發(fā),USART2_RTS、USART2_RX為輸入端口,模式定義為懸浮輸入模式,USART2_CTS、USART2_TX為輸出端口,模式定義為推拉輸出。串口3用來控制SIM900A芯片,USART3_RTS、USART3_RX為輸入端口,模式定義為懸浮輸入,USART3_CTS、USART3_TX為輸出端口,模式定義為推拉輸出。
圖3 主控芯片STM32
2.4 通信芯片
通信芯片采用SIMCom公司的新型緊湊型產(chǎn)品SIM900A,它屬于雙頻GSM/GPRS模塊,完全采用SMT封裝形式,性能穩(wěn)定,外觀精巧,性價(jià)比高,并且能夠滿足用戶的多種需求。在實(shí)現(xiàn)斷線自動(dòng)重連功能時(shí),涉及到DCD、RI兩個(gè)引腳的使用。DCD引腳用來實(shí)現(xiàn)模數(shù)轉(zhuǎn)換,當(dāng)模塊掉線時(shí),會(huì)給DCD引腳一個(gè)高電平,當(dāng)這個(gè)電平被DCD引腳檢測(cè)到之后,模塊就是采取相應(yīng)的動(dòng)作,來重新連接上線。RI引腳在模塊上線之后,就一直保持高電平,在有電話和短信進(jìn)來的時(shí)候,RI管腳就會(huì)有一個(gè)低電平出現(xiàn),當(dāng)RI引腳檢測(cè)到這個(gè)低電平的時(shí)候,模塊就會(huì)采取相應(yīng)動(dòng)作,進(jìn)入到短信或者電話模式。
圖4 SIM900A通信芯片
3 、無線通信模塊軟件設(shè)計(jì)
3.1 STM32的底層配置
為了實(shí)現(xiàn)STM32單片機(jī)與SIM900A模塊之間的數(shù)據(jù)通信,實(shí)現(xiàn)短信收發(fā)與數(shù)據(jù)傳輸兩大功能。首先要搭建開發(fā)平臺(tái),在工程中加入需要用到的庫函數(shù)以及配置文件,然后配置系統(tǒng)時(shí)鐘、中斷控制器、輸入輸出的GPIO以及相應(yīng)的串口。在配置這些參數(shù)的時(shí)候,首先需要對(duì)照原理圖進(jìn)行編寫,然后查看芯片用到哪些端口和這些端口的作用,這樣才能保證無誤。接下來就要對(duì)各個(gè)部分進(jìn)行配置,以保證模塊能夠正常運(yùn)行。
3.1.1 串口配置
開發(fā)環(huán)境搭建好之后,就可以配置端口參數(shù)了。對(duì)于本模塊,設(shè)置USART傳輸?shù)谋忍芈蕿? 600 b/s,字長為8 bit,1bit停止位,無檢驗(yàn)?zāi)J健T趯?duì)串口1、2、3初始化之后,打開串口的中斷響應(yīng)函數(shù):USART_ITConfig(USART1,USART_IT_RXNE,ENABLE)(以串口1為例),使能相應(yīng)的串口:USART_Cmd(USART1,ENABLE),這樣串口的配置就基本完成了。
3.1.2 中斷控制器的配置
首先配置優(yōu)先級(jí)分組,設(shè)置先占優(yōu)先級(jí)1位,從優(yōu)先級(jí)3位。本模塊定義了5個(gè)全局中斷,分別為:兩個(gè)RTC全局中斷、USART1全局中斷、USART2全局中斷、USART3全局中斷,分別對(duì)每一個(gè)中斷配置優(yōu)先級(jí),使能串口再初始化即可。需要注意的是,PC15管腳作為EXTI15的外部中斷輸入管腳,當(dāng)該管腳的電平為低電平的時(shí)候觸發(fā),模塊進(jìn)入短信模式,因此給這個(gè)中斷一個(gè)比較高的優(yōu)先級(jí),所以定義該中斷先占優(yōu)先級(jí)1位,從優(yōu)先級(jí)0位。在設(shè)置優(yōu)先級(jí)的時(shí)候,必須根據(jù)模塊的運(yùn)行情況,選擇最優(yōu)的中斷分組和優(yōu)先級(jí),才能保證程序運(yùn)行時(shí),能夠快速的響應(yīng)中斷。
3.2 無線通信模塊短信功能的實(shí)現(xiàn)
1) 短信收發(fā)具體過程
短信功能的實(shí)現(xiàn)主要涉及到兩個(gè)關(guān)鍵部分,一個(gè)是AT命令,另一個(gè)是串口的讀寫。AT命令是主控芯片STM32和SIM900A之間的通信協(xié)議,完成對(duì)SIM900A的控制。短信的收發(fā)主要有兩種模式,一種是文本模式,該模式只支持英文內(nèi)容,另一種是PDU模式。本模塊在完成初始化之后,首先通過USART向SIM900A發(fā)送“AT+回車”命令來檢查AT命令是否正常工作,如果返回OK,則表示能夠進(jìn)行接下來的短信功能。
SIM900A的短信功能主要分為兩個(gè)部分,第一:讀取短消息。讀取短消息的設(shè)置命令為:AT+CMGR,該命令生效后有兩個(gè)返回值:index和mode,index就是接收到的短信的編號(hào),我們將接收到的index內(nèi)容放在一個(gè)長度為30的buf中,再將buf寫入到串口3中,然后再讀取串口3中的內(nèi)容,這樣,短信的編號(hào)就獲取完畢。獲取了短信的編號(hào)之后,就能去獲取短信的具體內(nèi)容,而短信的內(nèi)容則存放在alpha中,它處于響應(yīng)的第三個(gè)位置,通過get_fw(at_string,phnum,19,2)可將短信的內(nèi)容取出來,這樣短信的內(nèi)容就獲取到了。第二:發(fā)送短消息。發(fā)送短消息的設(shè)置命令為:AT+CMGS,首先將發(fā)送短信的電話號(hào)碼存入到一個(gè)buf中,將這個(gè)buf寫入到串口3中,以此獲取手機(jī)號(hào)碼。而短信在發(fā)送的時(shí)候,短信內(nèi)容之前會(huì)帶一個(gè)“>”號(hào),在程序設(shè)計(jì)時(shí),只要檢測(cè)到“>”號(hào)時(shí),后面的內(nèi)容也就是短信發(fā)送的內(nèi)容,最后將短信的內(nèi)容寫到串口3即可。
2)相應(yīng)的AT命令
3.3 短信命令的定義
本模塊自定義了許多短消息命令來設(shè)置或者查詢模塊的參數(shù),具體為:SIP:IP地址設(shè)置命令、SPT:端口號(hào)設(shè)置命令、DID:ID號(hào)設(shè)置命令、ACON:自動(dòng)連接命令、PRT:打印命令、LIVE:心跳操作命令、CSQ:信號(hào)強(qiáng)度查詢命令。這些指令通過短信的方式來實(shí)現(xiàn)對(duì)模塊的操作。
拿SIP來舉例,它的實(shí)現(xiàn)過程為:首先把短信中的‘=’之前的字符取出來存放在sms_cmd中,然后將sms_cmd與SIP、SIT、DID、ACON、PRT、LIVE、CSQ來比較,如果等于其中一個(gè),則程序跳轉(zhuǎn)到相應(yīng)的部分來執(zhí)行相應(yīng)的操作。這里,strcmp(sms_cmd,“SIP”)==0,程序跳轉(zhuǎn)到SIP部分來執(zhí)行IP部分的操作。然后,將‘=’之后的字符取出來存放在sms_para中。通過字符串比較函數(shù)來判斷它是‘?’還是數(shù)字。如果是‘?'''',則表示該短信命令是一個(gè)查詢命令,就只需要用輸出顯示IP號(hào)給用戶看。如果是數(shù)字,則表示該短信命令是一個(gè)設(shè)置命令,就需要重新設(shè)置某些參數(shù)值,來改變模塊的運(yùn)行過程。對(duì)于SIP,如果''''=’之后是數(shù)字,就表示該短信是用戶用來設(shè)置模塊的IP地址的。此時(shí),就要把當(dāng)前的IP值賦給模塊的IP值就可以了。最后輸出顯示IP地址設(shè)置成功,則SPT部分的操作就完成了。
4、 無線通信模塊數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)
4.1 數(shù)據(jù)格式的定義
數(shù)據(jù)包的具體格式如下:
數(shù)據(jù)包頭已經(jīng)定義為S_PACKET_HEADER結(jié)構(gòu)類型,link_id為DWORD類型,對(duì)于發(fā)送,填寫目標(biāo)link_id,對(duì)于接收到的數(shù)據(jù)包,則為源link_id(由服務(wù)器自動(dòng)轉(zhuǎn)換填寫),結(jié)束標(biāo)志為0x01,數(shù)據(jù)Data則根據(jù)具體的命令而各不相同。
4.2 登陸、退出的協(xié)議過程
后臺(tái)軟件根據(jù)指定的服務(wù)器地址和端口號(hào)發(fā)起TCP連接請(qǐng)求,連接成功后開始命令交互。工作過程描述如下:
1)后臺(tái)軟件首先采用CMD_LOGIN命令,登陸到通信服務(wù)器,在登陸成功之前,發(fā)送其他任何命令服務(wù)器都不處理。發(fā)送CMD_LOGIN:FORWARD給服務(wù)器,攜帶數(shù)據(jù)為S_TERMINAL。該命令的目標(biāo)link_id設(shè)為0,表示發(fā)送給服務(wù)器,而不是給其他終端。
2)服務(wù)器在CMD_LOGIN:RESPONSE_OK中將其他在線模塊的信息發(fā)送過來,從而在客戶端應(yīng)用程序形成在線模塊列表。后臺(tái)若收到CMD_LO GIN:;RESPONSE_FAILED回應(yīng),則失敗。收到CMD_LOGIN:RESPONSE_OK回應(yīng),則成功,攜帶數(shù)據(jù)為S_TERMINAL。
3)后臺(tái)軟件定時(shí)發(fā)送CMD_KEEP_LIVE命令,以維持鏈路不被網(wǎng)絡(luò)和服務(wù)器終止。每個(gè)在線設(shè)備必須在一定的時(shí)間間隔內(nèi)向服務(wù)器發(fā)送CMD_ KEEP_LIVE信息。服務(wù)器將對(duì)此作檢查,若某設(shè)備在一定的時(shí)間間隔內(nèi)沒有發(fā)送CMD_KEEP_LIVE信息,則認(rèn)為該設(shè)備已經(jīng)“死亡”,服務(wù)器將斷開其連接。
4)后臺(tái)軟件可對(duì)模塊列表中的任意模塊進(jìn)行操控。
5)后臺(tái)軟件退出時(shí),用戶設(shè)備應(yīng)首先發(fā)送CMD_LOGOFF命令到服務(wù)器,告訴服務(wù)器“我要退出”,該命令的目標(biāo)link_id設(shè)為0。在發(fā)送CMD _LOGOFF:FORWARD給服務(wù)器時(shí),不需要攜帶數(shù)據(jù)。
圖5 登陸,推出的協(xié)議過程
4.3 數(shù)據(jù)傳輸具體過程
首先要定義建立TCP連接與關(guān)閉TCP連接的函數(shù),涉及到的AT指令為AT+CIPSTART和AT+CIPCLOSE。建立TCP連接時(shí),先把AT+CIPSTART指令寫到串口3中,然后該指令生效后,會(huì)返回一個(gè)“CONNECT”,之后只要檢測(cè)到有返回值“CONNECT”,就表示TCP連接已經(jīng)建立成功。關(guān)閉TCP連接與建立TCP連接類似,AT+CIPCLOSE指令生效后會(huì)返回一個(gè)“CLOSE OK”,只要檢測(cè)到“CLOSE OK”,就表示TCP連接已經(jīng)關(guān)閉。
TCP連接建立好以后,透傳模式就已經(jīng)被開啟,此時(shí)就可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與讀取。
當(dāng)用戶要發(fā)送數(shù)據(jù)時(shí),就必須根據(jù)數(shù)據(jù)包的結(jié)構(gòu)來發(fā)送數(shù)據(jù),首先把包頭寫入到串口3中,如果有數(shù)據(jù),則把數(shù)據(jù)內(nèi)容和接收對(duì)象一并寫入到串口3中,這樣數(shù)據(jù)的發(fā)送就完成了。
讀取數(shù)據(jù)時(shí),只要有數(shù)據(jù)過來,就一次一個(gè)字節(jié),把數(shù)據(jù)存放到user_string[i]中,然后i++,再次接收數(shù)據(jù)。
至于數(shù)據(jù)讀取到什么時(shí)候結(jié)束,本程序定義了3種結(jié)束的情況:1)如果用戶定義了數(shù)據(jù)的長度,就讀取到最后一個(gè)字節(jié)才結(jié)束。2)如果用戶沒有定義數(shù)據(jù)的長度,就在讀取到回車符的時(shí)候結(jié)束。3)如果遇到既沒有已定義的數(shù)據(jù)包長度,又沒有讀取到回車符的情況時(shí),就在數(shù)據(jù)存放的長度超過user_string[i]總長度的四分之三的時(shí)候結(jié)束,或者在超過100毫秒沒有數(shù)據(jù)發(fā)過來的時(shí)候結(jié)束數(shù)據(jù)的讀取。
4.4 相應(yīng)的AT命令
5 、斷線重連的處理
5.1 TCP鏈接的關(guān)閉和建立
TCP鏈接的建立涉及到的AT命令是at+cipstart,該指令有兩個(gè)返回值,分別是模塊的IP地址和端口號(hào)。首先將at+cipstart指令返回的當(dāng)前模塊的IP地址和端口號(hào)存放到一個(gè)buf中,然后將這個(gè)buf寫入到串口3中,如果之后能夠讀取到返回值“CONNECT”,就表示TCP鏈接已經(jīng)建立好。
TCP鏈接的關(guān)閉涉及到的AT命令是at+cipclose,該指令沒有返回值,可以直接將該指令寫到串口3中,如果檢測(cè)到“CLOSE OK”,就表示TCP鏈接已經(jīng)被關(guān)閉。
5.2 DCD的檢測(cè)
當(dāng)TCP建立起來之后,DCD引腳的電壓值便由高電平變?yōu)榈碗娖剑虼薉CD引腳的電平狀態(tài)可以用過來指示TCP的連接情況。在程序中,本文設(shè)置時(shí)鐘在檢測(cè)DCD引腳的狀態(tài)值,當(dāng)該引腳的電平值由高電平變?yōu)榈碗娖綍r(shí),就表示模塊模塊已經(jīng)掉線,然后模塊就重新開始登陸,直到登陸上為止。
5.3 TCP鏈接下的短信收發(fā)
本文定義了一個(gè)全局中斷,當(dāng)有短信或者電話到達(dá)模塊時(shí),RI引腳的電平便會(huì)由高電平變?yōu)榈碗娖剑藭r(shí)便會(huì)觸發(fā)全局中斷,模塊立即轉(zhuǎn)而處理短信收發(fā)或者數(shù)據(jù)傳輸。
6、 測(cè)試效果
本模塊在設(shè)計(jì)完成之后,在實(shí)驗(yàn)室穩(wěn)定運(yùn)行了2周時(shí)間,沒有出現(xiàn)什么問題。然后又進(jìn)行了特殊情況的測(cè)試,在模塊斷電后恢復(fù)供電,數(shù)據(jù)中心斷電后重新上電的情況下,都能夠重新連接上線,并且能夠繼續(xù)穩(wěn)定運(yùn)行。隨后模塊又被送到廠方使用,在被使用了3周之后,廠方反應(yīng)模塊運(yùn)行情況良好,沒有掉線的情況。
7 、結(jié)論
本文設(shè)計(jì)的無線通信模塊,是利用STM32來控制SIM900A芯片,來實(shí)現(xiàn)短消息的收發(fā)與數(shù)據(jù)的無線傳輸。本設(shè)計(jì)完成了無線通信的硬件部分和軟件部分的設(shè)計(jì)與實(shí)現(xiàn)。在多次運(yùn)行試驗(yàn)時(shí),本模塊沒有出現(xiàn)掉線以及發(fā)熱等問題,非常穩(wěn)定。本次設(shè)計(jì)成本較低,運(yùn)行穩(wěn)定可靠,應(yīng)用范圍十分廣泛,利用SIM900A,降低了模塊的成本,使其更加具有商業(yè)價(jià)值。
(作者:霍濤,賈振堂,上海電力學(xué)院電子與信息工程)
推薦閱讀:
特別推薦
- 協(xié)同創(chuàng)新,助汽車行業(yè)邁向電氣化、自動(dòng)化和互聯(lián)化的未來
- 功率器件熱設(shè)計(jì)基礎(chǔ)(八)——利用瞬態(tài)熱阻計(jì)算二極管浪涌電流
- 用于模擬傳感器的回路供電(兩線)發(fā)射器
- 應(yīng)用于體外除顫器中的電容器
- 將“微型FPGA”集成到8位MCU,是種什么樣的體驗(yàn)?
- 能源、清潔科技和可持續(xù)發(fā)展的未來
- 博瑞集信推出高增益、內(nèi)匹配、單電源供電 | S、C波段驅(qū)動(dòng)放大器系列
技術(shù)文章更多>>
- 使用手持頻譜儀搭配高級(jí)軟件:精準(zhǔn)捕獲隱匿射頻信號(hào)
- 為什么超大規(guī)模數(shù)據(jù)中心要選用SiC MOSFET?
- 機(jī)電繼電器的特性及其在信號(hào)切換中的選型和應(yīng)用
- 雙向電源設(shè)計(jì)的優(yōu)點(diǎn)
- 利用兩個(gè)元件實(shí)現(xiàn) L 型網(wǎng)絡(luò)阻抗匹配
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
分頻器
風(fēng)力渦輪機(jī)
風(fēng)能
風(fēng)扇
風(fēng)速風(fēng)向儀
風(fēng)揚(yáng)高科
輔助駕駛系統(tǒng)
輔助設(shè)備
負(fù)荷開關(guān)
復(fù)用器
伽利略定位
干電池
干簧繼電器
感應(yīng)開關(guān)
高頻電感
高通
高通濾波器
隔離變壓器
隔離開關(guān)
個(gè)人保健
工業(yè)電子
工業(yè)控制
工業(yè)連接器
工字型電感
功率表
功率電感
功率電阻
功率放大器
功率管
功率繼電器