概述

Ameba 系列产品支持摩托罗拉的 SPI 接口,能够进行高效的四线全双工通信。

功能特性

  • 支持主机或从机操作模式

  • 独立的中断屏蔽功能

  • 支持硬件/软件片选

  • 可编程特性

    • 支持动态控制串行接口频率(主机模式有效)

    • 可配置的数据帧大小(4~16 bits)

    • 可配置的时钟极性和相位

    • 可编程延迟采样时间(主机模式有效)

  • 传输模式

    • 发送和接收

    • 仅发送

    • 仅接收

  • 操作模式

    • 轮询模式

    • 中断模式

    • DMA 模式

串行时钟频率

接口频率(fsclk_out)支持

  • 主机模式:支持高达 50MHz。

  • 从机模式:支持最高 25MHz。

注意

支持从机超频模式

  • 前提条件:与之通信的主设备需支持延迟采样机制

  • 延迟采样机制:以双方规定的下降沿采样数据为例,图中展示了标准采样边沿与延迟采样机制的对比

  • 理论极限:50 MHz

    ../../../rst_peripherals/rtos/8_spi/figures/spi_master_sample_delay.svg

    主机延迟采样机制

分频机制

  • 核心公式fsclk_out = fssi_clk/div

    其中: fssi_clk 时钟源为 PLL

  • 约束条件

    • 分频系数 div 仅支持偶数值

    • 实际输出频率为离散值,这意味输出的 fsclk_out 可能与期望值存在偏差。

注意

  • Bootloader 阶段配置 PLL 的输出会影响 SPI 串行时钟频率。

    调整 PLL 输出的方法请参考 ameba_bootcfg

    例如,SPI 目标 工作时钟 ( fssi_clk ) 为 100MHz。在 PLL 设定为 524MHz 时,SPI 实际 工作时钟只有 86.67MHz。

    此时, fsclk_out 最大只有 43.3MHz,无法达到期望的最大值 50MHz。

引脚复用配置策略

接口频率与引脚配置

配置模式

主设备频率

从设备频率

专用引脚

50 MHz

25 MHz

全矩阵引脚

25 MHz

12.5 MHz

备注

  • 关于专用引脚与全矩阵引脚的区别,请参考 功能复用 介绍。

工作模式

根据需要,可配置 SPI 工作在以下三种模式:

轮询模式

这是最基础的工作模式。CPU 通过轮询 SPI 的状态寄存器,然后根据需要读写 FIFO 缓冲区,以实现数据的收发。

适用对实时性要求较低的小规模数据传输。

中断模式

当满足配置的触发条件时,SPI 硬件会发送中断信号通知 CPU 处理相关事务。

该方式无需频繁轮询,使得 CPU 占用率降低且响应速度更快。

DMA 模式

通过 SPI 与 DMA 握手机制,由 DMA 控制器负责数据传输,减轻 CPU 的处理负担。

适用于需处理大量数据的应用,如音视频流处理、大数据传输等情境。

备注

有关使用 DMA 模式传输的注意事项,请参考 DMA 和缓存 介绍。

应用示例

SDK 提供了两类功能示例,帮助开发者了解和使用 SPI 功能:

  • mbed 示例

    • 路径:{SDK}\component\example\peripheral\mbed\SPI\{demo}

    • 展示如何在 mbed 环境中实现 SPI 控制。

  • raw 示例

    • 路径:{SDK}\component\example\peripheral\raw\SPI\{demo}

    • 展示如何在无抽象层的情况下直接控制 SPI。

以下是对 raw 示例功能的简要说明:

备注

要了解示例支持的芯片,请查看示例路径下的 README.md 文件。

API 参考

要详细了解和使用相关 API,请参阅 {SDK}\component\soc\amebaxxxx\fwlib\include\ameba_spi.h

常见问题排查

CS 信号提前拉高

  • 现象 : 在数据传输未完成时 CS 被提前拉高,导致传输中断,数据未能完整发送。

  • 可能原因 : FIFO 缓冲区未能及时填充,或由于数据流控制不当导致数据断流。

  • 解决方法 :

    • 检查 FIFO 阈值配置:确保与数据流量需求相匹配。

    • 优化中断优先级:通过提高中断优先级,减少数据填充的延迟时间。

    • 使用 DMA 模式传输:减轻 CPU 的负担并提升数据传输的稳定性。

DMA 模式少部分数据传输错误

  • 现象 :初始传输的数据可能出现少量错误,而后续的数据传输正常。

  • 原因与解决方法 :请参考 DMA 和缓存 介绍。