void DRV8301_writeData(DRV8301_Handle handle, DRV_SPI_8301_Vars_t *Spi_8301_Vars) { DRV8301_RegName_e drvRegName; uint16_t drvDataNew; if(Spi_8301_Vars->SndCmd) { // Update Control Register 1 drvRegName = DRV8301_RegName_Control_1; drvDataNew = Spi_8301_Vars->Ctrl_Reg_1.DRV8301_CURRENT | \ Spi_8301_Vars->Ctrl_Reg_1.DRV8301_RESET | \ Spi_8301_Vars->Ctrl_Reg_1.PWM_MODE | \ Spi_8301_Vars->Ctrl_Reg_1.OC_MODE | \ Spi_8301_Vars->Ctrl_Reg_1.OC_ADJ_SET; DRV8301_writeSpi(handle,drvRegName,drvDataNew); // Update Control Register 2 drvRegName = DRV8301_RegName_Control_2; drvDataNew = Spi_8301_Vars->Ctrl_Reg_2.OCTW_SET | \ Spi_8301_Vars->Ctrl_Reg_2.GAIN | \ Spi_8301_Vars->Ctrl_Reg_2.DC_CAL_CH1p2 | \ Spi_8301_Vars->Ctrl_Reg_2.OC_TOFF; DRV8301_writeSpi(handle,drvRegName,drvDataNew); Spi_8301_Vars->SndCmd = false; } return; } // end of DRV8301_writeData() function
void DRV8301_setupSpi() { unsigned int drvDataNew; unsigned int n; // Update Control Register 1 drvDataNew = (drv8301.peakCurrent | \ drv8301.resetStatus | \ drv8301.pwmMode | \ drv8301.OverCurrentMode | \ drv8301.OverCurrentAdjust); DRV8301_writeSpi(drv8301.bits.ControlRegister1,drvDataNew); // Update Control Register 2 drvDataNew = (drv8301.tempWarning | drv8301.gain); DRV8301_writeSpi(drv8301.bits.ControlRegister2,drvDataNew); drv8301.SndCmd = false; drv8301.RcvCmd = false; // Wait for the DRV8301 registers to update for(n=0;n<100;n++) asm(" NOP"); // Update Status Register 1 drvDataNew = DRV8301_readSpi(drv8301.bits.StatusRegister1); drv8301.fault = (drvDataNew & drv8301.bits.fault); drv8301.OverTempShutdown = (drvDataNew & (1 << 7)); drv8301.OverTempWarning = (drvDataNew & (1 << 6)); // Update Status Register 2 drvDataNew = DRV8301_readSpi(drv8301.bits.StatusRegister2); drv8301.deviceID = (drvDataNew & (15 << 0)); // Update Control Register 1 drvDataNew = DRV8301_readSpi(drv8301.bits.ControlRegister2); drv8301.peakCurrent = (drvDataNew & (3 << 0)); drv8301.resetStatus = (drvDataNew & 1 << 2); drv8301.pwmMode = (drvDataNew & drv8301.bits.PwmMode); drv8301.OverCurrentMode = (drvDataNew & drv8301.bits.OverCurrentMode); drv8301.OverCurrentAdjust = (drvDataNew & drv8301.bits.OverCurrentAdjust); // Update Control Register 2 drvDataNew = DRV8301_readSpi(drv8301.bits.ControlRegister2); drv8301.tempWarning = (drvDataNew & drv8301.bits.tempWarning); drv8301.gain = (drvDataNew & (3 << 2)); return; }
void DRV8301_setDcCalMode(DRV8301_Handle handle,const DRV8301_ShuntAmpNumber_e ampNumber,const DRV8301_DcCalMode_e mode) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_2); // clear the bits if(ampNumber == DRV8301_ShuntAmpNumber_1) { data &= (~DRV8301_CTRL2_DC_CAL_1_BITS); } else if(ampNumber == DRV8301_ShuntAmpNumber_2) { data &= (~DRV8301_CTRL2_DC_CAL_2_BITS); } // set the bits data |= mode; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_2,data); return; } // end of DRV8301_setDcCalMode() function
void DRV8301_writeData() { unsigned int drvData; if(drv8301.SndCmd) { // Update Control Register 1 drvData = drv8301.peakCurrent | \ drv8301.resetStatus | \ drv8301.pwmMode | \ drv8301.OverCurrentMode | \ drv8301.OverCurrentAdjust; DRV8301_writeSpi(drv8301.bits.ControlRegister1,drvData); // Update Control Register 2 drvData = drv8301.tempWarning | drv8301.gain; DRV8301_writeSpi(drv8301.bits.ControlRegister2,drvData); drv8301.SndCmd = false; } return; }
void DRV8301_reset() { unsigned int data; // read data data = DRV8301_readSpi(drv8301.bits.ControlRegister1); // set the bits data |= (1 << 2); // write the data DRV8301_writeSpi(drv8301.bits.ControlRegister1,data); return; } // end of DRV8301_reset() function
void DRV8301_reset(DRV8301_Handle handle) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_1); // set the bits data |= DRV8301_CTRL1_GATE_RESET_BITS; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_1,data); return; } // end of DRV8301_reset() function
void DRV8301_setShuntAmpGain(DRV8301_Handle handle,const DRV8301_ShuntAmpGain_e gain) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_2); // clear the bits data &= (~DRV8301_CTRL2_GAIN_BITS); // set the bits data |= gain; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_2,data); return; } // end of DRV8301_setShuntAmpGain() function
void DRV8301_setPwmMode(DRV8301_Handle handle,const DRV8301_PwmMode_e mode) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_1); // clear the bits data &= (~DRV8301_CTRL1_PWM_MODE_BITS); // set the bits data |= mode; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_1,data); return; } // end of DRV8301_setPwmMode() function
void DRV8301_setPeakCurrent(DRV8301_Handle handle,const DRV8301_PeakCurrent_e peakCurrent) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_1); // clear the bits data &= (~DRV8301_CTRL1_GATE_CURRENT_BITS); // set the bits data |= peakCurrent; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_1,data); return; } // end of DRV8301_setPeakCurrent() function
void DRV8301_setOcTwMode(DRV8301_Handle handle,const DRV8301_OcTwMode_e mode) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_2); // clear the bits data &= (~DRV8301_CTRL2_OCTW_SET_BITS); // set the bits data |= mode; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_2,data); return; } // end of DRV8301_setOcTwMode() function
void DRV8301_setOcLevel(DRV8301_Handle handle,const DRV8301_VdsLevel_e VdsLevel) { uint16_t data; // read data data = DRV8301_readSpi(handle,DRV8301_RegName_Control_1); // clear the bits data &= (~DRV8301_CTRL1_OC_ADJ_SET_BITS); // set the bits data |= VdsLevel; // write the data DRV8301_writeSpi(handle,DRV8301_RegName_Control_1,data); return; } // end of DRV8301_setOcLevel() function
void DRV8301_setupSpi(DRV8301_Handle handle, DRV_SPI_8301_Vars_t *Spi_8301_Vars) { DRV8301_RegName_e drvRegName; uint16_t drvDataNew; // Why impose hardcoded values? // Defaults should be device defaults or application level specified. // Setting other hardcoded here is just confusing! #if 0 // Update Control Register 1 drvRegName = DRV8301_RegName_Control_1; drvDataNew = (DRV8301_PeakCurrent_0p25_A | \ DRV8301_Reset_Normal | \ DRV8301_PwmMode_Six_Inputs | \ DRV8301_OcMode_CurrentLimit | \ DRV8301_VdsLevel_0p730_V); DRV8301_writeSpi(handle,drvRegName,drvDataNew); // Update Control Register 2 drvRegName = DRV8301_RegName_Control_2; drvDataNew = (DRV8301_OcTwMode_Both | \ DRV8301_ShuntAmpGain_10VpV | \ DRV8301_DcCalMode_Ch1_Load | \ DRV8301_DcCalMode_Ch2_Load | \ DRV8301_OcOffTimeMode_Normal); DRV8301_writeSpi(handle,drvRegName,drvDataNew); #endif Spi_8301_Vars->SndCmd = false; Spi_8301_Vars->RcvCmd = false; // Wait for the DRV8301 registers to update osDelay(1); // Update Status Register 1 drvRegName = DRV8301_RegName_Status_1; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Stat_Reg_1.FAULT = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FAULT_BITS); Spi_8301_Vars->Stat_Reg_1.GVDD_UV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_GVDD_UV_BITS); Spi_8301_Vars->Stat_Reg_1.PVDD_UV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_PVDD_UV_BITS); Spi_8301_Vars->Stat_Reg_1.OTSD = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_OTSD_BITS); Spi_8301_Vars->Stat_Reg_1.OTW = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_OTW_BITS); Spi_8301_Vars->Stat_Reg_1.FETHA_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHA_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLA_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLA_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETHB_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHB_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLB_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLB_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETHC_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHC_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLC_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLC_OC_BITS); // Update Status Register 2 drvRegName = DRV8301_RegName_Status_2; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Stat_Reg_2.GVDD_OV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS2_GVDD_OV_BITS); Spi_8301_Vars->Stat_Reg_2.DeviceID = (uint16_t)(drvDataNew & (uint16_t)DRV8301_STATUS2_ID_BITS); // Update Control Register 1 drvRegName = DRV8301_RegName_Control_1; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Ctrl_Reg_1.DRV8301_CURRENT = (DRV8301_PeakCurrent_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_GATE_CURRENT_BITS); Spi_8301_Vars->Ctrl_Reg_1.DRV8301_RESET = (DRV8301_Reset_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_GATE_RESET_BITS); Spi_8301_Vars->Ctrl_Reg_1.PWM_MODE = (DRV8301_PwmMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_PWM_MODE_BITS); Spi_8301_Vars->Ctrl_Reg_1.OC_MODE = (DRV8301_OcMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_OC_MODE_BITS); Spi_8301_Vars->Ctrl_Reg_1.OC_ADJ_SET = (DRV8301_VdsLevel_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_OC_ADJ_SET_BITS); // Update Control Register 2 drvRegName = DRV8301_RegName_Control_2; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Ctrl_Reg_2.OCTW_SET = (DRV8301_OcTwMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_OCTW_SET_BITS); Spi_8301_Vars->Ctrl_Reg_2.GAIN = (DRV8301_ShuntAmpGain_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_GAIN_BITS); Spi_8301_Vars->Ctrl_Reg_2.DC_CAL_CH1p2 = (DRV8301_DcCalMode_e)(drvDataNew & (uint16_t)(DRV8301_CTRL2_DC_CAL_1_BITS | DRV8301_CTRL2_DC_CAL_2_BITS)); Spi_8301_Vars->Ctrl_Reg_2.OC_TOFF = (DRV8301_OcOffTimeMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_OC_TOFF_BITS); return; }
void DRV8301_setupSpi(DRV8301_Handle handle, DRV_SPI_8301_Vars_t *Spi_8301_Vars) { DRV8301_RegName_e drvRegName; uint16_t drvDataNew; uint16_t n; // Update Control Register 1 drvRegName = DRV8301_RegName_Control_1; drvDataNew = (DRV8301_PeakCurrent_0p25_A | \ DRV8301_Reset_Normal | \ DRV8301_PwmMode_Six_Inputs | \ DRV8301_OcMode_CurrentLimit | \ DRV8301_VdsLevel_0p730_V); DRV8301_writeSpi(handle,drvRegName,drvDataNew); // Update Control Register 2 drvRegName = DRV8301_RegName_Control_2; drvDataNew = (DRV8301_OcTwMode_Both | \ DRV8301_ShuntAmpGain_10VpV | \ DRV8301_DcCalMode_Ch1_Load | \ DRV8301_DcCalMode_Ch2_Load | \ DRV8301_OcOffTimeMode_Normal); DRV8301_writeSpi(handle,drvRegName,drvDataNew); Spi_8301_Vars->SndCmd = false; Spi_8301_Vars->RcvCmd = false; // Wait for the DRV8301 registers to update for(n=0;n<100;n++) asm(" NOP"); // Update Status Register 1 drvRegName = DRV8301_RegName_Status_1; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Stat_Reg_1.FAULT = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FAULT_BITS); Spi_8301_Vars->Stat_Reg_1.GVDD_UV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_GVDD_UV_BITS); Spi_8301_Vars->Stat_Reg_1.PVDD_UV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_PVDD_UV_BITS); Spi_8301_Vars->Stat_Reg_1.OTSD = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_OTSD_BITS); Spi_8301_Vars->Stat_Reg_1.OTW = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_OTW_BITS); Spi_8301_Vars->Stat_Reg_1.FETHA_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHA_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLA_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLA_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETHB_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHB_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLB_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLB_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETHC_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETHC_OC_BITS); Spi_8301_Vars->Stat_Reg_1.FETLC_OC = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS1_FETLC_OC_BITS); // Update Status Register 2 drvRegName = DRV8301_RegName_Status_2; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Stat_Reg_2.GVDD_OV = (bool)(drvDataNew & (uint16_t)DRV8301_STATUS2_GVDD_OV_BITS); Spi_8301_Vars->Stat_Reg_2.DeviceID = (uint16_t)(drvDataNew & (uint16_t)DRV8301_STATUS2_ID_BITS); // Update Control Register 1 drvRegName = DRV8301_RegName_Control_1; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Ctrl_Reg_1.DRV8301_CURRENT = (DRV8301_PeakCurrent_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_GATE_CURRENT_BITS); Spi_8301_Vars->Ctrl_Reg_1.DRV8301_RESET = (DRV8301_Reset_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_GATE_RESET_BITS); Spi_8301_Vars->Ctrl_Reg_1.PWM_MODE = (DRV8301_PwmMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_PWM_MODE_BITS); Spi_8301_Vars->Ctrl_Reg_1.OC_MODE = (DRV8301_OcMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_OC_MODE_BITS); Spi_8301_Vars->Ctrl_Reg_1.OC_ADJ_SET = (DRV8301_VdsLevel_e)(drvDataNew & (uint16_t)DRV8301_CTRL1_OC_ADJ_SET_BITS); // Update Control Register 2 drvRegName = DRV8301_RegName_Control_2; drvDataNew = DRV8301_readSpi(handle,drvRegName); Spi_8301_Vars->Ctrl_Reg_2.OCTW_SET = (DRV8301_OcTwMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_OCTW_SET_BITS); Spi_8301_Vars->Ctrl_Reg_2.GAIN = (DRV8301_ShuntAmpGain_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_GAIN_BITS); Spi_8301_Vars->Ctrl_Reg_2.DC_CAL_CH1p2 = (DRV8301_DcCalMode_e)(drvDataNew & (uint16_t)(DRV8301_CTRL2_DC_CAL_1_BITS | DRV8301_CTRL2_DC_CAL_2_BITS)); Spi_8301_Vars->Ctrl_Reg_2.OC_TOFF = (DRV8301_OcOffTimeMode_e)(drvDataNew & (uint16_t)DRV8301_CTRL2_OC_TOFF_BITS); return; }