BlueNRG 错误标头

问题描述

我购买了 ST 的 STEVAL-MKSBox1V1,想编写自己的库来创建 BLE 应用程序。

板上的 BLE 模块是安装 BlueNRG-1 的 SPBTLE-1S,我编写了自己的固件以便使用 SPI 协议进行通信。

使用引脚重置模块后,我从 MCU 向 BLE 模块发送读取请求,

 HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,0);
 HAL_SPI_TransmitReceive(&hspi2,tx,rx,5,1);
 HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,1);

我发送:

{0x0b,0x00,0x00}

我明白了:

{0xff,0x08,0x06,0x00}

显然没有什么好处,因为第一个字节是 0xff 而不是 0x02(对吗?),但第 4 位(0x06)应该表示读取缓冲区内的数据量。

如果我读了 6 个字节,我会得到

{0x04,0xff,0x03,0x01,0x01}

根据 AN4494,这正是我在模块发生复位事件后应该阅读的内容

那么我的问题是为什么我一直收到 {0xff,0x00} 而不是 {0x02,....} 之类的东西?

BlueNRG1 与 BlueNRG2 有什么不同吗? (很难找到好的文档)

如果有人对这个模块的 SPI 通信有一些经验,我想咨询一下。

提前致谢

解决方法

{0xff,..} 是正确的。

AN4494 适用于 BlueNRG-MS,MISO 的 5 字节 SPI 标头为:{Ready,WBufLen,0x00,RBufLen,0x00}。在 BlueNRG-1 和 BlueNRG-2 中,该 SPI 标头已修改为:{0xff,CmdLen0,CmdLen1,DataLen0,DataLen1},以便在单个 SPI 事务中支持长度超过 127 字节的 ACI 数据包。头中的第一个字节固定为 0xff。

不幸的是,目前没有描述修改的文件。您可能需要参考 DTM SPI 示例项目以了解详细信息。

在您的事务中,如果执行读取命令并继续读取 6 字节数据的 MISO:

  • {0xff,0x08,0x06,0x00},{0x04,0xff,0x03,0x01,0x01}

这是一个 ACI Blue 初始化事件,表示固件已正常启动。可以解析:

  • 标题
    • 0x0006:6 个字节(数据)可供读取
  • 数据
    • 0x04:HCI 事件数据包
    • 0xFF:ACI(供应商特定)事件
    • 0x03:参数长度
    • 0x10 0x00:事件 = 0x0001,即 ACI_BLUE_INITIALIZED_EVENT
    • 0x01:原因代码 = 1,表示固件正常启动