34 #if defined(LESENSE_COUNT) && (LESENSE_COUNT > 0)
40 #if !defined(UINT32_MAX)
41 #define UINT32_MAX ((uint32_t)(0xFFFFFFFF))
96 void LESENSE_Init(LESENSE_Init_TypeDef
const *init,
bool const reqReset)
99 EFM_ASSERT((uint32_t)init->timeCtrl.startDelay < 4U);
100 EFM_ASSERT((uint32_t)init->perCtrl.dacPresc < 32U);
109 LESENSE_StartDelaySet((uint32_t)init->timeCtrl.startDelay);
119 ((uint32_t)init->coreCtrl.prsSel << _LESENSE_CTRL_PRSSEL_SHIFT)
120 | (uint32_t)init->coreCtrl.scanConfSel
121 | (uint32_t)init->coreCtrl.bufTrigLevel
122 | (uint32_t)init->coreCtrl.wakeupOnDMA
123 | ((uint32_t)init->coreCtrl.invACMP0 << _LESENSE_CTRL_ACMP0INV_SHIFT)
124 | ((uint32_t)init->coreCtrl.invACMP1 << _LESENSE_CTRL_ACMP1INV_SHIFT)
125 | ((uint32_t)init->coreCtrl.dualSample << _LESENSE_CTRL_DUALSAMPLE_SHIFT)
126 | ((uint32_t)init->coreCtrl.storeScanRes << _LESENSE_CTRL_STRSCANRES_SHIFT)
127 | ((uint32_t)init->coreCtrl.bufOverWr << _LESENSE_CTRL_BUFOW_SHIFT)
128 | ((uint32_t)init->coreCtrl.debugRun << _LESENSE_CTRL_DEBUGRUN_SHIFT);
132 LESENSE_ScanModeSet((LESENSE_ScanMode_TypeDef)init->coreCtrl.scanStart,
false);
139 ((uint32_t)init->perCtrl.dacCh0Data << _LESENSE_PERCTRL_DACCH0DATA_SHIFT)
140 | ((uint32_t)init->perCtrl.dacCh0ConvMode << _LESENSE_PERCTRL_DACCH0CONV_SHIFT)
141 | ((uint32_t)init->perCtrl.dacCh0OutMode << _LESENSE_PERCTRL_DACCH0OUT_SHIFT)
142 | ((uint32_t)init->perCtrl.dacCh1Data << _LESENSE_PERCTRL_DACCH1DATA_SHIFT)
143 | ((uint32_t)init->perCtrl.dacCh1ConvMode << _LESENSE_PERCTRL_DACCH1CONV_SHIFT)
144 | ((uint32_t)init->perCtrl.dacCh1OutMode << _LESENSE_PERCTRL_DACCH1OUT_SHIFT)
145 | ((uint32_t)init->perCtrl.dacPresc << _LESENSE_PERCTRL_DACPRESC_SHIFT)
146 | (uint32_t)init->perCtrl.dacRef
147 | ((uint32_t)init->perCtrl.acmp0Mode << _LESENSE_PERCTRL_ACMP0MODE_SHIFT)
148 | ((uint32_t)init->perCtrl.acmp1Mode << _LESENSE_PERCTRL_ACMP1MODE_SHIFT)
149 | (uint32_t)init->perCtrl.warmupMode;
160 (uint32_t)init->decCtrl.decInput
161 | ((uint32_t)init->decCtrl.prsChSel0 << _LESENSE_DECCTRL_PRSSEL0_SHIFT)
162 | ((uint32_t)init->decCtrl.prsChSel1 << _LESENSE_DECCTRL_PRSSEL1_SHIFT)
163 | ((uint32_t)init->decCtrl.prsChSel2 << _LESENSE_DECCTRL_PRSSEL2_SHIFT)
164 | ((uint32_t)init->decCtrl.prsChSel3 << _LESENSE_DECCTRL_PRSSEL3_SHIFT)
165 | ((uint32_t)init->decCtrl.chkState << _LESENSE_DECCTRL_ERRCHK_SHIFT)
166 | ((uint32_t)init->decCtrl.intMap << _LESENSE_DECCTRL_INTMAP_SHIFT)
167 | ((uint32_t)init->decCtrl.hystPRS0 << _LESENSE_DECCTRL_HYSTPRS0_SHIFT)
168 | ((uint32_t)init->decCtrl.hystPRS1 << _LESENSE_DECCTRL_HYSTPRS1_SHIFT)
169 | ((uint32_t)init->decCtrl.hystPRS2 << _LESENSE_DECCTRL_HYSTPRS2_SHIFT)
170 | ((uint32_t)init->decCtrl.hystIRQ << _LESENSE_DECCTRL_HYSTIRQ_SHIFT)
171 | ((uint32_t)init->decCtrl.prsCount << _LESENSE_DECCTRL_PRSCNT_SHIFT);
174 LESENSE_DecoderStateSet((uint32_t)init->decCtrl.initState);
177 LESENSE->BIASCTRL = (uint32_t)init->coreCtrl.biasMode;
207 uint32_t LESENSE_ScanFreqSet(uint32_t refFreq, uint32_t
const scanFreq)
210 uint32_t pcPresc = 0UL;
211 uint32_t clkDiv = 1UL;
212 uint32_t pcTop = 63UL;
213 uint32_t calcScanFreq;
226 EFM_ASSERT(refFreq < ((uint32_t)UINT32_MAX / 128UL));
229 EFM_ASSERT((scanFreq > 0U) && (scanFreq <= refFreq));
234 while ((refFreq / ((uint32_t)scanFreq * clkDiv) > (pcTop + 1UL))
235 && (pcPresc < lesenseClkDiv_128))
238 clkDiv = (uint32_t)1UL << pcPresc;
242 pcTop = ((uint32_t)refFreq / ((uint32_t)scanFreq * clkDiv)) - 1UL;
246 tmp = LESENSE->TIMCTRL & (~_LESENSE_TIMCTRL_PCPRESC_MASK
247 & ~_LESENSE_TIMCTRL_PCTOP_MASK);
250 tmp |= ((uint32_t)pcPresc << _LESENSE_TIMCTRL_PCPRESC_SHIFT)
251 | ((uint32_t)pcTop << _LESENSE_TIMCTRL_PCTOP_SHIFT);
254 LESENSE->TIMCTRL = tmp;
257 calcScanFreq = ((uint32_t)refFreq / ((uint32_t)(1UL + pcTop) * clkDiv));
289 void LESENSE_ScanModeSet(LESENSE_ScanMode_TypeDef
const scanMode,
297 tmp = LESENSE->CTRL & ~(_LESENSE_CTRL_SCANMODE_MASK);
300 tmp |= (uint32_t)scanMode;
331 void LESENSE_StartDelaySet(uint8_t
const startDelay)
337 EFM_ASSERT(startDelay < 4U);
341 tmp = LESENSE->TIMCTRL & ~(_LESENSE_TIMCTRL_STARTDLY_MASK);
343 tmp |= (uint32_t)startDelay << _LESENSE_TIMCTRL_STARTDLY_SHIFT;
346 LESENSE->TIMCTRL = tmp;
374 void LESENSE_ClkDivSet(LESENSE_ChClk_TypeDef
const clk,
375 LESENSE_ClkPresc_TypeDef
const clkDiv)
385 EFM_ASSERT((uint32_t)clkDiv <= lesenseClkDiv_8);
388 tmp = LESENSE->TIMCTRL & ~(_LESENSE_TIMCTRL_AUXPRESC_MASK);
391 tmp |= ((uint32_t)clkDiv << _LESENSE_TIMCTRL_AUXPRESC_SHIFT);
394 LESENSE->TIMCTRL = tmp;
399 tmp = LESENSE->TIMCTRL & ~(_LESENSE_TIMCTRL_LFPRESC_MASK);
402 tmp |= ((uint32_t)clkDiv << _LESENSE_TIMCTRL_LFPRESC_SHIFT);
405 LESENSE->TIMCTRL = tmp;
436 void LESENSE_ChannelAllConfig(LESENSE_ChAll_TypeDef
const *confChAll)
441 for (i = 0U; i < 16U; ++i)
444 LESENSE_ChannelConfig(&confChAll->Ch[i], i);
471 void LESENSE_ChannelConfig(LESENSE_ChDesc_TypeDef
const *confCh,
472 uint32_t
const chIdx)
478 EFM_ASSERT(chIdx < 16U);
479 EFM_ASSERT(confCh->exTime < 64U);
480 EFM_ASSERT(confCh->sampleDelay < 128U);
481 EFM_ASSERT(confCh->measDelay < 128U);
485 EFM_ASSERT(confCh->acmpThres < 4096U);
486 EFM_ASSERT(!(confCh->chPinExMode == lesenseChPinExDACOut
491 EFM_ASSERT(!(confCh->chPinIdleMode == lesenseChPinIdleDACCh1
495 && (chIdx != 15U))));
496 EFM_ASSERT(!(confCh->chPinIdleMode == lesenseChPinIdleDACCh0
505 tmp = (LESENSE->IDLECONF & ~((uint32_t)0x3UL << (chIdx * 2UL)));
506 tmp |= ((uint32_t)confCh->chPinIdleMode << (chIdx * 2UL));
507 LESENSE->IDLECONF = tmp;
511 LESENSE_ChannelTimingSet(chIdx,
512 (uint32_t)confCh->exTime,
513 (uint32_t)confCh->sampleDelay,
514 (uint32_t)confCh->measDelay);
519 LESENSE->CH[chIdx].INTERACT =
520 ((uint32_t)confCh->exClk << _LESENSE_CH_INTERACT_EXCLK_SHIFT)
521 | ((uint32_t)confCh->sampleClk << _LESENSE_CH_INTERACT_SAMPLECLK_SHIFT)
522 | (uint32_t)confCh->sampleMode
523 | (uint32_t)confCh->intMode
524 | (uint32_t)confCh->chPinExMode
525 | ((uint32_t)confCh->useAltEx << _LESENSE_CH_INTERACT_ALTEX_SHIFT);
530 LESENSE->CH[chIdx].EVAL =
531 (uint32_t)confCh->compMode
532 | ((uint32_t)confCh->shiftRes << _LESENSE_CH_EVAL_DECODE_SHIFT)
533 | ((uint32_t)confCh->storeCntRes << _LESENSE_CH_EVAL_STRSAMPLE_SHIFT)
534 | ((uint32_t)confCh->invRes << _LESENSE_CH_EVAL_SCANRESINV_SHIFT);
538 LESENSE_ChannelThresSet(chIdx,
539 (uint32_t)confCh->acmpThres,
540 (uint32_t)confCh->cntThres);
570 void LESENSE_AltExConfig(LESENSE_ConfAltEx_TypeDef
const *confAltEx)
580 _LESENSE_CTRL_ALTEXMAP_SHIFT,
581 confAltEx->altExMap);
583 switch (confAltEx->altExMap)
585 case lesenseAltExMapALTEX:
587 for (i = 0U; i < 8U; ++i)
594 confAltEx->AltEx[i].enablePin);
599 tmp = (LESENSE->ALTEXCONF & ~((uint32_t)0x3UL << (i * 2UL)));
600 tmp |= ((uint32_t)confAltEx->AltEx[i].idleConf << (i * 2UL));
601 LESENSE->ALTEXCONF = tmp;
606 confAltEx->AltEx[i].alwaysEx);
610 case lesenseAltExMapACMP:
612 for (i = 0U; i < 16U; ++i)
619 confAltEx->AltEx[i].enablePin);
654 void LESENSE_ChannelEnable(uint8_t
const chIdx,
655 bool const enaScanCh,
691 void LESENSE_ChannelEnableMask(uint16_t chMask, uint16_t pinMask)
694 LESENSE->CHEN = chMask;
696 LESENSE->ROUTE = pinMask;
728 void LESENSE_ChannelTimingSet(uint8_t
const chIdx,
729 uint8_t
const exTime,
730 uint8_t
const sampleDelay,
731 uint8_t
const measDelay)
734 EFM_ASSERT(exTime < 64U);
735 EFM_ASSERT(sampleDelay < 128U);
736 EFM_ASSERT(measDelay < 128U);
740 LESENSE->CH[chIdx].TIMING =
741 ((uint32_t)exTime << _LESENSE_CH_TIMING_EXTIME_SHIFT)
742 | ((uint32_t)sampleDelay << _LESENSE_CH_TIMING_SAMPLEDLY_SHIFT)
743 | ((uint32_t)measDelay << _LESENSE_CH_TIMING_MEASUREDLY_SHIFT);
780 void LESENSE_ChannelThresSet(uint8_t
const chIdx,
781 uint16_t
const acmpThres,
782 uint16_t
const cntThres)
788 EFM_ASSERT(acmpThres < 4096U);
790 EFM_ASSERT(chIdx < 16);
794 tmp = LESENSE->CH[chIdx].INTERACT & ~(_LESENSE_CH_INTERACT_ACMPTHRES_MASK);
796 tmp |= (uint32_t)acmpThres << _LESENSE_CH_INTERACT_ACMPTHRES_SHIFT;
798 LESENSE->CH[chIdx].INTERACT = tmp;
802 tmp = LESENSE->CH[chIdx].EVAL & ~(_LESENSE_CH_EVAL_COMPTHRES_MASK);
804 tmp |= (uint32_t)cntThres << _LESENSE_CH_EVAL_COMPTHRES_SHIFT;
806 LESENSE->CH[chIdx].EVAL = tmp;
826 void LESENSE_DecoderStateAllConfig(LESENSE_DecStAll_TypeDef
const *confDecStAll)
831 for (i = 0U; i < 16U; ++i)
834 LESENSE_DecoderStateConfig(&confDecStAll->St[i], i);
854 void LESENSE_DecoderStateConfig(LESENSE_DecStDesc_TypeDef
const *confDecSt,
855 uint32_t
const decSt)
858 EFM_ASSERT(decSt < 16U);
859 EFM_ASSERT((uint32_t)confDecSt->confA.compMask < 16U);
860 EFM_ASSERT((uint32_t)confDecSt->confA.compVal < 16U);
861 EFM_ASSERT((uint32_t)confDecSt->confA.nextState < 16U);
862 EFM_ASSERT((uint32_t)confDecSt->confB.compMask < 16U);
863 EFM_ASSERT((uint32_t)confDecSt->confB.compVal < 16U);
864 EFM_ASSERT((uint32_t)confDecSt->confB.nextState < 16U);
870 LESENSE->ST[decSt].TCONFA =
871 (uint32_t)confDecSt->confA.prsAct
872 | ((uint32_t)confDecSt->confA.compMask << _LESENSE_ST_TCONFA_MASK_SHIFT)
873 | ((uint32_t)confDecSt->confA.compVal << _LESENSE_ST_TCONFA_COMP_SHIFT)
874 | ((uint32_t)confDecSt->confA.nextState << _LESENSE_ST_TCONFA_NEXTSTATE_SHIFT)
875 | ((uint32_t)confDecSt->confA.setInt << _LESENSE_ST_TCONFA_SETIF_SHIFT)
876 | ((uint32_t)confDecSt->chainDesc << _LESENSE_ST_TCONFA_CHAIN_SHIFT);
881 LESENSE->ST[decSt].TCONFB =
882 (uint32_t)confDecSt->confB.prsAct
883 | ((uint32_t)confDecSt->confB.compMask << _LESENSE_ST_TCONFB_MASK_SHIFT)
884 | ((uint32_t)confDecSt->confB.compVal << _LESENSE_ST_TCONFB_COMP_SHIFT)
885 | ((uint32_t)confDecSt->confB.nextState << _LESENSE_ST_TCONFB_NEXTSTATE_SHIFT)
886 | ((uint32_t)confDecSt->confB.setInt << _LESENSE_ST_TCONFB_SETIF_SHIFT);
905 void LESENSE_DecoderStateSet(uint32_t decSt)
907 EFM_ASSERT(decSt < 16U);
909 LESENSE->DECSTATE = decSt & _LESENSE_DECSTATE_DECSTATE_MASK;
921 uint32_t LESENSE_DecoderStateGet(
void)
923 return LESENSE->DECSTATE & _LESENSE_DECSTATE_DECSTATE_MASK;
940 void LESENSE_ScanStart(
void)
944 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
948 LESENSE->CMD = LESENSE_CMD_START;
952 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
973 void LESENSE_ScanStop(
void)
977 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
981 LESENSE->CMD = LESENSE_CMD_STOP;
985 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1003 void LESENSE_DecoderStart(
void)
1007 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1011 LESENSE->CMD = LESENSE_CMD_DECODE;
1015 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1033 void LESENSE_ResultBufferClear(
void)
1037 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1040 LESENSE->CMD = LESENSE_CMD_CLEARBUF;
1044 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1062 void LESENSE_Reset(
void)
1067 LESENSE->IEN = _LESENSE_IEN_RESETVALUE;
1070 LESENSE->IFC = _LESENSE_IFC_MASK;
1073 LESENSE->DECCTRL |= LESENSE_DECCTRL_DISABLE;
1077 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
1081 LESENSE->CMD = (LESENSE_CMD_STOP | LESENSE_CMD_CLEARBUF);
1084 LESENSE->CTRL = _LESENSE_CTRL_RESETVALUE;
1085 LESENSE->PERCTRL = _LESENSE_PERCTRL_RESETVALUE;
1086 LESENSE->DECCTRL = _LESENSE_DECCTRL_RESETVALUE;
1087 LESENSE->BIASCTRL = _LESENSE_BIASCTRL_RESETVALUE;
1088 LESENSE->CHEN = _LESENSE_CHEN_RESETVALUE;
1089 LESENSE->IDLECONF = _LESENSE_IDLECONF_RESETVALUE;
1090 LESENSE->ALTEXCONF = _LESENSE_ALTEXCONF_RESETVALUE;
1093 LESENSE->ROUTE = _LESENSE_ROUTE_RESETVALUE;
1096 for (i = 0U; i < 16U; ++i)
1098 LESENSE->CH[i].TIMING = _LESENSE_CH_TIMING_RESETVALUE;
1099 LESENSE->CH[i].INTERACT = _LESENSE_CH_INTERACT_RESETVALUE;
1100 LESENSE->CH[i].EVAL = _LESENSE_CH_EVAL_RESETVALUE;
1104 for (i = 0U; i < 16U; ++i)
1106 LESENSE->ST[i].TCONFA = _LESENSE_ST_TCONFA_RESETVALUE;
1107 LESENSE->ST[i].TCONFB = _LESENSE_ST_TCONFB_RESETVALUE;
1112 while (LESENSE_SYNCBUSY_CMD & LESENSE->SYNCBUSY)
Clock management unit (CMU) API.
Emlib peripheral API "assert" implementation.
RAM and peripheral bit-field set and clear API.
Low Energy Sensor (LESENSE) peripheral API.
__STATIC_INLINE void BUS_RegBitWrite(volatile uint32_t *addr, unsigned int bit, unsigned int val)
Perform a single-bit write operation on a peripheral register.
uint32_t CMU_ClockFreqGet(CMU_Clock_TypeDef clock)
Get clock frequency for a clock point.