1.VDD_SPI要上电
2.EN_GATE引脚要拉高电平,低电平SPI通信不开启
3.PVDD要在正常工作范围6—60v内,否则触发欠压保护和过压保护都将不响应spi命令
4. DRV8301 SPI的采样是下降沿采样,且空闲状态要为低电平,也就是要在第二沿设置采样
即设置CPOL为0,CPHA为1,与DRV8301相匹配才能正常通信
首先是基础定义
//DRV8301 SPI配置变量定义
uint16_t DEVICE_Faults_READ = 0x8000; //获取设备出错SPI需要发送的16位数据
uint16_t DEVICE_ID_READ = 0x8800;//获取设备ID需要发送的16位数据
uint16_t GATEDRIVE_Control_READ = 0x9000;//读取门级驱动数据要发送的16位数据
uint16_t CSAM_Control_READ = 0x9800; //读取电流增益器数据要发送的16位数据
uint8_t Faults_Data[2];//SPI读取Faults寄存器的值
uint8_t ID_Data[2];//SPI读取ID寄存器的值
uint8_t Gate_Data_R[2];//SPI读取Gata寄存器的值
uint16_t Gate_Data_W;//SPI最终要写入Gata寄存器的值
uint8_t CSAM_Data_R[2];//SPI读取CSAM寄存器的值
uint16_t CSAM_Data_W;//SPI最终要写入CSAM寄存器的值
uint8_t test_Gate[2];
uint8_t test_GSAM[2];//测试值反馈
相关SPI收发配置函数
//测试SPI函数
uint8_t SPI1_ReadWriteByte(uint8_t TxData)//发送一个字节,并从寄存器返回一个值
{
uint8_t Rxdata;
HAL_SPI_TransmitReceive(&hspi1,&TxData,&Rxdata,1,1000);
return Rxdata;
}
//SPI读16位函数
void SPI_Read(uint8_t* pBuffer,uint16_t ReadAddr)
{
uint16_t i;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
SPI1_ReadWriteByte((uint8_t)(ReadAddr >> 8));//右移8位,强制转换保留低八位数据,也就是发送了高8位数据对应的地址给halspi发送
SPI1_ReadWriteByte((uint8_t)ReadAddr);//强制转换保留低8位数据,也就是发送了低8位数据对应的地址给halspi发送
for(i = 0;i<2;i++)
{
pBuffer[i]=SPI1_ReadWriteByte(0xFF);//根据SPI通讯原理,要读出下一个周期spi发出的数据,要发送对应格式位的数据
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
}
//SPI写16位函数
void SPI_Write(uint16_t WriteAddr)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
SPI1_ReadWriteByte((uint8_t)(WriteAddr >> 8));
SPI1_ReadWriteByte((uint8_t)WriteAddr);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
}
最后按照我的需求配置控制寄存器
//SPI参数配置函数
void DRV8301_SPI_setting()
{
//配置Gate寄存器
SPI_Read(Gate_Data_R, GATEDRIVE_Control_READ);//发送读取门级寄存器命令,并将读取的值赋予Gate_Data_R
Gate_Data_W = ((uint16_t)Gate_Data_R[0] << 8 | (uint16_t)Gate_Data_R[1]);//将8位数组转换位16位数据
Gate_Data_W &=~(1<<0);
Gate_Data_W &=~(1<<1);//配置D0位与D1为0,使栅极驱动电流峰值为1.7A>大于计算所得1.2A
Gate_Data_W &=~(1<<2);//配置Gate_reset的模式为NORMAL MODE
Gate_Data_W &=~(1<<3);//配置为6PWM模式
Gate_Data_W &=~(1<<4);
Gate_Data_W |=(1<<5);//配置D4为0、D5为1,过流时不通过DRV8301限制电流只触发NOTCW信号
Gate_Data_W |=(1<<6);
Gate_Data_W &=~(1<<7);
Gate_Data_W |=(1<<8);
Gate_Data_W &=~(1<<9);
Gate_Data_W |=(1<<10);//配置D6~D10位为10101即21号电压值0.730v对应电流56A
Gate_Data_W &=~(1<<11);
Gate_Data_W |=(1<<12);
Gate_Data_W &=~(1<<13);
Gate_Data_W &=~(1<<14);//配置地址位位0x0010对应Gate寄存器
Gate_Data_W &=~(1<<15);//15位置0表示写入
SPI_Write(Gate_Data_W);//发送带有写入信号的数据进行配置
SPI_Read(test_Gate, GATEDRIVE_Control_READ);//将写好的值读取一遍
//配置CSAM寄存器
SPI_Read(CSAM_Data_R, CSAM_Control_READ);//发送读取CSAM寄存器命令,并将读取的值赋予CSAM_Data_R
CSAM_Data_W = ((uint16_t)CSAM_Data_R[0] << 8 | (uint16_t)CSAM_Data_R[1]);//将8位数组转换位16位数据
CSAM_Data_W &=~(1<<0);//存储RAW值
CSAM_Data_W &=~(1<<1);//配置D0位与D1位为0,同时汇报过流与过温警报
CSAM_Data_W |= (1<<2);
CSAM_Data_W |= (1<<3);//配置D2与D3位为1,增益为80倍,所用电机电流最高预估225mA放大后波动+_0.36V
CSAM_Data_W &=~(1<<4);//不启用第一个分流放大器的矫正功能
CSAM_Data_W &=~(1<<5);//不启用第二个分流放大器的矫正功能
CSAM_Data_W &=~(1<<6);//限流模式下的反应,因为没有配置限流模式,所以用不到
CSAM_Data_W |=(1<<11);
CSAM_Data_W |=(1<<12);
CSAM_Data_W &=~(1<<13);
CSAM_Data_W &=~(1<<14);//配置地址位位0x0011对应CSAM寄存器,7—10位为reserved无法进行读写
CSAM_Data_W &=~(1<<15);//15位置0表示写入
SPI_Write(CSAM_Data_W);//发送带有写入信号的数据进行配置
SPI_Read(test_GSAM, GATEDRIVE_Control_READ);//将写好的值读取一遍
}
具体还没有测试,因为板子暂时没打算接上PVDD,需要检查会不会烧掉之类的(毕竟第一次设计PCB,还是这种大电流的,很慌)