Other Parts Discussed in Thread: DRV8323, , LAUNCHXL-F280025C
Tool/software:
Hi,
My custom board use DRV8323RS, use GPIO11 as CS pin, download the universal_motorcontrol_lab, debug run to see if it can communicate with DRV chip, what I did :
1. setup GPIO, it's my custom board, I use GPIO11 as CS pin
GPIO_setPinConfig(GPIO_11_SPIA_STE);
GPIO_setDirectionMode(11, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);
2. inside DRV8323_setupSPI function, I insert my code to make sure the default values can be loaded (sorry I don't have logic analyzer)
drvDataNew0 to drvDataNew6 are for statReg00 to statReg06
after DRV8323_setupSPI is called, its default values was READ without issues (which is according to DRV's manual)
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
until now I am sure the communication with DRV is OK especially GPIO CS pin working !!!
=============================================
===== the weird thing happened when READ again =====
=============================================
when I try to READ the latest update value via HAL_readDRVData(motorHandle_M1->halMtrHandle, &drvicVars_M1) inside main.c loop
and force the READ action by set 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
it's return drvicVars_M1 values :
statReg00 = 0
statReg01 = 0
statReg02 = 0
statReg03 = 769
statReg04 = 1
statReg05 = 1
statReg00 = 1
my conclusion is when READ value again, it's cause setting corrupt ...
please help if anything wrong of the READ procedure ?
Danny


