根据正点原子的《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灯指示。