通过 SPI 接口使用 AT 命令

概述

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

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

请参考 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 响应。整体数据流如下图所示:

../../rst_rtos/0_at_command/figures/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 数据传输,传输完成后,双方复位同步引脚

../../rst_rtos/0_at_command/figures/spi_master_send_at_command_to_slave.svg

从机返回 AT 响应

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

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

../../rst_rtos/0_at_command/figures/spi_slave_send_response_to_master.svg

交互时序

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

../../rst_rtos/0_at_command/figures/spi_atcmd_interaction_timing.png

通信速率

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

备注

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

故障排除

  1. 主控端运行示例程序,没有显示 UART Send Command Demo... 字符:

    • 检查 UART 引脚接线、波特率是否与示例程序配置一致

  2. AT 模组上电后,主控端没有收到 ATCMD READY 消息,可以从以下方面排查:

    • 检查硬件接线是否与 atcmd_config.json 以及主控端代码一致,使用尽可能短的接线

    • 主控端 SPI 先从低速开始测试,稳定后再逐步提升速率