通过SPI接口使用AT命令

概述

主控控制模式 下,如果有高性能和高吞吐的需求,可以使用SPI外设接口进行数据传输。

主控设备作为SPI Master,AT设备作为SPI Slave。双方通过SPI协议和特定通信格式进行AT命令数据交换。

请参考 主控控制模式配置 设置SPI外设接口。

管脚说明

SPI外设接口需要7个管脚,分别是包括SPI的MOSI、MISO、CLK、CS 4个管脚及2个同步GPIO管脚脚还有GND接地管脚。

SPI的传输均由 master 发起,slave无法主动传输数据,同时master发起传输的时候,需要确保slave已经调用好接收API,做好相关接收准备,否则将可能有数据丢失的情况。

两个同步GPIO管脚即是用来解决上述情况,分别是master_sync_pin和slave_sync_pin,其作用描述如下:

  • master_sync_pin: 用于主控在发送数据之前,通过拉低该管脚通知AT设备开始准备接收。

  • slave_sync_pin: 用于AT设备在已经准备好接收数据或者有AT消息需要主动发送给主控时,拉低该管脚,通知主控可以进行数据收发。

请参考 AT配置修改 配置对应管脚。

主控参考示例

https://github.com/Ameba-AIoT/ameba-rtos/tree/master/component/example/atcmd_host/atcmd_spi_master 代码示例位于: {SDK}component/example/atcmd_host/spi_master/example_spi_master.c,演示了SPI主机与从机如何进行通信的。

建议在正式开发前运行此代码示例,以验证连接和配置的正确性。此后,参考代码示例将其适配到特定 MCU 平台应用程序中。

在示例代码中,我们添加了一个 UART 任务来接收 AT命令并打印 AT 响应。整体数据流图如下所示:

../../_images/spi_at_data_flow.svg

备注

为了更好的性能优化,每次主控端和AT模组端的数据交互,发送和接收的SPI数据长度都是固定 16384 Bytes,超出有效数据的部分会被忽略。

通信格式

通过SPI AT命令传输数据,需遵循以下格式规范:

Magic Number(2 bytes)

Data Len(2 bytes)

Data(Data Len bytes)

Checksum(4 bytes)

各字段说明:

Magic Number:

ASCII码字符 AT

Data Len:

数据长度,以字节为单位

Checksum:

全帧数据CRC32校验值

交互流程

SPI AT命令交互主要包含两个过程:

主机发送AT命令:

../../_images/spi_master_send_at_command_to_slave.svg
  1. 主机拉低 MASTER SYNC 引脚向从机发起数据传输请求

  2. 从机通过GPIO中断接收到主机的请求,准备就绪后拉高 SLAVE SYNC 引脚通知主机可以传输数据

  3. 主机启动SPI数据传输,传输完成后,双方复位同步引脚

从机返回AT响应:

../../_images/spi_slave_send_response_to_master.svg
  1. 从机通过拉高 SLAVE SYNC 引脚通知主机已准备好发送AT命令响应数据

  2. 主机启动SPI数据接收,传输完成后,从机复位同步引脚

SPI AT命令交互时序图:

../../_images/spi_atcmd_interaction_timing.png

通信速率

SPI链路速率测试,请参考 AT+TEST 命令。

备注

当SPI的时钟频率较高时,可以通过扩大每笔数据包的固定长度,提高全链路吞吐量。