基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)

根据正点原子的《ATK-ESP8266 WIFI用户手册》,使用XCOM V2.2串口调试助手测试WIFI模块[26]。在本系统中运用到的功能主要是TCP/IP模式中的TCP Client透传模式。发送指令的顺序如下:

  1. 设置WIFI的模式为STA模式:AT+CWMODE=1响应:OK
  2. 重启使命令生效:AT+RST。响应:OK
  3. 联网:AT+CWJAP="wy225","pcblab225"(连接WIFI名称(ssid)密码)。响应:OK WIFIconnect GOTip
  4. 连接服务器:AT+CIPSTART="TCP","www.mjywxy.xin",80。响应:CONNECT OK
  5. 开启透传模式:AT+CIPMODE=1。响应:OK
  6. 开始透传:AT+CIPSEND。响应: OK >
  7. 最后使用+++”退出透传模式

结果如下使用GET方法,通过HTTP请求的方法发送数据,得到服务器返回的数据如下。

 

图1 WIFI调试之HTTP请求

服务器端wifi.php程序主要代码如下。

 

图2 wifi.php主要程序

第一个if判断,是否获取到数据;第二个if判断获取到数据中a的值是否是01。如果是则表示存储a的值到wifi.dat文件中,否则从wifi.dat文件中读取a的值返回。

 

…… FPGA-UART-WIFI

原计划UART部分使用NiosII搭建,但是使用片上ROM进行搭建系统时会提示内存不足,ELF文件下载失败。EP4CE6E22C8N只有276480bits的片上ROM。但是NiosII+UART需要27480Byte,编译显示超过片上ROM106%内存占用率。故需用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 ProbeIP核,完成在线发送和接收功能。

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之自启动联网

首先发送数据到电脑上,通过串口调试助手,检测发送数据的格式是否有问题。一开始通过按键控制发送数据的内容,确认无误之后,再修改为自启动。其中,为了避免插拔的麻烦,直接定义两个相等的RXTX引脚,故定义模块的端口如下表。

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”表示数据接收完成,对应到程序中是“ ”。还有,发送“+++”表示退出透传模式,此时不需要“ ”,而且任何多余字符(包括空格、换行等)都不能有,否则无法退出透传模式[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灯指示。

原文地址:https://www.cnblogs.com/mjy2wxy/p/11089146.html