BlueNRG 错误 header

BlueNRG wrong header

我买了ST的STEVAL-MKSBOX1V1,想自己写一个库来创建BLE应用

板载BLE模块是SPBTLE-1S,搭载BlueNRG-1,我自己写了固件,为了使用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,SPI1_CS_Pin,1);

我发:

{0x0b,0x00,0x00,0x00,0x00}

我得到:

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

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

如果我读取 6 个字节,我得到

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

根据 AN4494,这正是我在模块上发生重置事件后应该阅读的内容。

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

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

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

提前致谢

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

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

很遗憾,目前没有描述修改的文档。您可能需要参考 DTM SPI 示例项目以了解详细信息。

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

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

那是ACI Blue初始化事件,表示固件已经正常启动。即可以解析:

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