主题中讨论的其他器件:DRV8323、 LAUNCHXL-F280025C
工具与软件:
您好!
我的定制电路板使用 DRV8323RS、使用 GPIO11作为 CS 引脚、下载 universal_motorcontrol_lab、运行调试以查看它是否可以与 DRV 芯片通信、我所做的就是:
1.设置 GPIO、 这是我的定制电路板、我 使用 GPIO11作为 CS 引脚
GPIO_setPinConfig (GPIO_11_SPIA_STE);
GPIO_setDirectionMode (11、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (11、GPIO_PIN_TYPE_STD);
2.在 DRV8323_setupSPI 函数内、 我插入代码以确保可以加载默认值(抱歉我没有 逻辑分析仪)
drvDataNew0至 drvDataNew6用于 statReg00至 statReg06
调用 DRV8323_setupSPI 后、其默认值已无问题地读取(根据 DRV 的手册)
drvDataNew0 = 0
drvDataNew1 = 0
drvDataNew2 = 0
drvDataNew3 = 1023
drvDataNew4 = 2047
drvDataNew5 = 345
drvDataNew6 = 643
void DRV8323_setupSPI(DRV8323_Handle handle, DRV8323_VARS_t *drv8323Vars)
{
DRV8323_Address_e drvRegAddr;
uint16_t drvDataNew;
// Set Default Values
// Manual Read/Write
drv8323Vars->manReadAddr = 0;
drv8323Vars->manReadData = 0;
drv8323Vars->manReadCmd = false;
drv8323Vars->manWriteAddr = 0;
drv8323Vars->manWriteData = 0;
drv8323Vars->manWriteCmd = false;
// Read/Write
drv8323Vars->readCmd = false;
drv8323Vars->writeCmd = false;
// Read registers for default values
// Read Status Register 0
drvRegAddr = DRV8323_ADDRESS_STATUS_0;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->statReg00.all = drvDataNew;
drvDataNew0 = drvDataNew;
// Read Status Register 1
drvRegAddr = DRV8323_ADDRESS_STATUS_1;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->statReg01.all = drvDataNew;
drvDataNew1 = drvDataNew;
// Read Control Register 2
// all bit default value are 0, 6*PWM Mode
drvRegAddr = DRV8323_ADDRESS_CONTROL_2;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg02.all = drvDataNew;
drvDataNew2 = drvDataNew;
// Read Control Register 3
// all bit default value are 1, IDRIVEP_HS=1000mA, IDRIVEN_HS = 2000mA
drvRegAddr = DRV8323_ADDRESS_CONTROL_3;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg03.all = drvDataNew;
drvDataNew3 = drvDataNew;
// Read Control Register 4
// all bit default value are 1, TDRIVE=400ns, IDRIVEP_LS=1000mA, IDRIVEN_LS = 2000mA
drvRegAddr = DRV8323_ADDRESS_CONTROL_4;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg04.all = drvDataNew;
drvDataNew4 = drvDataNew;
// Read Control Register 5
// DEAD_TIME=100ns, OCP_DEG=4us, VDS_LVL=0.75V
drvRegAddr = DRV8323_ADDRESS_CONTROL_5;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg05.all = drvDataNew;
drvDataNew5 = drvDataNew;
// Read Control Register 6
// DEAD_TIME=100ns, OCP_DEG=4us, VDS_LVL=0.75V
drvRegAddr = DRV8323_ADDRESS_CONTROL_6;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg06.all = drvDataNew;
drvDataNew6 = drvDataNew;
return;
} // end of DRV8323_setupSPI() function
到目前为止、我确信与 DRV 的通信是可以的、尤其是 GPIO CS 引脚工作正常!!!
================================
=== 再次读取===时会发生奇怪的事情
================================
尝试通过 main.c 循环内的 HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1)读取最新更新值时
并通过 设置 drv8323Vars->readCmd = true 来强制执行读取操作;
void DRV8323_readData(DRV8323_Handle handle, DRV8323_VARS_t *drv8323Vars)
{
DRV8323_Address_e drvRegAddr;
uint16_t drvDataNew;
drv8323Vars->readCmd = true;
if(drv8323Vars->readCmd)
{
// Read registers for default values
// Read Status Register 0
drvRegAddr = DRV8323_ADDRESS_STATUS_0;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->statReg00.all = drvDataNew;
// Read Status Register 1
drvRegAddr = DRV8323_ADDRESS_STATUS_1;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->statReg01.all = drvDataNew;
// Read Control Register 2
drvRegAddr = DRV8323_ADDRESS_CONTROL_2;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg02.all = drvDataNew;
// Read Control Register 3
drvRegAddr = DRV8323_ADDRESS_CONTROL_3;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg03.all = drvDataNew;
// Read Control Register 4
drvRegAddr = DRV8323_ADDRESS_CONTROL_4;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg04.all = drvDataNew;
// Read Control Register 5
drvRegAddr = DRV8323_ADDRESS_CONTROL_5;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg05.all = drvDataNew;
// Read Control Register 6
drvRegAddr = DRV8323_ADDRESS_CONTROL_6;
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->ctrlReg06.all = drvDataNew;
drv8323Vars->readCmd = false;
}
// Manual read from the DRV8323
if(drv8323Vars->manReadCmd)
{
// Custom Read
drvRegAddr = (DRV8323_Address_e)(drv8323Vars->manReadAddr << 11);
drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
drv8323Vars->manReadData = drvDataNew;
drv8323Vars->manReadCmd = false;
}
return;
} // end of DRV8323_readData() function
它返回 drvicVars_M1值:
statReg00 = 0
statReg01 = 0
statReg02 = 0
statReg03 = 769
statReg04 = 1
statReg05 = 1
statReg00 = 1
我的结论是当再次读取值,这是原因设置腐败...
如果阅读过程有任何错误、请提供帮助?
Danny


