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