60 #include "../inc/hw_types.h" 61 #include "../inc/hw_ints.h" 62 #include "../inc/hw_memmap.h" 63 #include "../inc/hw_i2s.h" 72 #define I2S_SD0_DIS I2S_AIFDIRCFG_AD0_DIS 73 #define I2S_SD0_IN I2S_AIFDIRCFG_AD0_IN 74 #define I2S_SD0_OUT I2S_AIFDIRCFG_AD0_OUT 75 #define I2S_SD1_DIS I2S_AIFDIRCFG_AD1_DIS 76 #define I2S_SD1_IN I2S_AIFDIRCFG_AD1_IN 77 #define I2S_SD1_OUT I2S_AIFDIRCFG_AD1_OUT 84 #define I2S_CHAN0_MASK 0x00000001 85 #define I2S_CHAN1_MASK 0x00000002 86 #define I2S_CHAN2_MASK 0x00000004 87 #define I2S_CHAN3_MASK 0x00000008 88 #define I2S_CHAN4_MASK 0x00000010 89 #define I2S_CHAN5_MASK 0x00000020 90 #define I2S_CHAN6_MASK 0x00000040 91 #define I2S_CHAN7_MASK 0x00000080 98 #define I2S_MEM_LENGTH_16 I2S_FMTCFG_MEMLEN32_DIS 99 #define I2S_MEM_LENGTH_32 I2S_FMTCFG_MEMLEN32_EN 100 #define I2S_POS_EDGE I2S_FMTCFG_SMPLEDGE_POSEDGE 101 #define I2S_NEG_EDGE I2S_FMTCFG_SMPLEDGE_NEGEDGE 108 #define I2S_STMP_SATURATION 0x0000FFFF 115 #define I2S_INT_XCNT_CAPTURE I2S_IRQFLAGS_XCNTCAPT 116 #define I2S_INT_DMA_IN I2S_IRQFLAGS_DMAIN 117 #define I2S_INT_DMA_OUT I2S_IRQFLAGS_DMAOUT 118 #define I2S_INT_TIMEOUT I2S_IRQFLAGS_WCLKTIMEOUT 119 #define I2S_INT_BUS_ERR I2S_IRQFLAGS_BUSERR 120 #define I2S_INT_WCLK_ERR I2S_IRQFLAGS_WCLKERR 121 #define I2S_INT_PTR_ERR I2S_IRQFLAGS_PTRERR 122 #define I2S_INT_ALL \ 123 (I2S_INT_XCNT_CAPTURE | I2S_INT_DMA_IN | I2S_INT_DMA_OUT | I2S_INT_TIMEOUT | I2S_INT_BUS_ERR | I2S_INT_WCLK_ERR | \ 132 #ifdef DRIVERLIB_DEBUG 147 static bool I2SBaseValid(uint32_t base)
149 return (base == I2S_BASE);
179 ASSERT(I2SBaseValid(base));
182 HWREG(I2S_BASE + I2S_O_IRQMASK) |= intFlags;
211 ASSERT(I2SBaseValid(base));
214 HWREG(I2S_BASE + I2S_O_IRQMASK) &= ~intFlags;
245 ASSERT(I2SBaseValid(base));
248 status = HWREG(I2S_BASE + I2S_O_IRQFLAGS);
254 status &= HWREG(I2S_BASE + I2S_O_IRQMASK);
286 ASSERT(I2SBaseValid(base));
289 HWREG(I2S_BASE + I2S_O_IRQCLR) = intFlags;
313 ASSERT(I2SBaseValid(base));
316 HWREG(I2S_BASE + I2S_O_STMPCTL) = I2S_STMPCTL_STMPEN_EN;
334 ASSERT(I2SBaseValid(base));
337 HWREG(I2S_BASE + I2S_O_STMPCTL) = 0;
377 ASSERT(I2SBaseValid(base));
382 HWREG(I2S_BASE + I2S_O_DMACFG) = (dmaLength - 1) & I2S_DMACFG_ENDFRMIDX_M;
411 ASSERT(I2SBaseValid(base));
414 HWREG(I2S_BASE + I2S_O_DMACFG) = 0x00;
454 uint32_t memoryLength,
455 uint32_t samplingEdge,
457 uint8_t bitsPerSample)
460 ASSERT(I2SBaseValid(base));
461 ASSERT(bitsPerSample <= 24);
462 ASSERT(bitsPerSample >= 8);
465 HWREGH(I2S_BASE + I2S_O_FMTCFG) = (dataDelay << I2S_FMTCFG_DATADLY_S) | (memoryLength) | (samplingEdge) |
466 (dualPhase << I2S_FMTCFG_DUALPHASE_S) | (bitsPerSample << I2S_FMTCFG_WORDLEN_S);
517 ASSERT(I2SBaseValid(base));
520 HWREGB(I2S_BASE + I2S_O_DIRCFG) = (sd0Usage | sd1Usage);
523 HWREGB(I2S_BASE + I2S_O_WMASK0) = sd0Channels;
524 HWREGB(I2S_BASE + I2S_O_WMASK1) = sd1Channels;
583 ASSERT(I2SBaseValid(base));
592 HWREGB(I2S_BASE + I2S_O_WCLKSRC) = ((isController ? I2S_WCLKSRC_WBCLKSRC_INT : I2S_WCLKSRC_WBCLKSRC_EXT) |
593 (invertWclk ? I2S_WCLKSRC_WCLKINV : 0));
601 if (dualPhase ==
false)
608 HWREG(I2S_BASE + I2S_O_MCLKDIV) = (cclkDiv == 1024 ? 0 : cclkDiv);
609 HWREG(I2S_BASE + I2S_O_WCLKDIV) = wclkDiv;
610 HWREG(I2S_BASE + I2S_O_BCLKDIV) = (bclkDiv == 1024 ? 0 : bclkDiv);
613 HWREG(I2S_BASE + I2S_O_CLKCTL) = (dualPhase ? (1 << I2S_CLKCTL_WCLKPHASE_S) : (0 << I2S_CLKCTL_WCLKPHASE_S));
634 HWREG(I2S_BASE + I2S_O_CLKCTL) |= I2S_CLKCTL_MEN | I2S_CLKCTL_WBEN;
650 HWREG(I2S_BASE + I2S_O_CLKCTL) &= ~(I2S_CLKCTL_MEN | I2S_CLKCTL_WBEN);
676 ASSERT(I2SBaseValid(base));
678 HWREG(I2S_BASE + I2S_O_INPTRNXT) = nextPointer;
704 ASSERT(I2SBaseValid(base));
706 HWREG(I2S_BASE + I2S_O_OUTPTRNXT) = nextPointer;
721 ASSERT(I2SBaseValid(base));
723 return (HWREG(I2S_BASE + I2S_O_INPTRNXT));
738 ASSERT(I2SBaseValid(base));
740 return (HWREG(I2S_BASE + I2S_O_OUTPTRNXT));
755 ASSERT(I2SBaseValid(base));
757 return (HWREG(I2S_BASE + I2S_O_INPTR));
772 ASSERT(I2SBaseValid(base));
774 return (HWREG(I2S_BASE + I2S_O_OUTPTR));
792 ASSERT(I2SBaseValid(base));
795 HWREGH(I2S_BASE + I2S_O_STMPINTRIG) = trigValue;
813 ASSERT(I2SBaseValid(base));
816 HWREGH(I2S_BASE + I2S_O_STMPOUTTRIG) = trigValue;
836 ASSERT(I2SBaseValid(base));
839 HWREGH(I2S_BASE + I2S_O_STMPWPER) = period;
857 ASSERT(I2SBaseValid(base));
861 HWREGH(I2S_BASE + I2S_O_STMPWADD) = value;
865 minusValue = (uint16_t)(-value);
866 HWREGH(I2S_BASE + I2S_O_STMPWADD) = HWREGH(I2S_BASE + I2S_O_STMPWPER) - minusValue;
882 ASSERT(I2SBaseValid(base));
884 HWREGH(I2S_BASE + I2S_O_STMPWSET) = 0;
__STATIC_INLINE void I2SStart(uint32_t base, uint16_t dmaLength)
Starts the I2S.
Definition: i2s.h:374
__STATIC_INLINE void I2SConfigureOutSampleStampTrigger(uint32_t base, uint16_t trigValue)
Configure the output sample stamp trigger.
Definition: i2s.h:810
__STATIC_INLINE void I2SConfigureWclkCounter(uint32_t base, int16_t value)
Confiugre the WCLK counter value.
Definition: i2s.h:852
__STATIC_INLINE void I2SConfigureClocks(uint32_t base, bool isController, bool invertWclk, bool dualPhase, uint32_t cclkDiv, uint32_t wclkDiv, uint32_t bclkDiv)
Configure the I2S clocks (CCLK, WCLK and BCLK).
Definition: i2s.h:574
__STATIC_INLINE void I2SEnableControllerClocks(uint32_t base)
Enable the I2S controller clocks (CCLK, WCLK and BCLK).
Definition: i2s.h:631
__STATIC_INLINE void I2SResetWclkCounter(uint32_t base)
Reset the WCLK count.
Definition: i2s.h:879
__STATIC_INLINE void I2SConfigureWclkCounterPeriod(uint32_t base, uint16_t period)
Configure the WCLK counter period.
Definition: i2s.h:833
uint32_t I2SGetSampleStamp(uint32_t base, uint32_t channel)
Get the current value of a sample stamp counter.
Definition: i2s.c:43
__STATIC_INLINE void I2SSetInPointer(uint32_t base, uint32_t nextPointer)
Set the next input buffer pointer.
Definition: i2s.h:673
__STATIC_INLINE void I2SConfigureFrame(uint32_t base, uint8_t sd0Usage, uint8_t sd0Channels, uint8_t sd1Usage, uint8_t sd1Channels)
Setup the two interfaces SD0 and SD1 (also called AD0 and AD1).
Definition: i2s.h:510
__STATIC_INLINE void I2SDisableControllerClocks(uint32_t base)
Disable the I2S controller clocks (CCLK, WCLK and BCLK).
Definition: i2s.h:647
__STATIC_INLINE void I2SDisableInt(uint32_t base, uint32_t intFlags)
Disables individual I2S interrupt sources.
Definition: i2s.h:208
__STATIC_INLINE void I2SSetOutPointer(uint32_t base, uint32_t nextPointer)
Set the next output buffer pointer.
Definition: i2s.h:701
__STATIC_INLINE void I2SEnableInt(uint32_t base, uint32_t intFlags)
Enables individual I2S interrupt sources.
Definition: i2s.h:176
__STATIC_INLINE uint32_t I2SGetInPointerNext(uint32_t base)
Get value of the next input pointer.
Definition: i2s.h:718
__STATIC_INLINE uint32_t I2SGetOutPointerNext(uint32_t base)
Get value of the next output pointer.
Definition: i2s.h:735
__STATIC_INLINE uint32_t I2SGetOutPointer(uint32_t base)
Get value of the current output pointer.
Definition: i2s.h:769
__STATIC_INLINE void I2SDisableSampleStamp(uint32_t base)
Disable the Sample Stamp generator.
Definition: i2s.h:331
#define ASSERT(expr)
Definition: debug.h:71
__STATIC_INLINE uint32_t I2SGetInPointer(uint32_t base)
Get value of the current input pointer.
Definition: i2s.h:752
__STATIC_INLINE void I2SStop(uint32_t base)
Stops the I2S module for operation.
Definition: i2s.h:408
__STATIC_INLINE uint32_t I2SIntStatus(uint32_t base, bool masked)
Gets the current interrupt status.
Definition: i2s.h:240
__STATIC_INLINE void I2SConfigureFormat(uint32_t base, uint8_t dataDelay, uint32_t memoryLength, uint32_t samplingEdge, bool dualPhase, uint8_t bitsPerSample)
Configure the serial format of the I2S module.
Definition: i2s.h:452
__STATIC_INLINE void I2SConfigureInSampleStampTrigger(uint32_t base, uint16_t trigValue)
Configure the input sample stamp trigger.
Definition: i2s.h:789
#define __STATIC_INLINE
Definition: cmsis_gcc.h:47
__STATIC_INLINE void I2SEnableSampleStamp(uint32_t base)
Enable the Sample Stamp generator.
Definition: i2s.h:310
__STATIC_INLINE void I2SClearInt(uint32_t base, uint32_t intFlags)
Clears I2S interrupt sources.
Definition: i2s.h:283