ESP32C3中BLE开发问题汇总
ESP32C3中BLE开发问题汇总
乐鑫ESP模组开发环境搭建推荐视频:
https://www.bilibili.com/video/BV1114y1r7du/?vd_source=f30ed458197c93804045527a0032d6d4
乐鑫官网ESP-IDF编程指南
https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.4/esp32c3/get-started/index.html
本人使用的开发模组是ESP32C3(小米IOT模组)
该模组Flash烧录方式使用ESP-IDF的Flash Device命令,并长按上图中的GPIO9按钮,再短按CHIP_EN按钮,松开GPIO9按钮便可以进行烧写工作;具体的开发流程可以通过上述视频中学习。
项目背景
本项目是通过乐鑫BLE模组与APP通信,底层使用SPI与FPGA控制板进行通信;达到APP发送指令可以控制FPGA的效果。
APP-BLE问题汇总
1、APP->BLE,BLE固件报BT_GATT: GATTS_SendRsp conn_id: 3 waiting for op_code = 00错误
1.1、问题背景
在魔改gatt_server_service_table项目中,gatts_profile_event_handler函数用来处理各种GATT事件;其中在处理ESP_GATTS_READ_EVT读事件时,调用esp_ble_gatts_send_response向APP端发送APP需要获取的数据。然而APP端一直没有获取到数据,使用串口打印BLE日志输出显示BT_GATT: GATTS_SendRsp conn_id: 3 waiting for op_code = 00错误。
1.2、问题分析
首先,阅读ESP-IDF源码发现,该错误只有一处再gatt_api.c文件中
主要原因是tcb中的trans_id与esp_ble_gatts_send_response传入的trans_id不一致导致数据无法发送给APP。
1.3、解决方案
esp32问题贴:https://esp32.com/viewtopic.php?f=13&t=18763
将我们的table声明ESP_GATT_AUTO_RSP 改为 ESP_GATT_RSP_BY_APP 由APP控制response响应,问题解决。
2、APP->BLE,在APP-BLE之间传输(R/W)大量数据(>23Bytes)APP一般表现为读写操作,BLE固件显示BT_GATT: attribute value too long, to be truncated to 22。
2.1、问题背景
在解决完上述response问题后,传输小批量数据(<22Bytes)完全没有问题;当我们开始传输大量数据时(100Bytes)便出现上述错误。
2.2、问题分析
我使用的APP时安卓的BLE调试助手,一直报上述的问题;为了交叉验证,我是用IOS的LightBlue进行调试发现可以单次传输(R/W)400Bytes的数据;问题应该出现在APP端了,但是该问题是由于BLE固件导致的,上面我们解决response时将ESP_GATT_AUTO_RSP 改为 ESP_GATT_RSP_BY_APP,就是将RSP的能力交由给APP端来控制了。
2.3、解决方案
修改APP端开源代码,将buffer的限制从23调整为512可以解决问题;或使用IOS端的LightBlue APP进行调试工作。
BLE-SPI问题汇总
魔改ESP-IDF的hd_eeprom demo代码,通过使用SPI总线实现BLE->FPGA(/MCU/其他设备)。
1、SPI-Bus声明
1.1、问题背景
将乐鑫的ESP32C3模组与我们FPGA产品使用SPI总线连接起来。魔改hd_eeprom工程代码,在spi_bus_initialize函数需要传入一个host_id用来指定SPI外设总线。
1.2、问题分析
在初始化时,使用SPI1_HOST进行初始化BUS操作,从spi_types.h文件中的spi_host_device_t(上图)可知SPI1已经被ESP32内部使用了。
1.3、解决方案
使用SPI2_HOST作为我们的SPI外设BUS,问题可解。