大家好、
我的问题与之前在旧帖子中解决的问题相同、但在已解决的帖子中、没有描述解决问题的方法。
本质上、我将写入 DRV 寄存器以对其进行设置、然后读回信息、但当 ENABLE 引脚为低电平时、我只读取0x0000、当 ENABLE 引脚为高电平时、我只读取0xFFFF。 所有寄存器似乎都以0x0000进行响应。 我不知道它是否是因为我的控制字设置错误、它是否是 SPI 库、它的硬件是否相关、或者它是否纯粹愚蠢。
我正在使用 mbed SPI 库。 SPI 设置为1MHz 时钟、16位字、时钟极性:时钟低电平有效、时钟与数据同相。 我还在每个控制字(提升和降低 NCSC)之间等待1-2 us
1) 1)使能引脚是否设置为逻辑高电平?
是的
2) 2) 2)您运行 SPI 的速度有多快?
1 MHz
3) 3) SDO 上的上拉值是多少?I
T 为100k、然后更改为10k、未发现差异。
4) 4)您能否使用示波器而非逻辑分析仪捕获 SDO?
还不会尝试。 目前使用 Nucleo F746ZG 和 Analyzer2Go 来分析 SPI 引脚上的位。
如果您想查看、我可以发布分析器数据的快照。 我 已将我的代码附在下面、以供您关注。
#include "mbed.h"
#include "DRV8323.h"
#include "stdbool.h"
#include "stdint.h"
//#include "stm32f4xx_hal.h"
DigitalOut myLED1 (LED1);
DigitalOut myLED2 (LED2);
DigitalOut myLED3 (LED3);
串行 PC (USBTX、USBRX);//设置连接主机终端的 USB 接口
//SPI 器件(SPI_MOSI、SPI_MISO、SPI_SCK);
DigitalOut SSEL1 (PE_4);//SSEL1或 CS1
//DigitalOut SSEL2 (PE_7);//SSEL2或 CS2
SPI DRV8323_SPI (PE_6、PE_5、PE_2);
DRV8323寄存器的默认值
uint16_t DRV8323regDrvCtrl =
0 << 9 |//DIS_CPUV
1 << 8 |//DIS_GDF
0 << 7 |//OTW_REP
0 < 5 |//PWM_MODE
0 < 4 |//1PWM_COM
0 < 3 |//1PWM_DIR
0 < 2 |//coast
0 < 1 |//制动
0;//CLR_FLT
uint16_t DRV8323regGateDrvHS =
3 << 8 |//lock
11 << 4 |//IDRIVEP_HS
15;//IDRIVEN_HS
uint16_t DRV8323regGateDrvLS =
1 << 10 |//CBC
2 << 8 |//TDRIVE
15 << 4 |//IDRIVEP_LS
15;//IDRIVEN_LS
uint16_t DRV8323regOcpCtrl =
0 << 10 |//TRETRY
1 < 8 |//dead 时间
1 << 6 |//OCP_MODE
2 << 4 |//OCP_DEG
0;//VDS_LVL
uint16_t DRV8323regCsaCtrl =
1 < 10 |//CSA_FET
1 << 9 |//VREF_DIV
0 < 8 |//LS_REF
2 < 6 |//CSA_GAIN
0 < 5 |//DIS_SEN
0 < 4 |//CSA_CAL_A
0 << 3 |//CCSA_CAL_B
0 << 2 |//CCSA_CAL_C
3;//CSEN_LVL
void DRV8323_Initiate_SPI (void);
uint16_t DRV8323_readSpi (uint8_t regAddr);
void DRV8323_writeSpi (uint8_t regAddr、uint16_t regVal);
void DRV8323_setupSpi (void);
DigitalIn mybutton (USER_Button);
int main()
{
volatile uint16_t temp;
myLED1 = 1;
myLED2=0;
myLED3= 1;
DRV8323_INITIAL_SPI ();
Wait_us (10);
while (1){
如果(mybutton ==1){//按钮被按下
myLED3=!myLED3;
DRV8323_setupSpi();
//wait (0.2);// 200ms
}
//DRV8323_writeSpi (ADR_DRV_CTRL、DRV8323regDrvCtrl);
Wait_us (1);
temp = DRV8323_readSpi (ADR_FAULT_STAT);
PC.printf ("whoami 寄存器= 0x%X\n"、temp);
myLED1 =!myLED1;
myLED2 =!myLED2;
Wait_us (50);
}
}
void DRV8323_INITIAL_SPI ()
{
SSEL1 = 1;
//为位数据设置 SPI、高稳定状态时钟、
//第二个边沿捕获、时钟速率为1MHz
DRV8323_SPI.format (16、3);
DRV8323_SPI.frequency(1000000);
}
uint16_t DRV8323_readSpi (uint8_t regAddr)
{
uint16_t controlword = 0x8000 |((regAddr & 0x7)<< 11);//MSbit =1对于读取、地址为3位(MSbit 始终为0)、数据为11位
//通过将芯片 SSEL1 = 0设置为低电平来选择 DRV 器件
SSEL1 = 1;
Wait_us (1);
SSEL1 = 0;
uint16_t whoami = DRV8323_SPI.write (controlword);
Wait_us (2);
SSEL1 = 1;
DRV8323_SPI.clear_transfer_buffer ();
return (whoami);
}
void DRV8323_writeSpi (uint8_t regAddr、uint16_t regVal)
{
uint16_t controlword =(regAdr & 0x7)<< 11 |(regVal & 0x7ff);//MSbit =0对于写操作、地址为3位(MSbit 始终为0)、数据为11位
SSEL1 = 1;
SSEL1 = 0;
DRV8323_SPI.write (controlword);
WAIT_us (1);//在将 sel 拉至高电平之前、在字之间至少等待400ns
SSEL1 = 1;
//HAL_GPIO_WritePin (GPIOC、GPIO_PIN_13、GPIO_PIN_RESET);
// HAL_SPI_transmit (&hspi3、(uint8_t*)(&controlword)、1、1000);
// HAL_GPIO_WritePin (GPIOC、GPIO_PIN_13、GPIO_PIN_SET);
DRV8323_SPI.clear_transfer_buffer ();
返回;
}
void DRV8323_setupSpi ()
{
volatile uint16_t setupbuffer[7];
// HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_SET);//Pb12启用到电机控制器
//在 TI 示例固件 www.ti.com/.../tida-00774中,DRV8323regGateDrvHS 先写入,然后写入两次
//在 www.ti.com/.../boostxl-drv8323rs中,5控制寄存器按顺序写入一次。
DRV8323_writeSpi (ADR_DRV_CTRL、DRV8323regDrvCtrl);
Wait_us (1);
DRV8323_writeSpi (ADR_GATE _DRV_HS、DRV8323regGateDrvHS);
Wait_us (1);
DRV8323_writeSpi (ADR_GATE _DRV_LS、DRV8323regGateDrvLS);
Wait_us (1);
DRV8323_writeSpi (ADR_OCP_CTRL、DRV8323regOcpCtrl);
Wait_us (1);
DRV8323_writeSpi (ADR_CSA_CTRL、DRV8323regCsaCtrl);
Wait_us (1);
setupbuffer[0]= DRV8323_readSpi (ADR_FAULT_STAT);
Wait_us (1);
setupbuffer[1]= DRV8323_readSpi (ADR_VGS_STAT);
Wait_us (1);
setupbuffer[2]= DRV8323_readSpi (ADR_DRV_CTRL);
Wait_us (1);
setupbuffer[3]= DRV8323_readSpi (ADR_GATE _DRV_HS);
Wait_us (1);
setupbuffer[4]= DRV8323_readSpi (ADR_GATE _DRV_LS);
Wait_us (1);
setupbuffer[5]= DRV8323_readSpi (ADR_OCP_CTRL);
Wait_us (1);
setupbuffer[6]= DRV8323_readSpi (ADR_CSA_CTRL);
Wait_us (1);
PC.printf ("ADR_FAULT_STAT =%x\n"、setupbuffer[0]);
PC.printf ("ADR_VGS_STAT =%x\n"、setupbuffer[1]);
PC.printf ("ADR_DRV_CTRL =%x\n"、setupbuffer[2]);
PC.printf ("ADR_GATE _DRV_HS =%x\n"、setupbuffer[3]);
PC.printf ("ADR_GATE _DRV_LS =%x\n"、setupbuffer[4]);
PC.printf ("ADR_OCP_CTRL =%x\n"、setupbuffer[5]);
PC.printf ("ADR_CSA_CTRL =%x\n"、setupbuffer[6]);
返回;
}