修改后的TSI程序如下:
TSIDrv.c
#include "TSIDrv.h"
#include "includes.h"
INT8U total_electrode = TOTAL_ELECTRODE;
INT8U elec_array[16]={ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5, ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
INT16U gu16TSICount[16];
INT16U gu16Baseline[16];
INT16U gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
INT16U gu16Delta[16];
INT16U ongoing_elec;
INT8U end_flag = TRUE;
INT8U j;
INT8U SliderPercentegePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT8U SliderDistancePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT16U AbsolutePercentegePosition = NO_TOUCH;
INT16U AbsoluteDistancePosition = NO_TOUCH;
void TSI_Init (void)
{
SIM_SCGC5 |= SIM_SCGC5_TSI_MASK; // Enable clock gating for TSI
/* Enable proper GPIO as TSI channels */
PORTB_PCR16 = PORT_PCR_MUX(0); // PTB16 as TSI channel 9
PORTB_PCR17 = PORT_PCR_MUX(0); // PTB17 as TSI channel 10
PORTC_PCR0 = PORT_PCR_MUX(0); // PTB17 as TSI channel 13
NVIC_DisableIRQ((IRQn_Type)TSI0_IRQn);
TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
| TSI_GENCS_MODE(0)
| TSI_GENCS_REFCHRG(4)
| TSI_GENCS_DVOLT(0)
| TSI_GENCS_EXTCHRG(7)
| TSI_GENCS_PS(4)
| TSI_GENCS_NSCN(11)
| TSI_GENCS_TSIIEN_MASK
| TSI_GENCS_STPE_MASK
//| TSI_GENCS_STM_MASK //Trigger for the module 0=Sofware
);
TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;
TSI_SelfCalibration();
}
void change_electrode(void)
{
int16_t u16temp_delta;
gu16TSICount[ongoing_elec] = (TSI0_DATA & TSI_DATA_TSICNT_MASK); // Save Counts for current electrode
u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec]; // Obtains Counts Delta from callibration reference
if( u16temp_delta < 0)
gu16Delta[ongoing_elec] = 0;
else
gu16Delta[ongoing_elec] = u16temp_delta;
if(total_electrode > 1) //Change Electrode to Scan
{
if((total_electrode-1) > ongoing_elec) ongoing_elec++;
else ongoing_elec = 0;
TSI0_DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
TSI0_DATA |= TSI_DATA_SWTS_MASK;
}
}
void TSI_Slider_LED(void )
{
if(end_flag)
{
end_flag = FALSE;
if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])||(gu16Delta[2] > gu16Threshold[2]))
{
if((gu16Delta[0] > gu16Threshold[0])) j=1;
if((gu16Delta[1] > gu16Threshold[1])) j=2;
if((gu16Delta[2] > gu16Threshold[2])) j=3;
}
else
{ j=6;
SliderPercentegePosition[0] = NO_TOUCH;
SliderPercentegePosition[1] = NO_TOUCH;
SliderPercentegePosition[2] = NO_TOUCH;
SliderDistancePosition[0] = NO_TOUCH;
SliderDistancePosition[1] = NO_TOUCH;
SliderDistancePosition[2] = NO_TOUCH;
AbsolutePercentegePosition = NO_TOUCH;
AbsoluteDistancePosition = NO_TOUCH;
}
}
}
void TSI0_IRQHandler(void)
{
end_flag = TRUE;
TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
change_electrode();
}