Skip to content

Instantly share code, notes, and snippets.

@dotchang
Created December 28, 2016 16:36
Show Gist options
  • Save dotchang/ebf75658ac23e6724c37db12bd5cc24a to your computer and use it in GitHub Desktop.
Save dotchang/ebf75658ac23e6724c37db12bd5cc24a to your computer and use it in GitHub Desktop.
/* --COPYRIGHT--,BSD
* Copyright (c) 2015, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --/COPYRIGHT--*/
//! \file sw\modules\hal\boards\boostxldrv8305evm_revA\f28x\f2802x\src\hal.c
//! \brief Contains the various functions related to the HAL object (everything outside the CTRL system)
//!
//! (C) Copyright 2015, Texas Instruments, Inc.
// **************************************************************************
// the includes
// drivers
// modules
// platforms
#include "hal.h"
#include "user.h"
#include "hal_obj.h"
#ifdef FLASH
#pragma CODE_SECTION(HAL_setupFlash,"ramfuncs");
#endif
// **************************************************************************
// the defines
// **************************************************************************
// the globals
#ifdef F2802xF
#pragma DATA_SECTION(hal,"rom_accessed_data");
#endif
HAL_Obj hal;
// **************************************************************************
// the functions
void HAL_cal(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// enable the ADC clock
CLK_enableAdcClock(obj->clkHandle);
// Run the Device_cal() function
// This function copies the ADC and oscillator calibration values from TI reserved
// OTP into the appropriate trim registers
// This boot ROM automatically calls this function to calibrate the interal
// oscillators and ADC with device specific calibration data.
// If the boot ROM is bypassed by Code Composer Studio during the development process,
// then the calibration must be initialized by the application
ENABLE_PROTECTED_REGISTER_WRITE_MODE;
(*Device_cal)();
DISABLE_PROTECTED_REGISTER_WRITE_MODE;
// run offsets calibration in user's memory
HAL_AdcOffsetSelfCal(handle);
// run oscillator compensation
HAL_OscTempComp(handle);
// disable the ADC clock
CLK_disableAdcClock(obj->clkHandle);
return;
} // end of HAL_cal() function
void HAL_OscTempComp(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint16_t Temperature;
// disable the ADCs
ADC_disable(obj->adcHandle);
// power up the bandgap circuit
ADC_enableBandGap(obj->adcHandle);
// set the ADC voltage reference source to internal
ADC_setVoltRefSrc(obj->adcHandle,ADC_VoltageRefSrc_Int);
// enable the ADC reference buffers
ADC_enableRefBuffers(obj->adcHandle);
// Set main clock scaling factor (max45MHz clock for the ADC module)
ADC_setDivideSelect(obj->adcHandle,ADC_DivideSelect_ClkIn_by_2);
// power up the ADCs
ADC_powerUp(obj->adcHandle);
// enable the ADCs
ADC_enable(obj->adcHandle);
// enable non-overlap mode
ADC_enableNoOverlapMode(obj->adcHandle);
// connect channel A5 internally to the temperature sensor
ADC_setTempSensorSrc(obj->adcHandle, ADC_TempSensorSrc_Int);
// set SOC0 channel select to ADCINA5
ADC_setSocChanNumber(obj->adcHandle, ADC_SocNumber_0, ADC_SocChanNumber_A5);
// set SOC0 acquisition period to 26 ADCCLK
ADC_setSocSampleDelay(obj->adcHandle, ADC_SocNumber_0, ADC_SocSampleDelay_64_cycles);
// connect ADCINT1 to EOC0
ADC_setIntSrc(obj->adcHandle, ADC_IntNumber_1, ADC_IntSrc_EOC0);
// clear ADCINT1 flag
ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_1);
// enable ADCINT1
ADC_enableInt(obj->adcHandle, ADC_IntNumber_1);
// force start of conversion on SOC0
ADC_setSocFrc(obj->adcHandle, ADC_SocFrc_0);
// wait for end of conversion
while (ADC_getIntFlag(obj->adcHandle, ADC_IntNumber_1) == 0){}
// clear ADCINT1 flag
ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_1);
Temperature = ADC_readResult(obj->adcHandle, ADC_ResultNumber_0);
HAL_osc1Comp(handle, Temperature);
HAL_osc2Comp(handle, Temperature);
return;
} // end of HAL_OscTempComp() function
void HAL_osc1Comp(HAL_Handle handle, const int16_t sensorSample)
{
int16_t compOscFineTrim;
HAL_Obj *obj = (HAL_Obj *)handle;
ENABLE_PROTECTED_REGISTER_WRITE_MODE;
compOscFineTrim = ((sensorSample - getRefTempOffset())*(int32_t)getOsc1FineTrimSlope()
+ OSC_POSTRIM_OFF + FP_ROUND )/FP_SCALE + getOsc1FineTrimOffset() - OSC_POSTRIM;
if(compOscFineTrim > 31)
{
compOscFineTrim = 31;
}
else if(compOscFineTrim < -31)
{
compOscFineTrim = -31;
}
OSC_setTrim(obj->oscHandle, OSC_Number_1, HAL_getOscTrimValue(getOsc1CoarseTrim(), compOscFineTrim));
DISABLE_PROTECTED_REGISTER_WRITE_MODE;
return;
} // end of HAL_osc1Comp() function
void HAL_osc2Comp(HAL_Handle handle, const int16_t sensorSample)
{
int16_t compOscFineTrim;
HAL_Obj *obj = (HAL_Obj *)handle;
ENABLE_PROTECTED_REGISTER_WRITE_MODE;
compOscFineTrim = ((sensorSample - getRefTempOffset())*(int32_t)getOsc2FineTrimSlope()
+ OSC_POSTRIM_OFF + FP_ROUND )/FP_SCALE + getOsc2FineTrimOffset() - OSC_POSTRIM;
if(compOscFineTrim > 31)
{
compOscFineTrim = 31;
}
else if(compOscFineTrim < -31)
{
compOscFineTrim = -31;
}
OSC_setTrim(obj->oscHandle, OSC_Number_2, HAL_getOscTrimValue(getOsc2CoarseTrim(), compOscFineTrim));
DISABLE_PROTECTED_REGISTER_WRITE_MODE;
return;
} // end of HAL_osc2Comp() function
uint16_t HAL_getOscTrimValue(int16_t coarse, int16_t fine)
{
uint16_t regValue = 0;
if(fine < 0)
{
regValue = ((-fine) | 0x20) << 9;
}
else
{
regValue = fine << 9;
}
if(coarse < 0)
{
regValue |= ((-coarse) | 0x80);
}
else
{
regValue |= coarse;
}
return regValue;
} // end of HAL_getOscTrimValue() function
void HAL_AdcOffsetSelfCal(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint16_t AdcConvMean;
// disable the ADCs
ADC_disable(obj->adcHandle);
// power up the bandgap circuit
ADC_enableBandGap(obj->adcHandle);
// set the ADC voltage reference source to internal
ADC_setVoltRefSrc(obj->adcHandle,ADC_VoltageRefSrc_Int);
// enable the ADC reference buffers
ADC_enableRefBuffers(obj->adcHandle);
// power up the ADCs
ADC_powerUp(obj->adcHandle);
// enable the ADCs
ADC_enable(obj->adcHandle);
//Select VREFLO internal connection on B5
ADC_enableVoltRefLoConv(obj->adcHandle);
//Select channel B5 for all SOC
HAL_AdcCalChanSelect(handle, ADC_SocChanNumber_B5);
//Apply artificial offset (+80) to account for a negative offset that may reside in the ADC core
ADC_setOffTrim(obj->adcHandle, 80);
//Capture ADC conversion on VREFLO
AdcConvMean = HAL_AdcCalConversion(handle);
//Set offtrim register with new value (i.e remove artical offset (+80) and create a two's compliment of the offset error)
ADC_setOffTrim(obj->adcHandle, 80 - AdcConvMean);
//Select external ADCIN5 input pin on B5
ADC_disableVoltRefLoConv(obj->adcHandle);
return;
} // end of HAL_AdcOffsetSelfCal() function
void HAL_AdcCalChanSelect(HAL_Handle handle, const ADC_SocChanNumber_e chanNumber)
{
HAL_Obj *obj = (HAL_Obj *)handle;
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_0,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_2,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_3,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_4,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_5,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_6,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_7,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_8,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_9,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_10,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_11,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_12,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_13,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_14,chanNumber);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_15,chanNumber);
return;
} // end of HAL_AdcCalChanSelect() function
uint16_t HAL_AdcCalConversion(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint16_t index, SampleSize, Mean;
uint32_t Sum;
ADC_SocSampleDelay_e ACQPS_Value;
index = 0; //initialize index to 0
SampleSize = 256; //set sample size to 256 (**NOTE: Sample size must be multiples of 2^x where is an integer >= 4)
Sum = 0; //set sum to 0
Mean = 999; //initialize mean to known value
//Set the ADC sample window to the desired value (Sample window = ACQPS + 1)
ACQPS_Value = ADC_SocSampleDelay_7_cycles;
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_0,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_1,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_2,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_3,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_4,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_5,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_6,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_7,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_8,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_9,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_10,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_11,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_12,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_13,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_14,ACQPS_Value);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_15,ACQPS_Value);
// Enabled ADCINT1 and ADCINT2
ADC_enableInt(obj->adcHandle, ADC_IntNumber_1);
ADC_enableInt(obj->adcHandle, ADC_IntNumber_2);
// Disable continuous sampling for ADCINT1 and ADCINT2
ADC_setIntMode(obj->adcHandle, ADC_IntNumber_1, ADC_IntMode_EOC);
ADC_setIntMode(obj->adcHandle, ADC_IntNumber_2, ADC_IntMode_EOC);
//ADCINTs trigger at end of conversion
ADC_setIntPulseGenMode(obj->adcHandle, ADC_IntPulseGenMode_Prior);
// Setup ADCINT1 and ADCINT2 trigger source
ADC_setIntSrc(obj->adcHandle, ADC_IntNumber_1, ADC_IntSrc_EOC6);
ADC_setIntSrc(obj->adcHandle, ADC_IntNumber_2, ADC_IntSrc_EOC14);
// Setup each SOC's ADCINT trigger source
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_0, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_1, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_2, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_3, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_4, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_5, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_6, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_7, ADC_Int2TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_8, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_9, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_10, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_11, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_12, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_13, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_14, ADC_Int1TriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_15, ADC_Int1TriggersSOC);
// Delay before converting ADC channels
usDelay(ADC_DELAY_usec);
ADC_setSocFrcWord(obj->adcHandle, 0x00FF);
while( index < SampleSize )
{
//Wait for ADCINT1 to trigger, then add ADCRESULT0-7 registers to sum
while (ADC_getIntFlag(obj->adcHandle, ADC_IntNumber_1) == 0){}
//Must clear ADCINT1 flag since INT1CONT = 0
ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_1);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_0);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_1);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_2);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_3);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_4);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_5);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_6);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_7);
//Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum
while (ADC_getIntFlag(obj->adcHandle, ADC_IntNumber_2) == 0){}
//Must clear ADCINT2 flag since INT2CONT = 0
ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_2);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_8);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_9);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_10);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_11);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_12);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_13);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_14);
Sum += ADC_readResult(obj->adcHandle, ADC_ResultNumber_15);
index+=16;
} // end data collection
//Disable ADCINT1 and ADCINT2 to STOP the ping-pong sampling
ADC_disableInt(obj->adcHandle, ADC_IntNumber_1);
ADC_disableInt(obj->adcHandle, ADC_IntNumber_2);
//Calculate average ADC sample value
Mean = Sum / SampleSize;
// Clear start of conversion trigger
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_0, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_1, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_2, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_3, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_4, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_5, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_6, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_7, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_8, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_9, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_10, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_11, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_12, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_13, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_14, ADC_NoIntTriggersSOC);
ADC_setupSocTrigSrc(obj->adcHandle, ADC_SocNumber_15, ADC_NoIntTriggersSOC);
//return the average
return(Mean);
} // end of HAL_AdcCalConversion() function
void HAL_disableWdog(HAL_Handle halHandle)
{
HAL_Obj *hal = (HAL_Obj *)halHandle;
WDOG_disable(hal->wdogHandle);
return;
} // end of HAL_disableWdog() function
void HAL_disableGlobalInts(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
CPU_disableGlobalInts(obj->cpuHandle);
return;
} // end of HAL_disableGlobalInts() function
void HAL_enableAdcInts(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// enable the PIE interrupts associated with the ADC interrupts
PIE_enableAdcInt(obj->pieHandle,ADC_IntNumber_1);
// enable the ADC interrupts
ADC_enableInt(obj->adcHandle,ADC_IntNumber_1);
// enable the cpu interrupt for ADC interrupts
CPU_enableInt(obj->cpuHandle,CPU_IntNumber_10);
return;
} // end of HAL_enableAdcInts() function
void HAL_enableDebugInt(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
CPU_enableDebugInt(obj->cpuHandle);
return;
} // end of HAL_enableDebugInt() function
void HAL_enableDrv(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
DRV8305_enable(obj->drv8305Handle);
return;
} // end of HAL_enableDrv() function
void HAL_enableGlobalInts(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
CPU_enableGlobalInts(obj->cpuHandle);
return;
} // end of HAL_enableGlobalInts() function
void HAL_enablePwmInt(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
PIE_enablePwmInt(obj->pieHandle,PWM_Number_1);
// enable the interrupt
PWM_enableInt(obj->pwmHandle[PWM_Number_1]);
// enable the cpu interrupt for EPWM1_INT
CPU_enableInt(obj->cpuHandle,CPU_IntNumber_3);
return;
} // end of HAL_enablePwmInt() function
void HAL_setupFaults(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint_least8_t cnt;
// Configure Trip Mechanism for the Motor control software
// -Cycle by cycle trip on CPU halt
// -One shot fault trip zone
// These trips need to be repeated for EPWM1 ,2 & 3
for(cnt=0;cnt<3;cnt++)
{
PWM_enableTripZoneSrc(obj->pwmHandle[cnt],PWM_TripZoneSrc_CycleByCycle_TZ6_NOT);
PWM_enableTripZoneSrc(obj->pwmHandle[cnt],PWM_TripZoneSrc_CycleByCycle_TZ2_NOT);
// What do we want the OST/CBC events to do?
// TZA events can force EPWMxA
// TZB events can force EPWMxB
PWM_setTripZoneState_TZA(obj->pwmHandle[cnt],PWM_TripZoneState_EPWM_Low);
PWM_setTripZoneState_TZB(obj->pwmHandle[cnt],PWM_TripZoneState_EPWM_Low);
}
return;
} // end of HAL_setupFaults() function
HAL_Handle HAL_init(void *pMemory,const size_t numBytes)
{
uint_least8_t cnt;
HAL_Handle handle;
HAL_Obj *obj;
if(numBytes < sizeof(HAL_Obj))
return((HAL_Handle)NULL);
// assign the handle
handle = (HAL_Handle)pMemory;
// assign the object
obj = (HAL_Obj *)handle;
// initialize the watchdog driver
obj->wdogHandle = WDOG_init((void *)WDOG_BASE_ADDR,sizeof(WDOG_Obj));
// disable watchdog
HAL_disableWdog(handle);
// initialize the ADC
obj->adcHandle = ADC_init((void *)ADC_BASE_ADDR,sizeof(ADC_Obj));
#ifdef CAP
// Added by Dmitri Ranfft on 16.09.2015
// Initialize the eCAP
obj->capHandle = CAP_init((void *)CAP1_BASE_ADDR, sizeof(CAP_Obj));
#endif // CAP
// initialize the clock handle
obj->clkHandle = CLK_init((void *)CLK_BASE_ADDR,sizeof(CLK_Obj));
// initialize the CPU handle
obj->cpuHandle = CPU_init(&cpu,sizeof(cpu));
// initialize the FLASH handle
obj->flashHandle = FLASH_init((void *)FLASH_BASE_ADDR,sizeof(FLASH_Obj));
// initialize the GPIO handle
obj->gpioHandle = GPIO_init((void *)GPIO_BASE_ADDR,sizeof(GPIO_Obj));
// initialize the current offset estimator handles
for(cnt=0;cnt<USER_NUM_CURRENT_SENSORS;cnt++)
{
obj->offsetHandle_I[cnt] = OFFSET_init(&obj->offset_I[cnt],sizeof(obj->offset_I[cnt]));
}
// initialize the voltage offset estimator handles
for(cnt=0;cnt<USER_NUM_VOLTAGE_SENSORS;cnt++)
{
obj->offsetHandle_V[cnt] = OFFSET_init(&obj->offset_V[cnt],sizeof(obj->offset_V[cnt]));
}
// initialize the oscillator handle
obj->oscHandle = OSC_init((void *)OSC_BASE_ADDR,sizeof(OSC_Obj));
// initialize the PIE handle
obj->pieHandle = PIE_init((void *)PIE_BASE_ADDR,sizeof(PIE_Obj));
// initialize the PLL handle
obj->pllHandle = PLL_init((void *)PLL_BASE_ADDR,sizeof(PLL_Obj));
//Added by Maya
#ifdef SCI
// Init SCI A registers
obj->sciaHandle = SCI_init((void *) SCIA_BASE_ADDR, sizeof(SCI_Obj));
#endif // SCI
// initialize the SPIA handle
obj->spiAHandle = SPI_init((void *)SPIA_BASE_ADDR,sizeof(SPI_Obj));
// initialize PWM handle
obj->pwmHandle[0] = PWM_init((void *)PWM_ePWM1_BASE_ADDR,sizeof(PWM_Obj));
obj->pwmHandle[1] = PWM_init((void *)PWM_ePWM2_BASE_ADDR,sizeof(PWM_Obj));
obj->pwmHandle[2] = PWM_init((void *)PWM_ePWM3_BASE_ADDR,sizeof(PWM_Obj));
// initialize power handle
obj->pwrHandle = PWR_init((void *)PWR_BASE_ADDR,sizeof(PWR_Obj));
// initialize timer drivers
obj->timerHandle[0] = TIMER_init((void *)TIMER0_BASE_ADDR,sizeof(TIMER_Obj));
obj->timerHandle[1] = TIMER_init((void *)TIMER1_BASE_ADDR,sizeof(TIMER_Obj));
obj->timerHandle[2] = TIMER_init((void *)TIMER2_BASE_ADDR,sizeof(TIMER_Obj));
// initialize drv8305 interface
obj->drv8305Handle = DRV8305_init(&obj->drv8305,sizeof(obj->drv8305));
return(handle);
} // end of HAL_init() function
void HAL_setParams(HAL_Handle handle,const USER_Params *pUserParams)
{
uint_least8_t cnt;
HAL_Obj *obj = (HAL_Obj *)handle;
_iq beta_lp_pu = _IQ(pUserParams->offsetPole_rps/(float_t)pUserParams->ctrlFreq_Hz);
HAL_setNumCurrentSensors(handle,pUserParams->numCurrentSensors);
HAL_setNumVoltageSensors(handle,pUserParams->numVoltageSensors);
for(cnt=0;cnt<HAL_getNumCurrentSensors(handle);cnt++)
{
HAL_setOffsetBeta_lp_pu(handle,HAL_SensorType_Current,cnt,beta_lp_pu);
HAL_setOffsetInitCond(handle,HAL_SensorType_Current,cnt,_IQ(0.0));
HAL_setOffsetValue(handle,HAL_SensorType_Current,cnt,_IQ(0.0));
}
for(cnt=0;cnt<HAL_getNumVoltageSensors(handle);cnt++)
{
HAL_setOffsetBeta_lp_pu(handle,HAL_SensorType_Voltage,cnt,beta_lp_pu);
HAL_setOffsetInitCond(handle,HAL_SensorType_Voltage,cnt,_IQ(0.0));
HAL_setOffsetValue(handle,HAL_SensorType_Voltage,cnt,_IQ(0.0));
}
// disable global interrupts
CPU_disableGlobalInts(obj->cpuHandle);
// disable cpu interrupts
CPU_disableInts(obj->cpuHandle);
// clear cpu interrupt flags
CPU_clearIntFlags(obj->cpuHandle);
// setup the clocks
HAL_setupClks(handle);
// Setup the PLL
HAL_setupPll(handle,PLL_ClkFreq_60_MHz);
// setup the PIE
HAL_setupPie(handle);
// run the device calibration
HAL_cal(handle);
// setup the peripheral clocks
HAL_setupPeripheralClks(handle);
// setup the GPIOs
HAL_setupGpios(handle);
// setup the flash
HAL_setupFlash(handle);
// setup the ADCs
HAL_setupAdcs(handle);
// setup the PWMs
HAL_setupPwms(handle,
(float_t)pUserParams->systemFreq_MHz,
pUserParams->pwmPeriod_usec,
USER_NUM_PWM_TICKS_PER_ISR_TICK);
// setup the spiA
HAL_setupSpiA(handle);
// setup the timers
HAL_setupTimers(handle,
(float_t)pUserParams->systemFreq_MHz);
// setup the drv8305 interface
HAL_setupGate(handle);
// set the default current bias
{
uint_least8_t cnt;
_iq bias = _IQ12mpy(ADC_dataBias,_IQ(pUserParams->current_sf));
for(cnt=0;cnt<HAL_getNumCurrentSensors(handle);cnt++)
{
HAL_setBias(handle,HAL_SensorType_Current,cnt,bias);
}
}
//Added by Maya
#ifdef SCI
HAL_setupSCI(handle);
#endif // SCI
//Added by Dmitri Ranfft on 16.09.2015
#ifdef CAP
HAL_setupCAP(handle);
#endif // CAP
// set the current scale factor
{
_iq current_sf = _IQ(pUserParams->current_sf);
HAL_setCurrentScaleFactor(handle,current_sf);
}
// set the default voltage bias
{
uint_least8_t cnt;
_iq bias = _IQ(0.0);
for(cnt=0;cnt<HAL_getNumVoltageSensors(handle);cnt++)
{
HAL_setBias(handle,HAL_SensorType_Voltage,cnt,bias);
}
}
// set the voltage scale factor
{
_iq voltage_sf = _IQ(pUserParams->voltage_sf);
HAL_setVoltageScaleFactor(handle,voltage_sf);
}
return;
} // end of HAL_setParams() function
void HAL_setupAdcs(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// disable the ADCs
ADC_disable(obj->adcHandle);
// power up the bandgap circuit
ADC_enableBandGap(obj->adcHandle);
// set the ADC voltage reference source to internal
ADC_setVoltRefSrc(obj->adcHandle,ADC_VoltageRefSrc_Int);
// enable the ADC reference buffers
ADC_enableRefBuffers(obj->adcHandle);
// power up the ADCs
ADC_powerUp(obj->adcHandle);
// enable the ADCs
ADC_enable(obj->adcHandle);
// set the ADC interrupt pulse generation to prior
ADC_setIntPulseGenMode(obj->adcHandle,ADC_IntPulseGenMode_Prior);
// set the temperature sensor source to external
ADC_setTempSensorSrc(obj->adcHandle,ADC_TempSensorSrc_Ext);
// configure the interrupt sources
ADC_disableInt(obj->adcHandle,ADC_IntNumber_1);
ADC_setIntMode(obj->adcHandle,ADC_IntNumber_1,ADC_IntMode_ClearFlag);
ADC_setIntSrc(obj->adcHandle,ADC_IntNumber_1,ADC_IntSrc_EOC7);
//configure the SOCs for boostxldrv8305evm_revA
// sample the first sample twice due to errata sprz342f
// ISEN_A
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_0,ADC_SocChanNumber_B1);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_0,ADC_SocSampleDelay_7_cycles);
// ISEN_A
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,ADC_SocChanNumber_B1);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_1,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_1,ADC_SocSampleDelay_7_cycles);
// ISEN_B
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_2,ADC_SocChanNumber_B3);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_2,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_2,ADC_SocSampleDelay_7_cycles);
// ISEN_C
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_3,ADC_SocChanNumber_B7);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_3,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_3,ADC_SocSampleDelay_7_cycles);
// VSEN_A
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_4,ADC_SocChanNumber_A7);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_4,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_4,ADC_SocSampleDelay_7_cycles);
// VSEN_B
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_5,ADC_SocChanNumber_A3);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_5,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_5,ADC_SocSampleDelay_7_cycles);
// VSEN_C
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_6,ADC_SocChanNumber_A1);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_6,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_6,ADC_SocSampleDelay_7_cycles);
// V_PVDD
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_7,ADC_SocChanNumber_A0);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_7,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_7,ADC_SocSampleDelay_7_cycles);
#ifdef HW_POT
// PotentiometerA
// Configure it so that ADC_SocTrigSrc_EPWM1_ADCSOCA will trigger a potentiometer conversion
ADC_setSocChanNumber(obj->adcHandle, ADC_SocNumber_8, ADC_SocChanNumber_A6);
ADC_setSocTrigSrc(obj->adcHandle, ADC_SocNumber_8, ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle, ADC_SocNumber_8, ADC_SocSampleDelay_11_cycles);
// PotentiometerB
// Configure it so that ADC_SocTrigSrc_EPWM1_ADCSOCA will trigger a potentiometer conversion
ADC_setSocChanNumber(obj->adcHandle, ADC_SocNumber_9, ADC_SocChanNumber_A4);
ADC_setSocTrigSrc(obj->adcHandle, ADC_SocNumber_9, ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle, ADC_SocNumber_9, ADC_SocSampleDelay_11_cycles);
// SW2
ADC_setSocChanNumber(obj->adcHandle, ADC_SocNumber_10, ADC_SocChanNumber_A2);
ADC_setSocTrigSrc(obj->adcHandle, ADC_SocNumber_10, ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle, ADC_SocNumber_10, ADC_SocSampleDelay_11_cycles);
#endif // HW_POT
return;
} // end of HAL_setupAdcs() function
void HAL_setupClks(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// enable internal oscillator 1
CLK_enableOsc1(obj->clkHandle);
// set the oscillator source
CLK_setOscSrc(obj->clkHandle,CLK_OscSrc_Internal);
// disable the external clock in
CLK_disableClkIn(obj->clkHandle);
// disable the crystal oscillator
CLK_disableCrystalOsc(obj->clkHandle);
// disable oscillator 2
CLK_disableOsc2(obj->clkHandle);
// set the low speed clock prescaler
CLK_setLowSpdPreScaler(obj->clkHandle,CLK_LowSpdPreScaler_SysClkOut_by_4);
// set the clock out prescaler
CLK_setClkOutPreScaler(obj->clkHandle,CLK_ClkOutPreScaler_SysClkOut_by_1);
return;
} // end of HAL_setupClks() function
void HAL_setupFlash(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
FLASH_enablePipelineMode(obj->flashHandle);
FLASH_setNumPagedReadWaitStates(obj->flashHandle,FLASH_NumPagedWaitStates_2);
FLASH_setNumRandomReadWaitStates(obj->flashHandle,FLASH_NumRandomWaitStates_2);
FLASH_setOtpWaitStates(obj->flashHandle,FLASH_NumOtpWaitStates_3);
FLASH_setStandbyWaitCount(obj->flashHandle,FLASH_STANDBY_WAIT_COUNT_DEFAULT);
FLASH_setActiveWaitCount(obj->flashHandle,FLASH_ACTIVE_WAIT_COUNT_DEFAULT);
return;
} // HAL_setupFlash() function
void HAL_setupGate(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
DRV8305_setSpiHandle(obj->drv8305Handle,obj->spiAHandle);
DRV8305_setGpioHandle(obj->drv8305Handle,obj->gpioHandle);
DRV8305_setGpioNumber(obj->drv8305Handle,GPIO_Number_6);
} // HAL_setupGate() function
void HAL_setupGpios(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// PWMA_H
GPIO_setMode(obj->gpioHandle,GPIO_Number_0,GPIO_0_Mode_EPWM1A);
// PWMA_L
GPIO_setMode(obj->gpioHandle,GPIO_Number_1,GPIO_1_Mode_EPWM1B);
// PWMB_H
GPIO_setMode(obj->gpioHandle,GPIO_Number_2,GPIO_2_Mode_EPWM2A);
// PWMB_L
GPIO_setMode(obj->gpioHandle,GPIO_Number_3,GPIO_3_Mode_EPWM2B);
// PWMC_H
#ifndef CAP
GPIO_setMode(obj->gpioHandle,GPIO_Number_4,GPIO_4_Mode_EPWM3A);
#else
// Edited by Dmitri Ranfft on 16.09.2015 (changed from EPWM3 to 4)
GPIO_setMode(obj->gpioHandle,GPIO_Number_6,GPIO_6_Mode_EPWM4A);
#endif // CAP
// PWMC_L
#ifndef CAP
GPIO_setMode(obj->gpioHandle,GPIO_Number_5,GPIO_5_Mode_EPWM3B);
#else
// Edited by Dmitri Ranfft on 16.09.2015 (changed from EPWM3 to 4)
GPIO_setMode(obj->gpioHandle,GPIO_Number_7,GPIO_7_Mode_EPWM4B);
// eCAP1
// Added by Dmitri Ranfft on 16.09.2015
GPIO_setPullUp(obj->gpioHandle, GPIO_Number_5, GPIO_PullUp_Enable);
GPIO_setQualification(obj->gpioHandle, GPIO_Number_5, GPIO_Qual_Sync);
GPIO_setMode(obj->gpioHandle,GPIO_Number_5,GPIO_5_Mode_ECAP1);
#endif // CAP
// EN_GATE
#ifndef CAP
GPIO_setMode(obj->gpioHandle,GPIO_Number_6,GPIO_6_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_6);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_6,GPIO_Direction_Output);
#else
// Edited by Dmitri Ranfft on 16.09.2015 (changed from GPIO 6 to 4)
GPIO_setMode(obj->gpioHandle,GPIO_Number_4,GPIO_4_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_4);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_4,GPIO_Direction_Output);
#endif
// WAKE
#ifndef CAP
GPIO_setMode(obj->gpioHandle,GPIO_Number_7,GPIO_7_Mode_GeneralPurpose);
GPIO_setHigh(obj->gpioHandle,GPIO_Number_7);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_7,GPIO_Direction_Output);
#else
// Edited by Dmitri Ranfft on 16.09.2015 (changed from GPIO 7 to 12)
GPIO_setMode(obj->gpioHandle,GPIO_Number_12,GPIO_12_Mode_GeneralPurpose);
GPIO_setHigh(obj->gpioHandle,GPIO_Number_12);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_12,GPIO_Direction_Output);
#endif // CAP
// No Connection
#ifndef CAP
GPIO_setMode(obj->gpioHandle,GPIO_Number_12,GPIO_12_Mode_GeneralPurpose);
#else
// Disabled by Dmitri Ranfft on 16.09.2015
//GPIO_setMode(obj->gpioHandle,GPIO_Number_12,GPIO_12_Mode_GeneralPurpose);
#endif
// SPI_SDI if JP4 is soldered, No Connection if JP4 is not soldered
GPIO_setMode(obj->gpioHandle,GPIO_Number_16,GPIO_16_Mode_SPISIMOA);
// SPI_SDO if JP6 is soldered, No Connection if JP6 is not soldered
GPIO_setMode(obj->gpioHandle,GPIO_Number_17,GPIO_17_Mode_SPISOMIA);
GPIO_setPullUp(obj->gpioHandle, GPIO_Number_17, GPIO_PullUp_Disable);
// SPI_CLK
GPIO_setMode(obj->gpioHandle,GPIO_Number_18,GPIO_18_Mode_SPICLKA);
// SPI_SCS
GPIO_setMode(obj->gpioHandle,GPIO_Number_19,GPIO_19_Mode_SPISTEA_NOT);
// nFAULT
#ifndef SCI
GPIO_setMode(obj->gpioHandle,GPIO_Number_28,GPIO_28_Mode_TZ2_NOT);
#else
//GPIO_setMode(obj->gpioHandle,GPIO_Number_28,GPIO_28_Mode_TZ2_NOT); // Edited by Dmitri Ranfft on 15.09.2015
// SCI_RX
GPIO_setMode(obj->gpioHandle,GPIO_Number_28,GPIO_28_Mode_SCIRXDA);
#endif
// No connection (TX)
#ifndef SCI
GPIO_setMode(obj->gpioHandle,GPIO_Number_29,GPIO_29_Mode_GeneralPurpose);
#else
//GPIO_setMode(obj->gpioHandle,GPIO_Number_29,GPIO_29_Mode_GeneralPurpose); // Edited by Dmitri Ranfft on 15.09.2015
// SCI_TX
GPIO_setMode(obj->gpioHandle,GPIO_Number_29,GPIO_29_Mode_SCITXDA);
#endif
// SPI_SDI if JP5 is soldered, No Connection if JP5 is not soldered
GPIO_setMode(obj->gpioHandle,GPIO_Number_32,GPIO_32_Mode_GeneralPurpose);
// SPI_SDO if JP7 is soldered, No Connection if JP7 is not soldered
GPIO_setMode(obj->gpioHandle,GPIO_Number_33,GPIO_33_Mode_GeneralPurpose);
// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_34,GPIO_34_Mode_GeneralPurpose);
// JTAG
GPIO_setMode(obj->gpioHandle,GPIO_Number_35,GPIO_35_Mode_JTAG_TDI);
GPIO_setMode(obj->gpioHandle,GPIO_Number_36,GPIO_36_Mode_JTAG_TMS);
GPIO_setMode(obj->gpioHandle,GPIO_Number_37,GPIO_37_Mode_JTAG_TDO);
GPIO_setMode(obj->gpioHandle,GPIO_Number_38,GPIO_38_Mode_JTAG_TCK);
#ifdef HW_SW
// Push Button SW2
//GPIO_setMode(obj->gpioHandle, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
// Push Button SW1
GPIO_setMode(obj->gpioHandle, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
#endif // HW_PB
return;
} // end of HAL_setupGpios() function
void HAL_setupLaunchPadGpio0and1(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// GPIO 0 (LED 2 on the LaunchPad)
// Since the LaunchPad uses the same GPIO pins for LEDs as PWM pins,
// the GPIO 0 and 1 are setup outside of the HAL file.
GPIO_setMode(obj->gpioHandle,GPIO_Number_0,GPIO_0_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_0);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_0,GPIO_Direction_Output);
// GPIO 1 (LED 4 on the LaunchPad)
// Since the LaunchPad uses the same GPIO pins for LEDs as PWM pins,
// the GPIO 0 and 1 are setup outside of the HAL file. GPIO 1 will be
// kept low so that there is no possibility of shoot-through conduction
// with the high side switch that is controlled by GPIO0.
GPIO_setMode(obj->gpioHandle,GPIO_Number_1,GPIO_1_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_1);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_1,GPIO_Direction_Output);
return;
} // end of HAL_setupGpios() function
void HAL_setupPie(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
PIE_disable(obj->pieHandle);
PIE_disableAllInts(obj->pieHandle);
PIE_clearAllInts(obj->pieHandle);
PIE_clearAllFlags(obj->pieHandle);
PIE_setDefaultIntVectorTable(obj->pieHandle);
PIE_enable(obj->pieHandle);
return;
} // end of HAL_setupPie() function
void HAL_setupPeripheralClks(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
CLK_enableAdcClock(obj->clkHandle);
CLK_enableCompClock(obj->clkHandle,CLK_CompNumber_1);
CLK_enableCompClock(obj->clkHandle,CLK_CompNumber_2);
CLK_enableCompClock(obj->clkHandle,CLK_CompNumber_3);
CLK_enableEcap1Clock(obj->clkHandle);
CLK_enablePwmClock(obj->clkHandle,PWM_Number_1);
CLK_enablePwmClock(obj->clkHandle,PWM_Number_2);
CLK_enablePwmClock(obj->clkHandle,PWM_Number_3);
CLK_enablePwmClock(obj->clkHandle,PWM_Number_4);
CLK_disableHrPwmClock(obj->clkHandle);
CLK_disableI2cClock(obj->clkHandle);
CLK_enableSciaClock(obj->clkHandle);
CLK_enableSpiaClock(obj->clkHandle);
CLK_enableTbClockSync(obj->clkHandle);
return;
} // end of HAL_setupPeripheralClks() function
void HAL_setupPll(HAL_Handle handle,const PLL_ClkFreq_e clkFreq)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// make sure PLL is not running in limp mode
if(PLL_getClkStatus(obj->pllHandle) != PLL_ClkStatus_Normal)
{
// reset the clock detect
PLL_resetClkDetect(obj->pllHandle);
// ???????
asm(" ESTOP0");
}
// Divide Select must be ClkIn/4 before the clock rate can be changed
if(PLL_getDivideSelect(obj->pllHandle) != PLL_DivideSelect_ClkIn_by_4)
{
PLL_setDivideSelect(obj->pllHandle,PLL_DivideSelect_ClkIn_by_4);
}
if(PLL_getClkFreq(obj->pllHandle) != clkFreq)
{
// disable the clock detect
PLL_disableClkDetect(obj->pllHandle);
// set the clock rate
PLL_setClkFreq(obj->pllHandle,clkFreq);
}
// wait until locked
while(PLL_getLockStatus(obj->pllHandle) != PLL_LockStatus_Done) {}
// enable the clock detect
PLL_enableClkDetect(obj->pllHandle);
// set divide select to ClkIn/2 to get desired clock rate
// NOTE: clock must be locked before setting this register
PLL_setDivideSelect(obj->pllHandle,PLL_DivideSelect_ClkIn_by_2);
return;
} // end of HAL_setupPll() function
void HAL_setupPwms(HAL_Handle handle,
const float_t systemFreq_MHz,
const float_t pwmPeriod_usec,
const uint_least16_t numPwmTicksPerIsrTick)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint16_t halfPeriod_cycles = (uint16_t)(systemFreq_MHz*pwmPeriod_usec) >> 1;
uint_least8_t cnt;
// turns off the outputs of the EPWM peripherals which will put the power switches
// into a high impedance state.
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_1]);
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_2]);
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_3]);
for(cnt=0;cnt<3;cnt++)
{
// setup the Time-Base Control Register (TBCTL)
PWM_setCounterMode(obj->pwmHandle[cnt],PWM_CounterMode_UpDown);
PWM_disableCounterLoad(obj->pwmHandle[cnt]);
PWM_setPeriodLoad(obj->pwmHandle[cnt],PWM_PeriodLoad_Immediate);
PWM_setSyncMode(obj->pwmHandle[cnt],PWM_SyncMode_EPWMxSYNC);
PWM_setHighSpeedClkDiv(obj->pwmHandle[cnt],PWM_HspClkDiv_by_1);
PWM_setClkDiv(obj->pwmHandle[cnt],PWM_ClkDiv_by_1);
PWM_setPhaseDir(obj->pwmHandle[cnt],PWM_PhaseDir_CountUp);
PWM_setRunMode(obj->pwmHandle[cnt],PWM_RunMode_FreeRun);
// setup the Timer-Based Phase Register (TBPHS)
PWM_setPhase(obj->pwmHandle[cnt],0);
// setup the Time-Base Counter Register (TBCTR)
PWM_setCount(obj->pwmHandle[cnt],0);
// setup the Time-Base Period Register (TBPRD)
// set to zero initially
PWM_setPeriod(obj->pwmHandle[cnt],0);
// setup the Counter-Compare Control Register (CMPCTL)
PWM_setLoadMode_CmpA(obj->pwmHandle[cnt],PWM_LoadMode_Zero);
PWM_setLoadMode_CmpB(obj->pwmHandle[cnt],PWM_LoadMode_Zero);
PWM_setShadowMode_CmpA(obj->pwmHandle[cnt],PWM_ShadowMode_Shadow);
PWM_setShadowMode_CmpB(obj->pwmHandle[cnt],PWM_ShadowMode_Immediate);
// setup the Action-Qualifier Output A Register (AQCTLA)
PWM_setActionQual_CntUp_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_Set);
PWM_setActionQual_CntDown_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_Clear);
// setup the Dead-Band Generator Control Register (DBCTL)
PWM_setDeadBandOutputMode(obj->pwmHandle[cnt],PWM_DeadBandOutputMode_EPWMxA_Rising_EPWMxB_Falling);
PWM_setDeadBandPolarity(obj->pwmHandle[cnt],PWM_DeadBandPolarity_EPWMxB_Inverted);
// setup the Dead-Band Rising Edge Delay Register (DBRED)
PWM_setDeadBandRisingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBRED_CNT);
// setup the Dead-Band Falling Edge Delay Register (DBFED)
PWM_setDeadBandFallingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBFED_CNT);
// setup the PWM-Chopper Control Register (PCCTL)
PWM_disableChopping(obj->pwmHandle[cnt]);
// setup the Trip Zone Select Register (TZSEL)
PWM_disableTripZones(obj->pwmHandle[cnt]);
}
// setup the Event Trigger Selection Register (ETSEL)
PWM_disableInt(obj->pwmHandle[PWM_Number_1]);
PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualZero);
PWM_enableSocAPulse(obj->pwmHandle[PWM_Number_1]);
// setup the Event Trigger Prescale Register (ETPS)
if(numPwmTicksPerIsrTick == 3)
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_ThirdEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_ThirdEvent);
}
else if(numPwmTicksPerIsrTick == 2)
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_SecondEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_SecondEvent);
}
else
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_FirstEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_FirstEvent);
}
// setup the Event Trigger Clear Register (ETCLR)
PWM_clearIntFlag(obj->pwmHandle[PWM_Number_1]);
PWM_clearSocAFlag(obj->pwmHandle[PWM_Number_1]);
// first step to synchronize the pwms
CLK_disableTbClockSync(obj->clkHandle);
// since the PWM is configured as an up/down counter, the period register is set to one-half
// of the desired PWM period
PWM_setPeriod(obj->pwmHandle[PWM_Number_1],halfPeriod_cycles);
PWM_setPeriod(obj->pwmHandle[PWM_Number_2],halfPeriod_cycles);
PWM_setPeriod(obj->pwmHandle[PWM_Number_3],halfPeriod_cycles);
// last step to synchronize the pwms
CLK_enableTbClockSync(obj->clkHandle);
return;
} // end of HAL_setupPwms() function
void HAL_setupSpiA(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
SPI_reset(obj->spiAHandle);
SPI_setMode(obj->spiAHandle,SPI_Mode_Master);
SPI_setClkPolarity(obj->spiAHandle,SPI_ClkPolarity_OutputRisingEdge_InputFallingEdge);
SPI_enableTx(obj->spiAHandle);
SPI_enableTxFifoEnh(obj->spiAHandle);
SPI_enableTxFifo(obj->spiAHandle);
SPI_setTxDelay(obj->spiAHandle,0x0010);
SPI_setBaudRate(obj->spiAHandle,(SPI_BaudRate_e)(0x0001));
SPI_setCharLength(obj->spiAHandle,SPI_CharLength_16_Bits);
SPI_setSuspend(obj->spiAHandle,SPI_TxSuspend_free);
SPI_enable(obj->spiAHandle);
return;
} // end of HAL_setupSpiA() function
void HAL_setupTimers(HAL_Handle handle,const float_t systemFreq_MHz)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint32_t timerPeriod_0p5ms = (uint32_t)(systemFreq_MHz * (float_t)500.0) - 1;
uint32_t timerPeriod_10ms = (uint32_t)(systemFreq_MHz * (float_t)10000.0) - 1;
// use timer 0 for frequency diagnostics
TIMER_setDecimationFactor(obj->timerHandle[0],0);
TIMER_setEmulationMode(obj->timerHandle[0],TIMER_EmulationMode_RunFree);
TIMER_setPeriod(obj->timerHandle[0],timerPeriod_0p5ms);
TIMER_setPreScaler(obj->timerHandle[0],0);
// use timer 1 for CPU usage diagnostics
TIMER_setDecimationFactor(obj->timerHandle[1],0);
TIMER_setEmulationMode(obj->timerHandle[1],TIMER_EmulationMode_RunFree);
TIMER_setPeriod(obj->timerHandle[1],timerPeriod_10ms);
TIMER_setPreScaler(obj->timerHandle[1],0);
// use timer 2 for CPU time diagnostics
TIMER_setDecimationFactor(obj->timerHandle[2],0);
TIMER_setEmulationMode(obj->timerHandle[2],TIMER_EmulationMode_RunFree);
TIMER_setPeriod(obj->timerHandle[2],0xFFFFFFFF);
TIMER_setPreScaler(obj->timerHandle[2],0);
return;
} // end of HAL_setupTimers() function
//Added by Maya
void HAL_setupSCI(HAL_Handle handle) {
#ifdef SCI
HAL_Obj *obj = (HAL_Obj *) handle;
char *msg;
//FIFO
// SCIFFTX = 0xE040
SCI_enableChannels(obj->sciaHandle); // SCI reset
SCI_enableTxFifoEnh(obj->sciaHandle); // SCI FIFO transmit enable
SCI_enableTxFifo(obj->sciaHandle); // SCI FIFO transmit reset/reenable
SCI_clearTxFifoInt(obj->sciaHandle); // SCI clear FIFO transmit interrupt flag
SCI_disableTxFifoInt(obj->sciaHandle); // disable FIFO transmit interrupt
SCI_setTxFifoIntLevel(obj->sciaHandle, SCI_FifoLevel_Empty); // FIFO interrupt level
// SCIFFRX = 0x2041
SCI_enableRxFifo(obj->sciaHandle); // SCI FIFO receive reset/reenable
SCI_clearRxFifoInt(obj->sciaHandle); // SCI clear FIFO receive interrupt flag
SCI_disableRxFifoInt(obj->sciaHandle); // disable FIFO receive interrupt
SCI_setRxFifoIntLevel(obj->sciaHandle, SCI_FifoLevel_1_Word); // FIFO interrupt level
SCI_enableRxFifoInt(obj->sciaHandle);
// SCI stop bit, parity, loopback, char bits, idle/address mode (SCICCR = 0x07)
SCI_setNumStopBits(obj->sciaHandle, SCI_NumStopBits_One); // SCICCR bit 7
SCI_setParity(obj->sciaHandle, SCI_Parity_Odd); // SCICCR bit 6
SCI_disableParity(obj->sciaHandle); // SCICCR bit 5
//SCI_enableParity(obj->sciaHandle);
SCI_disableLoopBack(obj->sciaHandle); // SCICCR bit 4
SCI_setMode(obj->sciaHandle, SCI_Mode_IdleLine); // SCICCR bit 3
SCI_setCharLength(obj->sciaHandle, SCI_CharLength_8_Bits);// SCICCR bit 0-2
// TX enable, RX enable, RX ERR INT enable, SLEEP, TXWAKE (SCICTL1 = 0x03)
SCI_disableRxErrorInt(obj->sciaHandle); // SCICTL1 bit 6
SCI_disable(obj->sciaHandle); // SCICTL1 bit 5
SCI_disableTxWake(obj->sciaHandle); // SCICTL1 bit 3
SCI_disableSleep(obj->sciaHandle); // SCICTL1 bit 2
SCI_enableTx(obj->sciaHandle); // SCICTL1 bit 1
SCI_enableRx(obj->sciaHandle); // SCICTL1 bit 0
// TXINT enable, RXINT enable, TXEMPTY, TXRDY (SCICTL2 = 0x03)
SCI_enableRxInt(obj->sciaHandle); // SCICTL2 bit 1
SCI_disableTxInt(obj->sciaHandle); // SCICTL2 bit 0
// SCIH-SCIL BAUD - SCI_BAUD = (LSPCLK/(SCI_BRR*8)) - 1
SCI_setBaudRate(obj->sciaHandle, SCI_BaudRate_9_6_kBaud);
// Reset SCI
SCI_enable(obj->sciaHandle);
msg = "\r\n\n ********** SCI setup is done! **********\0";
SCI_writeMsg(obj->sciaHandle, msg);
//PIE_enableSciInt(obj->pieHandle, SCI_RXA); // enable SCI interrupt
PIE_enableInt(halHandle->pieHandle, PIE_GroupNumber_9, PIE_InterruptSource_SCIARX);
CPU_enableInt(obj->cpuHandle, CPU_IntNumber_9); // enable CPU interrupt
#endif // of SCI
}
#ifdef SCI
//Added by Maya
//SCIA
SCI_FifoStatus_e HAL_sciaGetRxFifoStatus(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_getRxFifoStatus(obj->sciaHandle));
} // end of HAL_scigetRXFIFOStatus() function
//Added by Maya
void HAL_sciaWrite(HAL_Handle handle, const uint16_t data) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_write(obj->sciaHandle, data);
}
//Added by Maya
void HAL_sciaWriteMsg(HAL_Handle handle, char * msg) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_writeMsg(obj->sciaHandle, msg);
}
//Added by Maya
uint16_t HAL_sciaRead(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_read(obj->sciaHandle));
}
//Added by Maya
void HAL_sciaClearRxFifoOvf(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_clearRxFifoOvf(obj->sciaHandle);
}
//Added by Maya
void HAL_sciaClearRxFifoInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_clearRxFifoInt(obj->sciaHandle);
}
//Added by Maya
void HAL_sciaClearTxFifoInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_clearTxFifoInt(obj->sciaHandle);
}
void HAL_sciaEnableRxInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_enableRxInt(obj->sciaHandle);
}
void HAL_sciaDisableRxInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_disableRxInt(obj->sciaHandle);
}
void HAL_sciaEnableTxInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_enableTxInt(obj->sciaHandle);
}
void HAL_sciaDisableTxInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_disableTxInt(obj->sciaHandle);
}
bool HAL_sciaTxReady(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_txReady(obj->sciaHandle));
}
bool HAL_sciaTxEmpty(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_txEmpty(obj->sciaHandle));
}
bool HAL_sciaRxParityError(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_rxParityError(obj->sciaHandle));
}
bool HAL_sciaRxOverrunError(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_rxOverrunError(obj->sciaHandle));
}
bool HAL_sciaRxFrameError(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
return (SCI_rxFrameError(obj->sciaHandle));
}
void HAL_sciaEnable(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_enable(obj->sciaHandle);
}
void HAL_sciaDisable(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
SCI_disable(obj->sciaHandle);
}
#endif //End of SCI
#ifdef SCI
//Added by Maya, for PIE
void HAL_pieAckInt(HAL_Handle handle, const PIE_GroupNumber_e groupNumber) {
HAL_Obj *obj = (HAL_Obj *) handle;
PIE_clearInt(obj->pieHandle, groupNumber);
}
void HAL_enablePieInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
PIE_enable(obj->pieHandle);
}
void HAL_disablePieInt(HAL_Handle handle) {
HAL_Obj *obj = (HAL_Obj *) handle;
PIE_disable(obj->pieHandle);
}
#endif // SCI
void HAL_writeDrvData(HAL_Handle handle, DRV_SPI_8305_Vars_t *Spi_8305_Vars)
{
HAL_Obj *obj = (HAL_Obj *)handle;
DRV8305_writeData(obj->drv8305Handle,Spi_8305_Vars);
return;
} // end of HAL_writeDrvData() function
// Added by Dmitri Ranfft on 16.09.2015
void HAL_setupCAP(HAL_Handle handle)
{
#ifdef CAP
HAL_Obj *obj = (HAL_Obj *) handle;
CLK_enableEcap1Clock(obj->clkHandle);
CAP_disableInt(obj->capHandle, CAP_Int_Type_All); // Disable all capture interrupts
CAP_clearInt(obj->capHandle, CAP_Int_Type_All); // Clear all CAP interrupt flags
CAP_disableCaptureLoad(obj->capHandle); // Disable CAP1-CAP4 register loads
CAP_disableTimestampCounter(obj->capHandle); // Make sure the counter is stopped
// Configure peripheral registers
//CAP_setCapOneShot(obj->capHandle); // One-shot
CAP_setCapContinuous(obj->capHandle);
CAP_setStopWrap(obj->capHandle, CAP_Stop_Wrap_CEVT2);// Stop at 4 events
CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_1, CAP_Polarity_Rising); // Falling edge
CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_2, CAP_Polarity_Falling); // Rising edge
//CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_3, CAP_Polarity_Rising); // Falling edge
//CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_4, CAP_Polarity_Falling); // Rising edge
CAP_setCapEvtReset(obj->capHandle, CAP_Event_1, CAP_Reset_Enable); // Difference operation
CAP_setCapEvtReset(obj->capHandle, CAP_Event_2, CAP_Reset_Enable); // Difference operation
//CAP_setCapEvtReset(obj->capHandle, CAP_Event_3, CAP_Reset_Enable); // Difference operation
//CAP_setCapEvtReset(obj->capHandle, CAP_Event_4, CAP_Reset_Enable); // Difference operation
CAP_enableSyncIn(obj->capHandle); // Enable sync in
CAP_setSyncOut(obj->capHandle, CAP_SyncOut_SyncIn); // Pass through
CAP_enableCaptureLoad(obj->capHandle);
CAP_enableTimestampCounter(obj->capHandle); // Start Counter
//CAP_rearm(obj->capHandle); // arm one-shot
CAP_enableCaptureLoad(obj->capHandle); // Enable CAP1-CAP4 register loads
CAP_enableInt(obj->capHandle, CAP_Int_Type_CEVT2); // 4 events = interrupt
// Enable CPU INT4 which is connected to ECAP1-4 INT:
CPU_enableInt(obj->cpuHandle, CPU_IntNumber_4);
// Enable eCAP INTn in the PIE: Group 3 interrupt 1-6
PIE_enableCaptureInt(obj->pieHandle);
#endif
}
void HAL_readDrvData(HAL_Handle handle, DRV_SPI_8305_Vars_t *Spi_8305_Vars)
{
HAL_Obj *obj = (HAL_Obj *)handle;
DRV8305_readData(obj->drv8305Handle,Spi_8305_Vars);
return;
} // end of HAL_readDrvData() function
void HAL_setupDrvSpi(HAL_Handle handle, DRV_SPI_8305_Vars_t *Spi_8305_Vars)
{
HAL_Obj *obj = (HAL_Obj *)handle;
DRV8305_setupSpi(obj->drv8305Handle,Spi_8305_Vars);
return;
} // end of HAL_setupDrvSpi() function
void HAL_setDacParameters(HAL_Handle handle, HAL_DacData_t *pDacData)
{
HAL_Obj *obj = (HAL_Obj *)handle;
pDacData->PeriodMax = PWMDAC_getPeriod(obj->pwmDacHandle[PWMDAC_Number_1]);
pDacData->offset[0] = _IQ(0.5);
pDacData->offset[1] = _IQ(0.5);
pDacData->offset[2] = _IQ(0.0);
pDacData->offset[3] = _IQ(0.0);
pDacData->gain[0] = _IQ(1.0);
pDacData->gain[1] = _IQ(1.0);
pDacData->gain[2] = _IQ(1.0);
pDacData->gain[3] = _IQ(1.0);
return;
} //end of HAL_setDacParameters() function
// end of file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment