在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > WIFI_ESP8266通信系統(tǒng)設(shè)計

      WIFI_ESP8266通信系統(tǒng)設(shè)計

      作者: 時間:2023-12-18 來源:電子森林 收藏

      實驗任務(wù)

      • 任務(wù):基于底板 完成WIFI_ESP8266通信系統(tǒng)設(shè)計并觀察調(diào)試結(jié)果
      • 要求:通過手機或電腦網(wǎng)絡(luò)調(diào)試助手給ESP8266模塊發(fā)送數(shù)據(jù),F(xiàn)PGA驅(qū)動ESP8266模塊獲取數(shù)據(jù),并顯示在底板的數(shù)碼管上。
      • 解析:要通過ESP8266實現(xiàn)WIFI通信有多種方式,本實驗采用方式:FPGA驅(qū)動ESP8266模塊,將ESP8266配置成SoftAP模式同時配置成TCP Server,手機或電腦連接ESP8266的WIFI熱點,網(wǎng)絡(luò)調(diào)試助手TCP Client連接到ESP8266的TCP Server,并發(fā)送數(shù)據(jù),F(xiàn)PGA讀取ESP8266數(shù)據(jù)并處理,最后顯示在8位數(shù)碼管上。

      實驗?zāi)康?/h4>

      在前面串口監(jiān)視系統(tǒng)設(shè)計實驗中我們學(xué)習(xí)了UART總線的驅(qū)動原理及設(shè)計實現(xiàn),本實驗主要了解WIFI通信TCP協(xié)議,熟悉AT指令集,掌握ESP8266模塊的配置方法,最終通過FPGA編程實現(xiàn)對ESP8266模塊的配置應(yīng)用。

      本文引用地址:http://www.biyoush.com/article/202312/453984.htm
      • 熟悉基本網(wǎng)絡(luò)通信原理,簡要了解TCP協(xié)議
      • 熟悉AT指令集,掌握ESP8266模塊的配置方法
      • FPGA通過UART配置ESP8266模塊的設(shè)計實現(xiàn)
      • 完成WIFI_ESP8266通信系統(tǒng)設(shè)計實現(xiàn)

      設(shè)計框圖

      根據(jù)前面的實驗解析我們可以得知,該設(shè)計可以拆分成以下功能模塊實現(xiàn),

      • WIFIESP8266:TOP模塊,同時負責(zé)對ESP8266配置和處理接收的數(shù)據(jù)。 * Baud:控制UART通信數(shù)據(jù)傳輸速率。 * UartRx:根據(jù)數(shù)據(jù)傳輸速率節(jié)拍控制UART數(shù)據(jù)接收。
      • UartTx:根據(jù)數(shù)據(jù)傳輸速率節(jié)拍控制UART數(shù)據(jù)發(fā)送。 * Segmentscan:通過驅(qū)動底板掃描式數(shù)碼管將串口接收的數(shù)據(jù)顯示出來。

      Top-Down層次設(shè)計

       

      模塊結(jié)構(gòu)設(shè)計

      實驗原理

      ESP8266模塊介紹

      ESP8266是ai-thinker公司推出的一款無線WIFI模塊,可以通過配置,和單片機上的串口進行通信,利用WIFI傳輸數(shù)據(jù)。模塊內(nèi)部使用樂鑫推出的低功耗高集成度的WIFI芯片,ESP8266EX內(nèi)置超低功耗32位RISK處理器,CPU最高時鐘頻率可達160Mhz,支持實時操作系統(tǒng)RTOS,和WIFI協(xié)議棧,可將高達80%的處理能力留給編程與開發(fā)。

      ESP8266模塊連接

      底板上的WIFI通信模塊ESP8266-12F電路圖如下:

      ESP8266-12F電路連接

      ESP8266模塊配置流程

      (1)取下小腳丫底板,將Baseboard的GPIO29與GPIO26用杜邦線連接起來,將GPIO27與GPIO28連接起來,這樣就實現(xiàn)了CP2102與ESP8266的互聯(lián)。

      CP2102與ESP8266手工互連

      (2)打開串口調(diào)試助手,發(fā)送“AT”(AT指令集后要換行),發(fā)送,如果連接無誤效果如下:

      ESP8266串口回路測試

      (3)保險起見,我們復(fù)位一下模塊,發(fā)送AT+RST,如無誤如下圖所示(亂碼為正?,F(xiàn)象,有返回ready即可):

      ESP8266軟件復(fù)位

      (4)如果你在一個存在WIFI的環(huán)境下,可以將ESP8266連入路由器,并獲得IP,首先,配置ESP8266的工作模式為sta,輸入AT+CWMODE=1,如無誤如下圖所示:

      ESP8266配置STA模式

      然后,我們掃描附近WIFI:

      顯示無線列表

      找到我們要連入的WIFI,本例中,我們連入“FHQ”,密碼為123456789

      配置無線連接

      我們可以從圖片中看到已經(jīng)成功連入并獲取到IP,你可以使用AT+CWQAP來斷開WIFI。

      (5)成功連入WIFI之后,我們就要開始配置透傳了,首先,配置連接模式為單連接:

      配置單連接模式

      (6)打開網(wǎng)絡(luò)調(diào)試助手,獲取本機IP與端口:

      網(wǎng)絡(luò)調(diào)試助手

      我們將協(xié)議類型改為TCP Server,端口號改為1234。

      配置網(wǎng)絡(luò)調(diào)試助手

      (7)回到串口調(diào)試助手,發(fā)送AT+CIPSTART=“TCP”,“192.168.20.125”,1234,連入該端口。發(fā)送AT+CIPMODE=1打開透傳。

      通過串口調(diào)試助手配置ESP8266連接電腦的服務(wù)器,打開透傳功能

      發(fā)送AT+CIPSEND進入透傳模式:

      進入透傳功能

      如果要退出透傳,則發(fā)送不帶回車的“+++”即可退出透傳模式。

      (8)我們在成功進入透傳模式后,在串口助手中發(fā)送”hello”,如連接無誤,你可以在網(wǎng)絡(luò)調(diào)試助手端接收到“hello”。

      透傳通信

      你也可以在網(wǎng)絡(luò)調(diào)試助手端發(fā)送數(shù)據(jù),串口段也可接收到:

      透傳通信

      這樣就完成了ESP8266的網(wǎng)絡(luò)通訊。

      系統(tǒng)總體實現(xiàn)

      本實驗我們將ESP8266配置成SoftAP模式,同時配置成服務(wù)器,采用下表中的指令對ESP8266模塊進行配置。

      ESP8266配置指令表:

      序號發(fā)送指令作用
      1AT+CWMODE=2設(shè)置模塊WIFI模式為SoftAP模式
      2AT+CWSAP=”STEPFPGA“,”12345678“,5,4 |設(shè)置模塊的AP參數(shù):SSID為STEPFPGA,密碼為12345678,通道號為5,加密方式為WPAWPA2PSK
      3AT+RST重啟生效
      4AT+CIPMUX=1開啟多連接
      5AT+CIPSERVER=1,8686開啟SERVER模式,端口設(shè)置為8686

      這里我們發(fā)送的各種指令,實際發(fā)送的數(shù)據(jù)為字符對應(yīng)的ASCII碼,所以在FPGA程序?qū)崿F(xiàn)的時候就是要取AT指令的ASCII碼值,例如”AT+RST”復(fù)位指令,通過串口調(diào)試助手發(fā)送的數(shù)據(jù)為<0x41,0x54,0x2B,0x52,0x53,0x54,0x0D,0x0A>,每個字符的ASCII碼都是8位位寬的數(shù)據(jù),其中0x41為A的ASCII碼,0x0D和0x0A為回車換行的ASCII碼, Verilog語言中使用雙引號獲取字符的ASCII碼。

      變量char表示AT指令數(shù)據(jù),變量num表示AT指令中包含的字符數(shù)量(包含回車和換行),程序?qū)崿F(xiàn)如下:

      MAIN:begin
              if(cnt_main >= 4'd5) cnt_main <= 4'd5;    //write mode
              else cnt_main <= cnt_main + 1'b1;
              case(cnt_main)
                  4'd0: begin num<=8'd13; char<={"AT+CWMODE=2",16'h0d0a};state<=TXMD; end
                  4'd1: begin num<=8'd37; char<={"AT+CWSAP=",8'h22,"STEP_FPGA",8'h22,",",8'h22,"12345678",8'h22,",5,4",16'h0d0a};state <= TXMD; end
                  4'd2: begin num<=8'd08; char <= {"AT+RST",16'h0d0a};state <= TXMD; end
                  4'd3: begin num<=8'd13; char<={"AT+CIPMUX=1",16'h0d0a};state<=TXMD; end
                  4'd4: begin num <= 8'd21; char <= {"AT+CIPSERVER=1,8686",16'h0d0a};state <= TXMD; end
                  4'd5: begin state <= REMD; end
                  default: state <= IDLE;
              endcase
          end

      我們使用狀態(tài)機的MAIN狀態(tài)控制我們需要配置的所有指令數(shù)據(jù),你可以比喻成帝王,把握整個設(shè)計的大局。

      使用AT指令集控制ESP8266模塊是UART接口,我們前面串口監(jiān)視系統(tǒng)設(shè)計實驗詳細講解了UART通信,本實驗需要例化UART模塊進行數(shù)據(jù)傳輸,如下:

      /////////////////////////uart_tx module//////////////////////
      Baud #
      (.BPS_PARA               (BPS_PARA       )
      )  
      Baud_tx(.clk                    (clk            ),  //系統(tǒng)時鐘 12MHz
      .rst_n                  (rst_n          ),  //系統(tǒng)復(fù)位,低有效
      .bps_en                 (bps_en_tx      ),  //接收時鐘使能
      .bps_clk                (bps_clk_tx     )   //接收時鐘輸出
      ); 
      Uart_Tx Uart_Tx_uut(.clk                    (clk            ),  //系統(tǒng)時鐘 12MHz
      .rst_n                  (rst_n          ),  //系統(tǒng)復(fù)位,低有效
      .bps_en                 (bps_en_tx      ),  //發(fā)送時鐘使能
      .bps_clk                (bps_clk_tx     ),  //發(fā)送時鐘輸入
      .tx_data_valid          (tx_data_valid  ),  //發(fā)送數(shù)據(jù)有效脈沖
      .tx_data_in             (tx_data_in     ),  //要發(fā)送的數(shù)據(jù)
      .uart_tx                (wifi_tx        )   //UART發(fā)送輸出
      );

      Baud模塊和UartTx模塊配合完成UART發(fā)送數(shù)據(jù)的功能,前級電路通過txdatavalid和txdatain[7:0]端口將數(shù)據(jù)傳遞給UartTx模塊,然后Uart_Tx模塊將數(shù)據(jù)按照UART總線時序發(fā)送出去,框圖如下:

      UART發(fā)送功能設(shè)計實現(xiàn)

      我們使用之前設(shè)計的UART發(fā)送模塊將需要傳遞的數(shù)據(jù)通過UART總線發(fā)送出去,你可以比喻成士兵,是具體的執(zhí)行人員。

      帝王把握整體設(shè)計,有哪些數(shù)據(jù)需要傳輸;士兵只會干活,UART傳輸實現(xiàn),每次傳輸8位數(shù)據(jù);我們還需要一名將軍,按照帝王的要求指揮士兵完成任務(wù)。所以每當(dāng)MAIN(帝王)狀態(tài)跳轉(zhuǎn)到TXMD(將軍)狀態(tài)后,TXMD狀態(tài)完成對UartTx模塊txdatavalid和txdata_in[7:0]端口的配置。

      TXMD:begin
              case(cnt_txmd)
                  3'd0:   if(bps_en_tx) cnt_txmd <= cnt_txmd; 
                          else cnt_txmd <= cnt_txmd + 1'b1;
                  3'd1:   begin num <= num - 1'b1; cnt_txmd <= cnt_txmd + 1'b1; end
                  3'd2:   begin tx_data_valid <= 1'b1; tx_data_in <= char[(num*8)+:8]; cnt_txmd <= cnt_txmd + 1'b1; end
                  3'd3:   begin 
                              tx_data_valid <= 1'b0; 
                              if(num>=1'b1) cnt_txmd <= 3'd0;
                              else cnt_txmd <= cnt_txmd + 1'b1;
                          end
                  3'd4:   begin state <= DELAY; cnt_txmd <= 1'b0; end
                  default: state <= IDLE;
              endcase
          end

      到這里對ESP8266的配置已經(jīng)完成了,假設(shè)用手機或電腦連接該網(wǎng)絡(luò):STEP_FPGA,同時打開網(wǎng)絡(luò)調(diào)試助手作為TCP Client連接TCP服務(wù)器:192.168.4.1,端口號:8686,那么就可以給ESP8266發(fā)數(shù)據(jù)了,ESP8266模塊接收到WIFI數(shù)據(jù),然后以UART總線時序發(fā)送給FPGA,F(xiàn)PGA需要UART總線的接收模塊接收數(shù)據(jù),所以設(shè)計中還需要對UART接收功能模塊的例化,程序?qū)崿F(xiàn)如下:

      ////////////////////////uart_rx module/////////////////////
      Baud #
      (
      .BPS_PARA               (BPS_PARA       )) Baud_rx(   
      .clk                    (clk            ),  //系統(tǒng)時鐘 12MHz
      .rst_n                  (rst_n          ),  //系統(tǒng)復(fù)位,低有效
      .bps_en                 (bps_en_rx      ),  //接收時鐘使能
      .bps_clk                (bps_clk_rx     )   //接收時鐘輸出
      ); 
      Uart_Rx Uart_Rx_uut(.clk                    (clk            ),  //系統(tǒng)時鐘 12MHz
      .rst_n                  (rst_n          ),  //系統(tǒng)復(fù)位,低有效
      .bps_en                 (bps_en_rx      ),  //接收時鐘使能
      .bps_clk                (bps_clk_rx     ),  //接收時鐘輸入
      .uart_rx                (wifi_rx        ),  //UART接收輸入
      .rx_data_valid          (rx_data_valid  ),  //接收數(shù)據(jù)有效脈沖
      .rx_data_out            (rx_data_out    )   //接收到的數(shù)據(jù)
      );

      Baud模塊和UartRx模塊配合完成UART接收數(shù)據(jù)的功能,UartRx模塊按照UART總線時序接收數(shù)據(jù),然后將接收到的數(shù)據(jù)通過rxdatavalid和rxdataout[7:0]端口輸出給后級電路,框圖如下:

      UART接收功能設(shè)計實現(xiàn)

      WIFI通信

      當(dāng)我們連接服務(wù)器,使用網(wǎng)絡(luò)調(diào)試助手發(fā)送數(shù)據(jù)<123>,ESP8266模塊接收WIFI信號,并通過UART返回數(shù)據(jù)<+IPD,0,3:123>,如上圖所示,想要將123顯示在數(shù)碼管上,需要對UART接收的數(shù)據(jù)進行解析,包括兩個方面, 1)接收到的數(shù)據(jù)中<+IPD,0,3:>部分不能顯示,需要排除,只顯示數(shù)據(jù)<123> 2)數(shù)據(jù)以ASCII碼形式接收,需要解析成字符數(shù)據(jù)

      UART數(shù)據(jù)中被舍棄的數(shù)據(jù)<+IPD,0,3:>,我們可以簡單的使用加號<+>和冒號<:>來控制顯示的部分,例如顯示冒號以后且加號以前的數(shù)據(jù),程序?qū)崿F(xiàn)如下

      //解析UART通信,控制只顯示有效數(shù)據(jù)部分
      always @ (posedge clk or negedge rst_n) begin
          if(!rst_n) display_en <= 1'b0;
          else if((state == REMD)&&(rx_data_valid))
              case(rx_data_out)
                  ":": display_en <= 1'b1;
                  "+": display_en <= 1'b0;
                  default: display_en <= display_en;
              endcase
          else display_en <= display_en;
          end

      ASCII碼數(shù)據(jù)譯碼成對應(yīng)的字符數(shù)據(jù),程序?qū)崿F(xiàn)如下:

      //對接收的ASCII碼值解碼,只對應(yīng)0~9的數(shù)字
      always @ (posedge clk or negedge rst_n) begin
          if(!rst_n) seg_data_r <= 4'ha;
          else if((state == REMD)&&(rx_data_valid)) 
              case(rx_data_out)
                  "0": seg_data_r <= 4'd0;
                  "1": seg_data_r <= 4'd1;
                  "2": seg_data_r <= 4'd2;
                  "3": seg_data_r <= 4'd3;
                  "4": seg_data_r <= 4'd4;
                  "5": seg_data_r <= 4'd5;
                  "6": seg_data_r <= 4'd6;
                  "7": seg_data_r <= 4'd7;
                  "8": seg_data_r <= 4'd8;
                  "9": seg_data_r <= 4'd9;
                  default: seg_data_r <= seg_data_r;
              endcase
          else seg_data_r <= seg_data_r;
          end

      最后將顯示部分的字符數(shù)據(jù)放到移位寄存器中緩存,程序?qū)崿F(xiàn)如下:

      reg             [35:0]  seg_data;//移位寄存器,UART接收數(shù)據(jù)的buffer
      always @ (posedge clk or negedge rst_n) begin
          if(!rst_n) begin
              seg_data <= 36'haaaa_aaaa_a;    // 本實驗a對應(yīng)數(shù)碼管字庫為不顯示
          end else if(!display_en_r2) begin   //
              seg_data <= 36'haaaa_aaaa_a;
          end else if(rx_data_valid_r1) begin
              seg_data <= {seg_data[31:0],seg_data_r};
          end else seg_data <= seg_data;
          end

      例化掃描式數(shù)碼管驅(qū)動模塊,將移位寄存器緩存的數(shù)據(jù)顯示在數(shù)碼管上,程序?qū)崿F(xiàn)如下:

      Segment_scan Segment_scan_uut
      (
      .clk                    (clk                ),      //系統(tǒng)時鐘 12MHz
      .rst_n                  (rst_n              ),      //系統(tǒng)復(fù)位 低有效
      .dat_1                  (seg_data[31:28]    ),     //SEG1 顯示的數(shù)據(jù)輸入
      .dat_2                  (seg_data[27:24]    ),     //SEG2 顯示的數(shù)據(jù)輸入
      .dat_3                  (seg_data[23:20]    ),     //SEG3 顯示的數(shù)據(jù)輸入
      .dat_4                  (seg_data[19:16]    ),     //SEG4 顯示的數(shù)據(jù)輸入
      .dat_5                  (seg_data[15:12]    ),     //SEG5 顯示的數(shù)據(jù)輸入
      .dat_6                  (seg_data[11: 8]    ),     //SEG6 顯示的數(shù)據(jù)輸入
      .dat_7                  (seg_data[ 7: 4]    ),     //SEG7 顯示的數(shù)據(jù)輸入
      .dat_8                  (seg_data[ 3: 0]    ),     //SEG8 顯示的數(shù)據(jù)輸入
      .dat_en                 (8'b1111_1111       ),     //數(shù)碼管數(shù)據(jù)位顯示使能
      .dot_en                 (8'b0000_0000       ),     //數(shù)碼管小數(shù)點位顯示使能
      .seg_rck                (seg_rck            ),      //74HC595的RCK管腳
      .seg_sck                (seg_sck            ),      //74HC595的SCK管腳
      .seg_din                (seg_din            )       //74HC595的SER管腳
      );

      實驗步驟

      1. 雙擊打開Quartus Prime工具軟件;
      2. 新建工程:File → New Project Wizard(工程命名,工程目錄選擇,設(shè)備型號選擇,EDA工具選擇);
      3. 新建文件:File → New → Verilog HDL File,鍵入設(shè)計代碼并保存;
      4. 設(shè)計綜合:雙擊Tasks窗口頁面下的Analysis & Synthesis對代碼進行綜合;
      5. 管腳約束:Assignments → Assignment Editor,根據(jù)項目需求分配管腳;
      6. 設(shè)計編譯:雙擊Tasks窗口頁面下的Compile Design對設(shè)計進行整體編譯并生成配置文件;
      7. 程序燒錄:點擊Tools → Programmer打開配置工具,Program進行下載;
      8. 觀察設(shè)計運行結(jié)果。

      實驗現(xiàn)象

      將設(shè)計加載到FPGA,手機或電腦WIFI連接到STEP_FPGA網(wǎng)絡(luò)上,打開網(wǎng)絡(luò)調(diào)試助手配置成TCP Client連接TCP服務(wù)器:192.168.4.1,端口號:8686,發(fā)送0~9的阿拉伯?dāng)?shù)字,底板數(shù)碼管就能顯示出來,當(dāng)一次發(fā)送超過8位數(shù)據(jù),只顯示后面的8位數(shù)據(jù)。例如,網(wǎng)絡(luò)調(diào)試助手發(fā)送數(shù)據(jù)<123>,數(shù)碼管顯示123。

      實驗現(xiàn)象



      評論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉