I2S HAL 提供用于訪問 I2S 外設(shè)寄存器的基本 API。 SF32LB55X有兩個實(shí)例I2S1/I2S2(都在HPSYS),SF32LB58X有三個實(shí)例I2S1/I2S2/I2S3(I2S1和I2S2在HPSYS,I2S3在LPSYS)。 對于 I2S1,它只支持 RX 功能, 對于 I2S2/I2S3,它支持 RX 和 TX。 當(dāng)使用 I2S2 RX 時,它的時鐘來自它的 TX,所以如果使用 I2S2 作為 RX,它的 TX 也需要使能提供時鐘。 SF32LB56X只有一個全功能的I2S1,相當(dāng)于SF32LB58X的I2S2,支持RX和TX。 SF32LB55X的時鐘只能是xtal48M,SF32LB58X和SF32LB56X的時鐘可以是xtal48M或PLL。
以下以全功能的I2S為例進(jìn)行描述,當(dāng)I2S作為maser模式時,RX的時鐘是由TX進(jìn)行提供的,因此tx_cfg中的slave_mode要配置成0,rx_cfg中的slave_mode配置成1。 當(dāng)I2S作為SLAVE模式時,時鐘是由外部的I2S提供,因此tx_cfg和rx_cfg中的slave_mode都要配置成1。 使用xtal48M作為時鐘源時,bclk和lrclk的時序可能無法滿足對方I2S的需求(這個需要注意),使用PLL作為時鐘源時,需要打開audcodec模塊,并且保證所有音頻模塊的時鐘一致。 可以參考drv_i2s中的實(shí)現(xiàn)。
#define CLOCK_USING_XTAL 0 //PLL clock need open audcodec
#if CLOCK_USING_XTAL //crystal
static CLK_DIV_T txrx_clk_div[9] = {{48000, 125, 125, 5}, {44100, 136, 136, 4}, {32000, 185, 190, 5}, {24000, 250, 250, 10}, {22050, 272, 272, 8},
{16000, 384, 384, 12}, {12000, 500, 500, 20}, {11025, 544, 544, 16}, { 8000, 750, 750, 30}
};
#else //PLL
static CLK_DIV_T txrx_clk_div[9] = {{48000, 64, 64, 2}, {44100, 64, 64, 2}, {32000, 96, 96, 3}, {24000, 128, 128, 4}, {22050, 128, 128, 4},
{16000, 192, 192, 6}, {12000, 256, 256, 8}, {11025, 256, 256, 8}, { 8000, 384, 384, 12}
};
#endif
#define EXAMPLE_I2S_TRANS_SIZE (480)
static uint8_t pData[EXAMPLE_I2S_TRANS_SIZE];
#if CLOCK_USING_XTAL
#else
#endif