应用笔记:E533.06 BLDC驱动-SPI从机功能实现
SPI(Serial Peripheral Interface)通信协议因其⾼速、全双⼯和简洁的硬件接⼝设计,成为芯⽚间短距离通信的主流选择。在本篇⽂章中,我们将探讨 E533.06 微控制器如何作为从机实现SPI通信。
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。
功能设计
- 开发板上电后,采用主机发送数据通过 E533.06 接收,串口输出调试信息。
- 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;
}
调试
- 连接调试工具与开发板,启动上位机;
- 本示例测试使用主机配置上面有说明,在主机配置下发送0x11,0x22,0x33,0x44数据,从机会发送0xAA给主机
- 观察串口跟逻辑分析仪接收结果:
主机
主机接收从机串口显示
本次测试函数没有进行预先写入一个数据进入FIFO,在主机第一次拉低发送数据的时候,此时的FIFO为空,所以第一次接收的数据为0x0,为正常现象

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

逻辑分析仪下抓到的波形
第一次发送的波形

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

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



所有评论(0)