0

我买了 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 通信有一些经验,我想咨询一下。

提前致谢

4

1 回答 1

0

{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,0x00,0x06,0x00},{0x04,0xff,0x03,0x01,0x00,0x01}

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

  • 标题
    • 0x0006:有 6 个字节(数据)可供读取
  • 数据
    • 0x04:人机交互事件包
    • 0xFF:ACI(供应商特定)事件
    • 0x03:参数长度
    • 0x10 0x00:事件 = 0x0001,即 ACI_BLUE_INITIALIZED_EVENT
    • 0x01:原因码=1,表示固件正常启动
于 2021-04-19T07:32:30.473 回答