This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8323:SPI 接口始终返回0x0000或0xFFFF

Guru**** 1127450 points
Other Parts Discussed in Thread: DRV8323
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/693567/drv8323-spi-interface-always-returns-0x0000-or-0xffff

器件型号:DRV8323

大家好、  

我的问题与之前在旧帖子中解决的问题相同、但在已解决的帖子中、没有描述解决问题的方法。  

本质上、我将写入 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 引脚上的位。  

如果您想查看、我可以发布分析器数据的快照。 我 已将我的代码附在下面、以供您关注。

e2e.ti.com/.../plots.pdf

#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]);
返回;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉更正:第1段
    '读取信息、但我只在使能引脚为高电平(3.3V)时读取0x0000、在低电平(0V)时读取0xFFFF。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿、Joshua、

    有几件事。 首先验证以下几项建议。

    首先、您应该读取默认不是0x0000的寄存器。 也称为寄存器0x03。 有关详细信息、请参阅数据表。

    接下来、SDO/nFAULT 上的上拉电压是多少? 3V3? 确保它是3V3。

    此外、请遵循下面的时序和时序图。