通过 SPI 接口使用 AT 命令

概述

主控控制模式 下,为满足高性能和高吞吐量需求,可以使用 SPI 外设接口进行数据传输。

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

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

引脚说明

SPI 接口需要 7 个引脚,分别是:

  • 四个 SPI 通信引脚:MOSI、MISO、CLK、CS

  • 两个 GPIO 同步信号引脚

  • GND 接地引脚

SPI 的传输均由 Master 发起,Slave 无法主动传输数据。同时,Master 发起传输的时候,需要确保 Slave 做好接收准备,否则可能丢失数据。

两个同步 GPIO 引脚即是用来解决上述问题的,其作用描述如下:

  • 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

其中, example_atcmd_spi_master.c 演示了 SPI 主机如何与从机进行通信的。建议在正式开发前运行此代码示例,以验证连接和配置的正确性。之后,参考代码示例将其适配到特定 MCU 平台应用程序中。

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

../../_images/spi_at_data_flow.svg

备注

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

通信格式

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

Magic Number(2 字节)

Data Len(2 字节)

Data(Data Len 字节)

Checksum(4 字节)

字段说明:

Magic Number:

ASCII 码字符 AT

Data Len:

数据长度,以字节为单位

Checksum:

全帧数据 CRC32 校验值

交互流程

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

  • 主机发送 AT 命令

  • 从机返回 AT 响应

主机发送 AT 命令

  1. 主机拉低 master_sync_pin 引脚向从机发起数据传输请求

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

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

../../_images/spi_master_send_at_command_to_slave.svg

从机返回 AT 响应

  1. 从机通过拉高 slave_sync_pin 引脚通知主机已准备好发送 AT 命令响应数据

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

../../_images/spi_slave_send_response_to_master.svg

交互时序

SPI AT 命令交互时序如下图所示:

../../_images/spi_atcmd_interaction_timing.png

通信速率

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

备注

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