根據正點原子的《ATK-ESP8266 WIFI用戶手冊》,使用XCOM V2.2串口調試助手測試WIFI模塊[26]。在本系統中運用到的功能主要是TCP/IP模式中的TCP Client透傳模式。發送指令的順序如下:
- 設置WIFI的模式為STA模式:AT+CWMODE=1。響應:OK
- 重啟使命令生效:AT+RST。響應:OK
- 聯網:AT+CWJAP="wy225","pcblab225"(連接WIFI的名稱(ssid)和密碼)。響應:OK WIFIconnect GOTip
- 連接服務器:AT+CIPSTART="TCP","www.mjywxy.xin",80。響應:CONNECT OK
- 開啟透傳模式:AT+CIPMODE=1。響應:OK
- 開始透傳:AT+CIPSEND。響應: OK >
- 最后使用“+++”退出透傳模式
結果如下使用GET方法,通過HTTP請求的方法發送數據,得到服務器返回的數據如下。
圖1 WIFI調試之HTTP請求
服務器端wifi.php程序主要代碼如下。

圖2 wifi.php主要程序
第一個if判斷,是否獲取到數據;第二個if判斷獲取到數據中a的值是否是0或1。如果是則表示存儲a的值到wifi.dat文件中,否則從wifi.dat文件中讀取a的值返回。
…… FPGA-UART-WIFI
原計划UART部分使用NiosII搭建,但是使用片上ROM進行搭建系統時會提示內存不足,ELF文件下載失敗。EP4CE6E22C8N只有276480bits的片上ROM。但是NiosII+UART需要27480Byte,編譯顯示超過片上ROM的106%內存占用率。故需用SDRAM(只買了SDRAM)作為系統的復位向量和錯誤向量,而NiosII與原來用Verilog寫的系統要共用SDRAM,這無疑增加了系統的復雜程度,而且難以實現,故采用純Verilog進行整個系統的編寫。
…… UART_TX
為了進行串口通信,首先進行串口發送模塊程序的編寫。其功能是每次發送一個字節的數據(串轉並),並可通過baud_set選擇不同的波特率,用tx_done信號表示已經發送完成。其端口定義如下。
表1 UART發送模塊端口定義
| 端口名 |
位寬 |
輸入 / 輸出 |
說明 |
| clk |
1 |
input |
時鍾信號50MHz |
| rst_n |
1 |
input |
復位信號,低電平有效 |
| data_byte |
8 |
input |
要發送的數據 |
| send_en |
1 |
input |
為1使能發送(一個脈沖就好) |
| baud_set |
3 |
input |
波特率選擇端 |
| rs232_TX |
1 |
output |
數據串行輸出引腳 |
| tx_done |
1 |
output |
發送完成標志信號 |
| uart_state |
1 |
output |
發送狀態,為1表示正在發送中 |
具體實現方法,包括波特率的計算、激勵文件的編寫等,參照《小梅哥的教學視頻》
…… UART_RX
關於串口接收程序,同樣參照《小梅哥的教學視頻》,有波特率的選擇、接收數據存儲(串轉並)和接收完成標志等功能。在頂層文件中例化uart的發送模塊,使用“In-System Source and Probe”IP核,完成在線發送和接收功能。
表2 UART接收模塊端口定義
| 端口名 |
位寬 |
輸入 / 輸出 |
說明 |
| clk |
1 |
input |
時鍾信號50MHz |
| rst_n |
1 |
input |
復位信號,低電平有效 |
| data_byte |
8 |
output |
接收到的數據 |
| baud_set |
3 |
input |
波特率選擇端 |
| rs232_RX |
1 |
input |
數據串行輸入引腳 |
| Rx_done |
1 |
output |
接收完成標志信號 |
…… UART_WIFI之自啟動聯網
首先發送數據到電腦上,通過串口調試助手,檢測發送數據的格式是否有問題。一開始通過按鍵控制發送數據的內容,確認無誤之后,再修改為自啟動。其中,為了避免插拔的麻煩,直接定義兩個相等的RX和TX引腳,故定義模塊的端口如下表。
表3 UART配置WIFI自啟動聯網模塊端口定義
| 端口名 |
位寬 |
輸入 / 輸出 |
說明 |
| clk |
1 |
input |
時鍾信號50MHz |
| rst_n |
1 |
input |
復位信號,低電平有效 |
| key |
1 |
input |
按鍵 |
| rs232_tx |
1 |
output |
數據串行輸出引腳 |
| rs232_rx |
1 |
input |
數據串行輸入引腳 |
| test_tx |
1 |
output |
方便測試用,等於rs232_tx |
| test_rx |
1 |
input |
方便測試用,等於rs232_rx |
| led |
1 |
output |
LED燈,接收到指定數據的標志 |
關於程序,首先初始化要發送的數據,如圖7-4示。其中,由於之前連接了WIFI,模塊會保存賬號和密碼,故可不發送WIFI賬號和密碼。重啟之后,模塊會在5秒之內自動連接到WIFI,並獲得IP。
關於波特率設置,因為ESP8266每次重啟之后,都會把波特率自動設置為115200,故配置UART的波特率為115200。
圖3 自啟動聯網相關配置數據
需要注意的是,WIFI模塊數據接收時,以十六進制的“0A 0D”表示數據接收完成,對應到程序中是“\r\n”。還有,發送“+++”表示退出透傳模式,此時不需要“\r\n”,而且任何多余字符(包括空格、換行等)都不能有,否則無法退出透傳模式[26]。
另外,還有一個需要注意的點是,Verilog中必須用雙引號包圍字符串。且發送CIPSTART的字符串時,也必須用雙引號。故此時就必須用反斜杠轉義雙引號。
首先,通過計數器cnt判斷發送到第幾字節了。由於字符串寄存器最大設置了42字節,所以當發送完第42字節時,讓cnt清零。相關程序如下:
圖4 發送完42字節清零寄存器
其中delay1s_cnt是延時1秒計數器,為了實現自動啟動(發送完一個字符串之后,自動發送下一個字符串)而設置。delay5s_cnt是延時5秒計數器,目的是為了保證模塊能獲得IP后再操作。
接下來開始按字符串的順序發送,其中,為了使每次都能正常退出透傳模式,在程序開始,首先發送“+++”。之后,發送復位信號,使ESP8266重啟,此時需要等待5秒延時,才能保證模塊已獲得IP,能夠進行之后的數據發送。

圖5 發送數據轉換程序
由於uart_tx模塊每次只能發送一個字節,所以需要一個移位寄存器來表示,每次應該發送第幾個字節。相關代碼如下。

圖6 移位寄存器的實現
對於接收模塊,接收完成后判斷當接收到0時,讓LED燈亮;接收到K時,讓LED燈熄滅。實現其功能的代碼如圖所示。

圖7 接收到指定字符,執行相應操作代碼
將LED與單片機的舵機信號直連(使用電阻分壓),即可實現WIFI控制舵機,使攝像頭旋轉或者停止。關於程序部分,直接例化此模塊到myCamera的頂層文件即可。
…… 最終顯示結果

圖8 WIFI控制的顯示結果
從圖中可以看出網頁可以實現對藍色LED的亮滅控制。由於舵機控制無法從圖片上提現出來,故用LED燈指示。
