【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片

本文详细介绍了如何使用STM32F407通过CubeMX配置RCC和时钟,设置SYSDebug,UART通讯,TIM定时器和GPIO,特别是针对连接DRV8323S的GPIO端口。然后,重点讲述了SPI通信设置,包括SPI3的配置和SPI读写函数,以及SPI与DRV8323S的交互,以实现芯片的初始化和状态检查。最后,提供了Keil中的SPI通信相关代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

😶‍🌫️说在最前面 + 实现功能

最近在埋头搞STM32 + 无刷直流电机控制,想实现用自己的STM32F407VGT6芯片板子,外加一块驱动板(目前选用到TI的DRV8302或者DRV8323驱动芯片),搞定电机驱动,最后实现比较好的控制效果。如果不是同一块芯片的同学也不用急着走,大体上都是可借鉴哒~

本文主要实现使用SPI通信,通过STM32F407控制芯片来对DRV8323S驱动芯片进行配置,为使用DRV8323做好准备。

目标操作: 不启动电机,仅使能DRV8323S芯片。使用SPI朝DRV8323S芯片写几个地址的配置,然后再读取这几个位置的状态,检查是否通信正常。调试过程借助Keil的Debug功能中 watch变量的值,或使用UASRT串口通信打印出信息,来检查。

如果文章中有什么错误和待改进的地方,欢迎在评论区指出交流,共同学习和进步!✊
首先是一系列用CubeMX的配置操作。

👀 1 CubeMX - RCC & Clock Configuration时钟配置

🥽 1.1 【System Core】 – 【RCC】

HSE – Crystal/Ceramic Resonator
高速时钟源 – 外部晶振
1.1
会自动分配好管脚RCC_OSC_IN & RCC_OSC_OUT:
PH0 – RCC_OSC_IN
PH1 – RCC_OSC_OUT.

🥽 1.2 【Clock Configuration】

系统定时器配置Cortex System timer – 168MHz
1.2

👀 2 CubeMX -SYS Debug设置

🌠>> SYS Mode and Configuration
Debug – Serial Wire
Timebase Source – SysTick(后续若使用到RTOS,则需改成如TIM7的没用到的定时器!)
2

👀 3 CubeMX -UART通讯设置

USART3 —— 暂定用它接收(来自上位机的)控制电机指令
PD8-USART3_TX
PD9-USART3_RX
3.1
🌠>> USART3 – Mode

Item Setting
Mode Asynchronous异步模式
Hardware Flow Control (RS232) Disable

🌠>> Parameter Settings – Basic Parameters

Item Setting
Baud Rate 115200 Bits/s
Word Length 8 Bits (including Parity)
Parity None
Stop Bits 1

🌠>> Parameter Settings – Advanced Parameters

Item Setting
Data Direction Receive and Transmit
Over Sampling 16 Samples

🌠>> NVIC Settings
中断使能,优先级(0,0)。
3.3
🌠>> GPIO Settings

Item Setting
GPIO mode Alternate Function Push Pull
GPIO Pull-up/Pull-down Pull-up 注意⭐
Maximum output speed Very high

👀 4 CubeMX - TIM定时器设置

TIM8-PWM+TIM4-HALL+TIM6简单定时
本文暂时略

👀 5 CubeMX - GPIO设置

KEY+LED+PWM低桥臂
本文暂时略

👀 6 CubeMX - GPIO设置:连接DRV8323S的一些端口⭐

6.1
6.2

🥽 6.1 (STM32 - out) PA9 👈–👉 CAL (DRV8323S - in)

放大器校准输入。设置逻辑高时,内部短接放大器输入,并执行自动偏移校准。完成校准后引脚还要恢复低位,才能正常执行后续测量操作。
🪜详见数据手册【8.3.4.3 Auto Offset Calibration – P44】
6.3
🌠>> GPIO Settings

Item项目 Setting设定
GPIO Output Level Low(引脚低电平)
GPIO mode Output Push Pull(输出推挽模式)
GPIO Pull-up/Pull-down No pull-up and no pull-down
Maximum output speed High(引脚高速)

暂时不用自动校准功能!因此初始就让PA9输出低电平。

🥽6.2 (STM32 - out) PA10 👈–👉 ENABLE (DRV8323S – in,EN_GATE)

栅极驱动器启用。当该引脚为逻辑低时,设备进入低功率睡眠模式。8至40µs的低脉冲可用于重置故障条件。
🪜详见数据手册【8.4.1.1 Sleep Mode – P50】

6.3
🌠>> GPIO Settings

Item项目 Setting设定
GPIO Output Level Low(引脚低电平)
GPIO mode Output Push Pull(输出推挽模式)
GPIO Pull-up/Pull-down No pull-up and no pull-down
Maximum output speed High(引脚高速)

初始让PA10输出低电平,要使能DRV8323S芯片时,把引脚输出改为高电平。

🥽6.3 (STM32 - X) 无 👈–👉 nFAULT (DRV8323S – open-drain output) – 单片机连D11发光二极管

暂时不额外连STM32引脚来读状态(应该也可以连?目前我的板子版本未连),如果发光二极管D11亮了,则说明出故障了。
🪜详见数据手册【8.3.6 Gate Driver Protective Circuits – P47】
6.4
外部硬件电路给他上拉了,出现故障时,nFAULT pin输出逻辑低,对应发光二极管D11亮。

👀 7 CubeMX - SPI通信设置:用来和DRV8323通讯,配置PWM+发送错误信息⭐

🪜相关寄存器的配置备忘详见我的另一篇Blog:【DRV8323】电机驱动芯片寄存器配置指南,通过STM32F407的SPI通信配置
SPI - Serial Peripheral Interface串行外围设备接口
SPI3是APB1上的设备,APB1 peripheral clocks = 42MHz,最高通信速率为 21Mbits/s。
SPI3_nSCS需要用GPIO单独配置,另外三个是SPI3自动配置的。

引脚名 STM32自命名 原理图中引脚命名
PD1 SPI3_nSCS NSCS(片选)【❗这个是GPIO_Output单独设!】
PC10 SPI3_SCK SPI_SCLK (时钟)
PC11 SPI3_MISO SPI_SDO (从机DRV8323输出数据,主机STM32输入。连DRV8323的SDO口)
PC12 SPI3_MOSI SPI_SDI (主机STM32输出数据,发给从机DRV8323。连DRV8323的SDI口)

7.1
7.2

🥽7.1 Connectivity – SPI 3

🌠>> SPI3 – Mode

Item项目 Setting设定
Mode Full-Duplex Master (全双工主机模式)
Hardware NSS Signal Disable(不是硬件控制)

🌠>> Parameter Settings – Basic Parameters

Item项目 Setting设定
Frame Format Motorola
Data Size 16 Bits
First Bit MSB First

🌠>> Parameter Settings – Clock Parameters

Item项目 Setting设定
Prescaler (for Baud Rate) 16 (❗一定要至少选16,稍微小一点都会因为太快了数据出错!)
Baud Rate 2.625 MBits/s
Clock Polarity (CPOL) Low (空闲态时,SCLK处于低电平)
Clock Phase (CPHA) 2 Edge(CPHA=1)

🌠>> Parameter Settings – Advanced Parameters

Item项目 Setting设定
CRC Calculation Disabled
NSS Signal Type Software

7.3

🥽7.2 System Core – GPIO

7.4
🌠>> GPIO - PD1 Configuration

Item项目 Setting设定
GPIO Output Level High(初始状态引脚高电平,低电平有效)
GPIO mode Output Push Pull(输出推挽模式)
GPIO Pull-up/Pull-down No pull-up and no pull-down
Maximum output speed Very High
User Label SPI3_nSCS

🌠>> GPIO - SPI - PC10&PC11&PC12 Configuration
(?作者存疑点:PC11在CubeMX默认是输出状态?实现功能来说应该是输入)

Item项目 Setting设定
GPIO mode Alternate Function Push Pull
GPIO Pull-up/Pull-down No Pull-up and no Pull-down
Maximum output speed Very High

👀 8 Keil - SPI通信相关代码摘录

【motor_drv8323.c】代码(含寄存器和HAL库函数对比的详细版本)👇

/**
  ******************************************************************************
  * @file    motor_drv8323.c
  * @date    2023-05-08
  * @brief   驱动芯片DRV8323相关 - STM32 F407
  ******************************************************************************
  */ 

#include "motor_drv8323.h"

	uint16_t TIMP01, TIMP02, TIMP03, TIMP04, TIMP05;
	uint16_t TIMP1, TIMP2, TIMP3, TIMP4, TIMP5;

 /**
  * @brief    【MOTOR-DRV8323 SPI通信】
  *             配置 DRV8323工作状态
  * @function  0 - SPI读&写一体化函数 16位 - HAL库函数版本
  * @function  1 - SPI 读 & 写16bit函数 - 寄存器版本
  * @function  2 - DRV8323写入函数 16位 - 寄存器版本
  * @function  3 - DRV8323读取函数 16位 - 寄存器版本
  * @function  4 - SPI功能异常提示函数
  * @function  5 - 用SPI配置DRV8323的函数  (操作封装)
*/
// 0 - SPI读&写一体化函数 16位 - HAL库函数版本  【要么用后三个,要么就用这个】
uint16_t SPI_ReadWrite_DRV8323(uint16_t ReadAddr)
{
   
	uint16_t value; 
	
	SPI3_nSCS_LOW();   // SPI3-nSCS 拉低使能  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
	
	//HAL_Delay(500);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本,需要加上延时,否则速度太快可能会出错!
	HAL_SPI_TransmitReceive(&hspi3, (uint8_t*)&ReadAddr, (uint8_t*)&value, 1, 1000);  // 通过一个强制转换“骗过”库函数接口
	//HAL_Delay(500);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本,需要加上延时,否则速度太快可能会出错!
	SPI3_nSCS_HIGH();  // SPI3-nSCS 拉高关断  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
	
	HAL_Delay(500);
	
  return value;
}
// 1 - SPI读&写16bit函数 - 寄存器版本
uint16_t SPI_ReadWrite16bit(uint16_t ReadAddr)
{
   
	int SPITimeout = SPIT_FLAG_TIMEOUT;     // 等待超时时间 设为0x1000
    // Loop while DR register in not emplty 等待发送缓冲区为空,TXE 事件
    while (__HAL_SPI_GET_FLAG( &hspi3,  SPI_FLAG_TXE ) == RESET)
    {
   
      if((SPITimeout--) == 0
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值