FPGA设计实例——基于FPGA的蓝牙通信实验_EGo1开发板上实现

FPGA设计实例——基于FPGA的蓝牙通信实验_EGo1开发板上实现

一、概述

本实验基于依元素科技有限公司的《蓝牙通信》实验进行改进,通过AT指令设置蓝牙模块的名称、查询蓝牙模块的地址等,然后利用EGo1开发板上的蓝牙模块与板卡进行串口通信,使用支持蓝牙4.0的手机与板卡上的蓝牙模块建立连接,并通过手机APP发送命令,控制FPGA板卡上的硬件外设。

二、实验原理

蓝牙无线技术是使用范围最广泛的全球短距离无线标准之一,EGo1开发板上板载的蓝牙模块是基于TI公司CC2541芯片的蓝牙4.0模块,具有256kb配置空间,遵循V4.0 BLE蓝牙规范。

本实验利用板卡上的蓝牙模块与外界支持蓝牙4.0标准的设备(如手机)进行交互。该蓝牙模块出厂默认配置为通过串口协议与FPGA进行通信,用户无需研究蓝牙相关协议与标准,只需要按照UART串口协议来处理发送与接收的数据即可,实验框图如图1所示。

图1 蓝牙通信实验的模块框图

本实验通过串口发送与串口接收模块来完成与蓝牙模块的数据传输,通过命令解析模块及命令响应模块来实现简单的串口命令的解析控制以及命令的执行,FPGA 在接收到蓝牙模块传输进来的串口数据后,会将相应数据以及命令响应通过蓝牙模块发送给与之连接的通信设备,在这个过程中采用 FIFO 来存储我们需要发送的数据。

在这个设计中,我们在串口协议基础上自定义了若干控制命令,以便于在远端设备上可以通过蓝牙对 FPGA 平台上的逻辑、外设以及接口进行控制。

主要包含以下命令:

(1)*Naaaa

(2)*Waaaaaaaa

上述2条命令中,星号(*)的作用是命令的起始位,N、W等大写字母作为命令的名称,小写字母a表示任意一个十六进制数。命令N后接4位十六进制数,即16bit数据,用于点亮板卡的LED灯,其后接16bit数据分别对应板卡上的16位LED灯;命令W后接8位十六进制数,即32bit数据,用于控制办卡上的七段数码管显示,其后接32bit数据分别对应板卡上8位七段数码管显示的数值。

三、实验平台搭建

3.1 EGo1 FPGA开发板

EGo1开发板的实物如图2所示,是依元素科技基于Xilinx Artix-7 FPGA研发的便携式数模混合基础教学平台,拥有丰富的外设:VGA接口、音频接口、USB-UART/JTAG接口、USB转PS2接口、2个4位数码管、16个LED灯、8个拨码开关、1个8位DSP开关、5个按键、1个模拟电压输入、1个DAC输出接口、SRAM存储器、SPI FLASH存储器、蓝牙模块和1个通用扩展接口。

EGo1开发板板载的FPGA芯片型号为Xilinx Artix-7系列XC7A35T-1CSG324,具有33280个逻辑单元、41600个寄存器、1800kb的BRAM和90个DSP等逻辑资源,可以实现较复杂的数字逻辑设计。

图2 EGo1开发板实物图

3.2 蓝牙模块介绍

EGo1上集成了蓝牙模块(BLE-CC41-A),位于开发板背面,FPGA通过串口和蓝牙模块进行通信。波特率支持1200,2400,4800,9600,14400,19200,38400,57600,115200和230400bps。串口缺省波特率为9600bps。该模块支持AT命令操作方法。EGo1开发板上的蓝牙模块原理图如图3所示。

图3 蓝牙模块电路原理图

3.3 蓝牙调试APP

在手机端安装蓝牙调试软件,本人使用的是“e调试”软件,如图4所示。

图4 蓝牙调试软件

3.4 查询/设置蓝牙模块的参数

使用AT指令查询和设置蓝牙模块的部分参数,为了方便查询和设置,将EGo1开发板的UART接口与蓝牙模块的UART接口交叉连接,代码如图5所示。

图5 查询/设置蓝牙模块参数的FPGA代码

拨动拨码开关对蓝牙进行复位,然后在电脑端打开串口调试助手,输入AT,返回OK;输入AT+NAME,查询名字,返回+NAME=<luoxing EGo1>;输入AT+NAME<my EGo1>,修改名字,返回+NAME=<my EGo1> OK,表示修改成功,也可以再次输入AT+NAME查看名字;最后输入AT+LADDR?查询地址,完成查询/设置蓝牙模块的参数,如图6所示。

图6 查询/设置蓝牙模块的参数

同时,还可以通过AT指令查询/设置蓝牙模块的波特率等参数,因为本实验暂不涉及,感兴趣的同学可以查看该蓝牙芯片对应的AT指令进行学习。

四、实验验证

使用依元素科技提供的蓝牙通信工程,工程总结界面如图7所示。

图7 蓝牙通信工程总结页面

将bit流文件下载到FPGA开发板中,SW1设置为低,SW0、SW2、SW3、SW4设置为高,首先波动拨码开关SW2(即代码中的sw_pin[2])对蓝牙模块进行复位,此时蓝牙处于Slave模式,蓝牙状态指示灯LED2闪烁较慢,开发板的拨码开关设置如图8所示。

图8 开发板的设置

在手机上打开e调试软件,根据蓝牙模块的名字或者地址,正确的与EGo1开发板上的蓝牙模块建立连接。前文已将蓝牙模块的名字设置为<my EGo1>,并且地址为04A316AA9C1F,点击进行连接即可,如图9所示。

图9 使用e调试软件建立与EGo1开发板的连接

在手机端输入*NF151,如图10所示,现象如图11所示,可以看出,LED灯的最右边为高位,最左边为低位,从右往左的亮灭分别为1111_0001_0101_0001,1代表点亮,0代表熄灭,与*NF151的设置一致。

图10 控制LED灯指令下发

图11 LED灯控制效果

在手机端输入*W87654321,如图12所示,现象如图13所示,数码管显示87654321,与设置一致,实验验证通过。

图12 控制数码管指令下发

图13 数码管控制效果

五、工程获取方法

点击链接:https://t.zsxq.com/ZaLiZ,加入知识星球——FPGA设计入门与提高,获取工程源码。

目前知识星球包括的优质FPGA工程如下:

【2-FPGA视频图像处理】_1_Sobel边缘检测

【3-FPGA数字信号处理】_1_DDS信号发生器

【3-FPGA数字信号处理】_2_CORDIC旋转模式实现sin和cos运算

【3-FPGA数字信号处理】_3_CORDIC向量模式实现arctan运算

【3-FPGA数字信号处理】_5_基于FPGA的CORDIC旋转模式实现sin和cos运算

【5-FPGA设计实例】_1_IIC OLED字符显示

【5-FPGA设计实例】_2_OLED 数字时钟

【5-FPGA设计实例】_3_DS18B20温度检测,OLED显示

【5-FPGA设计实例】_4_蓝牙通信_EGo1开发板

【5-FPGA设计实例】_5_超声波测距系统

【5-FPGA设计实例】_6_LCD1602驱动

Read more

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.