SPI(Serial Peripheral Interface)通信协议因其高速、全双工和简洁的硬件接口设计,成为芯片间短距离通信的主流选择。在本篇文章中,我们将探讨 E533.06 微控制器如何作为从机实现SPI通信

什么是SPI

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。
四根线一般为:

  • MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
  • MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
  • SCLK:串行时钟信号,由主设备产生。
  • CS/SS:从设备片选信号,由主设备控制。

请添加图片描述

SPI的四种工作模式

SPI通信有4种不同的操作模式,但我们的通信双方必须是工作在同一模式下,所以我们可以对SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们 SPI 的通信模式。
总的来说就是控制不同的空闲电平跟采集边沿决定,从而产生四种组合方式,如下图

请添加图片描述
注:芯片具体的时钟极性跟时钟相位需要根据对应的手册来决定,上图不能代表所有芯片。

E533.06 的 SPI 使用需求

E533.06 广泛应用于中小功率的车载辅助驱动系统,例如电动冷却风扇、HVAC鼓风机、以及各类流体泵(如燃油泵、水泵、油泵和液压泵)。在这些系统中,E533.06 通常承担实时控制核心角色,执行 FOC 算法、PWM 调制、电流环控制等关键任务。E533.06 通常通过 LIN 接口与车身控制模块等上位主控单元进行通信。然而,在某些更复杂的应用场景中,例如当外置 MCU 需要与 E533.06 进行高速或实时性要求更高的数据交互时,采用 SPI 接口往往更为合适,因其具备更高的带宽、更低的延迟以及更小的硬件开销。此时,E533.06 通常配置为 SPI 从机,被动响应主控发起的通信请求,用于:

  • 接收来自主控的电机目标转速、扭矩指令或工作模式;
  • 回传实时状态信息,如母线电压、相电流、故障标志、温度等;
  • 支持在线标定或诊断数据上传。

为确保控制系统安全可靠,必须对 E533.06 的 SPI 从机功能进行充分验证,包括协议一致性、FIFO 缓冲机制、中断响应时效性况下的通信稳定性,因此对 SPI 收发数据进行测试是很有必要的,本次实验在此背景下,详细说明如何在 E533.06 评估板上实现 SPI 从机的数据收发,并通过串口输出调试信息,完成通信调试。

使用 E533.06 启动SPI从机模式

本章节我们将使用 E533.06 进行SPI从机模式下接收和发送数据的实验,本次实验通过使用RH850-F1KMS1作为SPI主机。
在这里插入图片描述

本次实验的平台是 霆宝科技 开发的 E533.06 评估板,TPD-E53306_v2.1.0。

功能设计

  1. 开发板上电后,采用主机发送数据通过 E533.06 接收,串口输出调试信息。
  2. E533.06 会发送数据回主机。

硬件连接

本次实验,使用 E533.06 跟 RH850-F1KMS1 相互通信,按照原理图连接好跳线、仿真器、调试工具。

请添加图片描述

软件设计

本次实验的开发环境为 keil5 ;

E533.06 在SPI中可以设定为主机或者从机,本次实验使用SPI从机的方式收发数据;

以下是详细说明

参考手册定义找到SPI相关的章节

SPI相关的功能模块

请添加图片描述

SPI配置相关的寄存器
请添加图片描述

配置复用引脚,参考手册GPIO复用

请添加图片描述

请添加图片描述

配置SPI从机参数,需要跟主机保持一致,这边采用的配置如下

  • 时钟线空闲电平:高(下降沿触发)
  • 数据采集:第二个时钟边沿采集
  • 传输:MSB
  • 数据长度:8位
  • 片选引脚:低电平有效
    请添加图片描述
    请添加图片描述

采用FIFO接收,在初始化时需要进行清空

请添加图片描述请添加图片描述
请添加图片描述

找到对应中断源,配置中断源,编写对应中断函数

请添加图片描述
请添加图片描述

请添加图片描述

编写发送函数
因为SPI从机通信是全双工发送数据取决于主机,只能将要发送的数据预先写进FIFO,在主机片选拉低时,从机将写进FIFO里面的数据发送出去同时接收数据

void spi_slave_send_data(uint16_t data)
{
    uint32_t start_time = timestamp;
    // 等待发送FIFO有空间
    while (((SPI->FIFO_LEVELS.reg >> 8) & 0xFF) >= 8) // FIFO深度为8
    {
        // 检查是否超时
        if ((timestamp - start_time) >= SPI_SEND_TIMEOUT_MS)
        {
            return; // 超时返回
        }
    }
    // 写入数据到发送寄存器
    SPI->DATA.reg = data;
}

测试函数

作用:用串口打印spi接收到的数据,从机会发送0xAA给主机
时钟设定为40M,则SPI从机能接受最高的波特率为5M,上面用户手册有说明

// =============================================================================
// 系统初始化
// =============================================================================
static void hardware_init(void)
{
    wdog_disable_startup_wd();
    system_set_clock(CORE_CLOCK_40MHz);
    uart_init(BAUD_RATE);
    spi_slave_init(); // 初始化SPI从机
    systick_config(1000, SYSTICK_MS_FACTOR);
    __enable_irq();
}

// =============================================================================
// 主函数
// =============================================================================
int main(void)
{
    // 系统初始化
    hardware_init();
    uint16_t received_data = 0;//打印spi从机接收数据
	uint16_t tx_data = 0xAA;
    printf_("SLAVE SPI TEST\r\n"); 
    
    // 主事件循环
    while (1)
    {
        if (spi_slave_read_from_buffer(&received_data)) 
        {
            printf_("spi received data: 0x%x\r\n", received_data);
			spi_slave_send_data(tx_data);
        }
    }
    return 0;
}

调试

  1. 连接调试工具与开发板,启动上位机;
  2. 本示例测试使用主机配置上面有说明,在主机配置下发送0x11,0x22,0x33,0x44数据,从机会发送0xAA给主机
  3. 观察串口跟逻辑分析仪接收结果:

主机

主机接收从机串口显示

本次测试函数没有进行预先写入一个数据进入FIFO,在主机第一次拉低发送数据的时候,此时的FIFO为空,所以第一次接收的数据为0x0,为正常现象

请添加图片描述

从机

测试函数下串口打印的数据

请添加图片描述

逻辑分析仪下抓到的波形

第一次发送的波形

请添加图片描述

第二次发送的波形,从机发送AA

请添加图片描述

可以看到 E533.06 的 SPI 从机接可以正常收数据和发送数据,至此实验完成。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐