FPGA实现ESP8266驱动且进行数据包收发

这篇具有很好参考价值的文章主要介绍了FPGA实现ESP8266驱动且进行数据包收发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 简介

本次将使用正点原子的ESP8266 WIFI模块,来实现PC与FPGA之间的TCP通讯,其中ESP8266与FPGA之间的接口是UART。

二. 正点原子的ESP8266 WIFI模块介绍

模块实物图如下,到手就可以使用了,RST和IO_0两个IO口不接或者接高电平就可以了。

8266与fpga连接,FPGA,fpga开发,ESP8266

在使用之前,需要通过AT指令对模块进行配置,比如说是AP模式,还是STA模式。AP模式就是模块作为无线 WIFI 热点,允许其他 WIFI 设备连接到本模块;STA模式就是连接到其它的WIFI设备。具体的指令可以在正点原子论坛上下载。

三. ESP8266初始化

本次是将ESP8266配置成AP模式,充当TCP服务器,配置的AT指令如下(每个指令末尾均带有换行)。FPGA端只需要通过串口将这些AT指令依次发送出去即可完成配置。

8266与fpga连接,FPGA,fpga开发,ESP8266

先将这些指令的数据存储到memory中,就像下面这样。

reg[7:0]    rom0[14:0];
reg[7:0]    rom1[10:0];
reg[7:0]    rom2[43:0];
reg[7:0]    rom3[15:0];
reg[7:0]    rom4[44:0];

always@(*)begin
    rom0[0] = "A";
    rom0[1] = "T";
    rom0[2] = "+";
    rom0[3] = "C";
    rom0[4] = "W";
    rom0[5] = "M";
    rom0[6] = "O";
    rom0[7] = "D";
    rom0[8] = "E";
    rom0[9] = "=";
    rom0[10] = "2";
    rom0[11] = 8'h0D;
    rom0[12] = 8'h0A;
end

然后再初始化模块中依次发送出去即可,需要注意的是,每个指令的发送需要间隔一定的时间,因为ESP8266每接收到一个指令会返回一个应答(通常是OK),不等待的话,可能会导致下条指令接收错误。

全部发送完成后,模块会跳到S7状态,向外部发送初始化完成信号。

localparam S0 = 'd0;   //IDLE
localparam S1 = 'd1;   //AT + CWMODE = 2
localparam S2 = 'd2;   //AT + RST
localparam S3 = 'd3;   //AT + CWSP="ATK-ESP8266","12345678",1,4
localparam S4 = 'd4;   //AT + CIPMUX = 1
localparam S5 = 'd5;   //AT+CIPSERVER=1,8086
localparam S6 = 'd6;   //wait 10ms
localparam S7 = 'd7;   //ack

四. 发送数据

由于ESP8266配置的模式不支持透传模式,所以每次发送数据的时候,需要发送一个发送的AT指令,如下。这条AT指令发送完成后,也不能立马发送数据,需要等ESP8266做出响应后才能。这里发送数据的时候,不需要带换行。ID0: 第一个连接到tcp服务器的客户端。

8266与fpga连接,FPGA,fpga开发,ESP8266

五. 数据接收

当ESP8266模块,接收到数据的时候,会做出如下的响应。其中4是第四个连接到tcp服务器的客户端。
8266与fpga连接,FPGA,fpga开发,ESP8266

在接收数据的时候,需要先解析前面的+IPD,4,n: 这些字符。解析正确后,就将后面接收到的n字节数据作为有效数据。

//检测头部序列 是否正确
always@(posedge clk or negedge rst_n) begin
    if( rst_n == 1'b0 )
        head_index <= 'd0;
    else if( state == S_HEAD )
        if( head_index == 'd0 && esp8266_rx_done_i == 1'b1 )
            if( esp8266_rx_data_i == "+" )
                head_index <= head_index + 1'b1;
            else
                head_index <= 'd0;
        else if( head_index == 'd1 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "I" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd2 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "P" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd3 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "D" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd4 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "," )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd5 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "0" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd6 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "," )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd7 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "1" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd8 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == "6" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else if( head_index == 'd9 && esp8266_rx_done_i == 1'b1)
            if( esp8266_rx_data_i == ":" )
                head_index <= head_index + 1'b1;
            else if( esp8266_rx_data_i == "+" )
                head_index <=  'd1;
            else
                head_index <= 'd0;
        else
            head_index <= head_index;
    else
        head_index <= 'd0;
end

六. 整体设计

本次的设计主要是为了完成如下数据包格式的收发,所以设计不仅仅是单纯的收发,还包括数据包的整合和解析。有相同需求的,可以参考参考。

8266与fpga连接,FPGA,fpga开发,ESP8266

整个设计模块的层次图如下(高云的EDA软件RTL图有点拉胯)

8266与fpga连接,FPGA,fpga开发,ESP8266

关注微信公众号 FPGA之旅 回复 FPGA_ESP8266 获取完整工程。文章来源地址https://www.toymoban.com/news/detail-763686.html

到了这里,关于FPGA实现ESP8266驱动且进行数据包收发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

    阿里云物联网平台的接入方式有很多种,从阿里云提供的开发文档可以看到,支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等,并支持多种类型的设备接入。 对于阿里云物联网平台的接入,网上有许许多多的教程,有亲测有效的,表示感谢;也些教程留了有一些bu

    2024年02月02日
    浏览(36)
  • 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发。下面是采用通过cypress并安装usb官方驱动的环境搭建,后续继续更新程序的编写。 一、安装nodejs ①下载地址:https://nodejs.org/en/ ①.1: 安装时,除了选择安装路径根据需要选择外,其他都可以默认

    2024年02月06日
    浏览(58)
  • STM32驱动ESP8266连接阿里云(1)----使用AT指令连接阿里云

    购买的ESP8266一般没带MQTT固件,所以无法通过MQTT指令与云平台通信,需要烧录固件。 MQTT固件可以在安信可科技进行下载。 交流qun:6_15061293。 https://docs.espressif.com/projects/esp-at/zh_CN/release-v2.2.0.0_esp8266/index.html 下载器可以使用乐鑫官方的下载器。 https://www.espressif.com.cn/zh-hans/s

    2024年02月03日
    浏览(61)
  • AD9361纯逻辑FPGA驱动,单音信号收发例程,可动态配置9361

    AD9361纯逻辑FPGA驱动,单音信号收发例程,可动态配置9361,verilog代码,Vivado 2019.1工程。 在当前高度发达的科技时代,FPGA(Field Programmable Gate Array)已成为在数字电子领域中广泛应用的关键技术之一。FPGA作为一种可编程的集成电路,具备了硬件级的性能和灵活性,被广泛用于

    2024年04月13日
    浏览(37)
  • esp8266模块--MQTT协议连接服务器实现数据接收和发送+源码

    首先推荐中国移动的代码,我觉得中国移动的代码更为合理:(但是有一些其他的模块在里面) OneNET开发板代码、资料--2020-09-27--标准板、Mini板bug修复 - 开发板专区 - OneNET设备云论坛 (10086.cn) 以及这位b站up做的视频:(wifi模块在p9节) 【挽救小白第一季】STM32+8266+小程序智能

    2024年02月08日
    浏览(63)
  • STM32+ESP8266水墨屏天气时钟:ESP8266连接心知天气获取数据

    利用STM32F103C8T6和ESP8266模块进行通信,获取心知天气的数据。 硬件设计为串口1(PA9和PA10)连接ESP8266. 串口2打印 ESP8266模块可以通过AT指令控制搭配使用源代码API函数开发,总体开发速度快,难度较低。 说明:下面仅列举一些最常用的AT指令及用法,指令的详细参数及使用说明请

    2024年04月12日
    浏览(41)
  • microPython 吃透 esp8266 NodeMCU v3 ch340串口收发

    》》》》》》》》》》 这块板子的淘宝链接》 》》》》》》》》》》 1. usb口是ch340转UART0,双向收发 2. UART0 位于引脚 1 (TX) 和 3 (RX) 上。UART0是双向的,默认情况下用于REPL.,但是这块板子的RX 好像有问题使用引脚无法接收数据,因此使用引脚的UART0仅是TX。 3. 引脚 15 (

    2023年04月19日
    浏览(52)
  • 13-ESP8266连接MQTT服务器发送数据

    Author:teacherXue MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号

    2024年02月03日
    浏览(63)
  • ESP8266+STM32+MQTT发送数据到阿里云服务器(三、配置ESP8266模块并测试连接)

    1、固件烧录器 2、固件 3、串口工具 4、ESP866模块 5、USB转TTL模块 (以上软件工具文末分享的链接有,硬件请淘宝自行购买) 硬件如下图: 1、按照下面对照关系进行接线 USB转TTL ESP8266 3.3V 3V3 GND GND RX TX TX RX IO0 GND 2、打开固件烧录工具图标 3、点击“ OK ” 4、在出现的界面中,

    2024年03月23日
    浏览(52)
  • ESP8266 NodeMCU连接阿里云(从环境搭建到代码实现)

    ESP8266 NodeMCU是一款基于ESP8266芯片的开发板,因其体积小、功耗低、易于编程和扩展等特点,在物联网领域得到了广泛应用。阿里云IoT平台则为开发者提供了稳定可靠的物联网服务,包括设备接入、数据管理、远程控制等功能。本教程将指导你如何将ESP8266 NodeMCU连接到阿里云

    2024年04月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包