Created
December 28, 2016 16:36
-
-
Save dotchang/ebf75658ac23e6724c37db12bd5cc24a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* --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