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

news2024/11/28 12:50:13

一. 简介

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

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

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

请添加图片描述

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

三. ESP8266初始化

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

请添加图片描述

先将这些指令的数据存储到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服务器的客户端。

请添加图片描述

五. 数据接收

当ESP8266模块,接收到数据的时候,会做出如下的响应。其中4是第四个连接到tcp服务器的客户端。
请添加图片描述

在接收数据的时候,需要先解析前面的+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

六. 整体设计

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

请添加图片描述

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

请添加图片描述

关注微信公众号 FPGA之旅 回复 FPGA_ESP8266 获取完整工程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++布隆过滤器和哈西切分

文章目录 一、布隆过滤器的提出二、布隆过滤器的概念三、布隆过滤器的实现布隆过滤器的插入布隆过滤器的判断在不在布隆过滤器的删除布隆过滤器的优点布隆过滤器的缺点 四、布隆过滤器的应用场景五、布隆过滤器的扩展[面试题]六、哈西切分 一、布隆过滤器的提出 我们在使用新闻…

GO 语言核心编程-全文版

第 1 章 1.1Golang的学习方向 Go语言&#xff0c;我们可以简单的写成Golang. Golang开山篇 1.2Golang的应用领域 1.2.1区块链的应用开发 1.2.2后台的服务应用 1.2.3云计算/云服务后台应用 1.3学习方法的介绍 1.4讲课的方式的说明 努力做到通俗易懂注重Go语言体系&#xff…

K8s之零故障升级Pod健康探测详解

文章目录 一、Pod健康探测介绍1、三种容器探测方法2、常用三种探测探针3、探针相关属性说明 二、探测案例1、Pod启动探测案例-startupProbe2、Pod存活探测案例-livenessProbe3、Pod就绪探测案例-readinessProbe4、启动、存活、就绪探测混合使用案例 三、总结 一、Pod健康探测介…

【MySQL新手到通关】第五章 多表查询

文章目录 1. 笛卡尔积1.1 避免笛卡尔积1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决笛卡尔积的错误会在下面条件下产生&#xff1a; 2. 多表查询分类讲解2.1 多表联查分类方式1&#xff1a;2.2 多表联查分类方式2&#xff1a;2.3 多表联查分类…

Eclipse教程 Ⅴ

Eclipse 创建 Java 类 打开新建 Java 类向导 你可以使用新建 Java 类向导来创建 Java 类&#xff0c;可以通过以下途径打开 Java 类向导&#xff1a; 点击 "File" 菜单并选择 New > Class在 Package Explorer 窗口中右击鼠标并选择 New > Class点击类的下拉…

c++输入输出文件操作stream

系列文章目录 C IO库 文章目录 系列文章目录前言一、文件IO概述coutcin其他istream类方法 文件输入和输出内核格式化总结 前言 一、文件IO 概述 c程序把输入和输出看作字节流。输入时&#xff0c;程序从输入流中抽取字节&#xff1a;输出时&#xff0c;程序将字节流插入到输…

springboot+ssm+java校园二手物品交易系统vxkyj

样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于Java语言、Jsp技术设计并实现了校园二手物品交易系统。系统主要包括个人中心、商家管理、用户管理、商品分类管理、商品信息管理、商…

中间件SOME/IP简述

SOME/IP SOME/IP 不是广义上的中间件&#xff0c;严格的来讲它是一种通信协议&#xff0c;但中间件这个概念太模糊了&#xff0c;所以我们也一般称 SOME/IP 为通信中间件。 SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩…

调用华为API实现身份证识别

调用华为API实现身份证识别 1、作者介绍2、调用华为API实现身份证识别2.1 算法介绍2.1.1OCR简介2.1.2身份证识别原理2.1.3身份证识别应用场景 2.2 调用华为API流程 3、代码实现3.1安装相关的包3.2代码复现3.3实验结果 1、作者介绍 雷千龙&#xff0c;男&#xff0c;西安工程大…

Spring Boot如何实现配置文件的自动加载和刷新?

Spring Boot如何实现配置文件的自动加载和刷新&#xff1f; 在使用Spring Boot开发应用程序时&#xff0c;配置文件是非常重要的组成部分。在不同的环境中&#xff0c;我们可能需要使用不同的配置文件&#xff0c;例如在开发、测试和生产环境中使用不同的配置文件。而且&#…

功能测试转到自动化测试,我的测试之路“狂飙”~20k...

前言 Python自动化测试&#xff1a;Python自动化测试&#xff0c;7天练完这60个实战项目&#xff0c;年薪过35w。 手动功能测试人员应该权衡测试自动化相对于功能测试的好处&#xff0c;并且即可开始行动。现在随着测试行业的发展&#xff0c;自动化测试已经成为每个测试人的标…

nodejs+vue大学生招聘网站应聘系统设计与实现5b14b

目前&#xff0c;伴随着Internet技术的日益成熟&#xff0c;互联网需要提供更多的服务&#xff0c;发达国家已形成以信息技术为核心&#xff0c;招聘网站支撑的现代化招聘公司技术格局。这便是今天为大家所熟悉的管理信息系统,网络发展为招聘网站实现信息化、自动化、智能化和集…

牛客小白月赛73DE

问题很好转化&#xff0c;但是对区间的处理没把握好&#xff0c;一直在纠结怎么o&#xff08;n&#xff09; 一开始想到二分了&#xff0c;但是没细想&#xff0c;结果看了讲解发现&#xff0c;其实就是一个前缀数组上对区间的查询的操作&#xff0c;以后再遇到此类问题直接向…

Git提交提交代码报错 Push failed unable to access

目录 场景 环境&#xff1a; Git配置 场景 Push failed unable to access https://github.com/1790753131/remotRepository3.git/: Failed to connect to github.com port 443 after 21114 ms: Couldnt connect to server Push failed unable to ac…

计算节点与存储设备是如何连接的?

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析。欢迎关注“数据存储张”,老张是深耕存储十几载,就业于存储No1公司的资深工程师。 无…

Keil 5 MDK 发律师函警告了,如何用STCubeIDE开发标准库的程序(STM32F103C8T6为例)

用STCubeIDE进行标准库开发 1、CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE 2、CubeIDE下载 点击上面的链接&#xff0c;登录即可下载 3、搭建Demo工程 新建一个工作空间 创建一个工程 选择芯片-STM32F103C8T6 填写工程信息 添加标准库到工程 标…

【数据结构与算法】图论及其相关算法

文章目录 图的基本介绍图的表示方式邻接矩阵邻接表 图的深度优先遍历(DFS)概述实现步骤代码实现 图的广度优先遍历(BFS)概述实现步骤代码实现 图的常用代码汇总最小生成树算法普里姆&#xff08;Prim&#xff09;算法算法实践 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法并…

西南交通大学智能监测 培训课程练习2

2023.05.27培训 task1&#xff1a;spring、springboot task2&#xff1a;mybatis 目录 一、使用IDEA创建工程 1.1新建 ​编辑 1.2选择Maven 1.3创建包 二、添加相关依赖 2.1添加依赖 2.2更新Maven 三、配置application.yaml文件 四、相关注解的使用和理解 4.1Componen…

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原22H2版本

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16G左右空u盘进行…

倒置字符串、猜名次、猜凶手、杨辉三角

目录 例一&#xff1a;倒置字符串 例二&#xff1a;猜名次 例三&#xff1a;猜凶手 例四&#xff1a;杨辉三角 方法一 方法二 例一&#xff1a;倒置字符串 首先我们先来看一下题目具体要求 再来看一下我们所需要的效果 这里呢&#xff0c;博主给出两种思路&#xff0c;…