音频数字传输总线(IIS)¶
1、简介¶
IIS(Inter-IC Sound,集成电路内置音频总线)是飞利浦公司为数字音频设备之间的音频数据传输而制定的总线标准。IIS总线沿用了SCK(串行时钟)、LRCK(左/右声道时钟)、SDATA(数据)等信号线,专为传输立体声数据设计。
CI14LP芯片的IIS通路与音频外设紧密关联:
| 控制器 | 基地址 | 关联说明 |
|---|---|---|
| IIS0 | 0x3003C000 | 与IIS PAD(外接IIS引脚)关联,可外挂音频codec |
| IIS1_MADC_RX | 0x31020000+0x100 | 与MADC(MIC ADC)关联的接收通道 |
| IIS1_DCODEC_TX | 0x3003C000+0x100 | 与内部DCODEC关联的发送通道 |
| IIS2_DCODEC_RX | 0x3003C000+0x100 | 与内部DCODEC关联的接收通道 |
每个IIS控制器均支持16/20/24/32bit数据宽度、标准IIS/左对齐/右对齐/并行数据格式、单声道/双声道、DMA乒乓传输等特性。
2、IIS时序¶
- SCK:串行时钟,由master提供,与LRCK的比值可配置为32(仅16bit数据宽度)或64(所有数据宽度)
- LRCK:声道时钟,指示当前传输的是左声道还是右声道数据
- SDATA:串行数据线
- MCLK:主时钟,供外部codec使用,可通过SCU配置过采样率(768/384/256/128/64倍LRCK)
3、API¶
3.1 IIS通道配置接口¶
| 函数名 | 描述 |
|---|---|
| iis_tx_config | TX通道配置(结构体方式配置数据宽度/格式/声道等) |
| iis_rx_config | RX通道配置(结构体方式配置数据宽度/格式/声道等) |
| iis_tx_enable | TX通道使能/关闭 |
| iis_rx_enable | RX通道使能/关闭 |
| iis_tx_left_mute | TX左声道静音使能 |
| iis_tx_right_mute | TX右声道静音使能 |
| iis_rx_mute | RX静音使能 |
3.2 中断接口¶
| 函数名 | 描述 |
|---|---|
| iis_irq_mask_config | IIS中断屏蔽配置 |
| iis_get_irq_raw_status | 获取IIS原始中断状态(屏蔽前) |
| iis_get_irq_mask_status | 获取IIS屏蔽后中断状态 |
| iis_clean_irq | 清除IIS中断标志 |
3.3 IISDMA(内置音频DMA)接口¶
| 函数名 | 描述 |
|---|---|
| iisdma_tx_init | TX通道DMA初始化(乒乓地址、单次搬运大小) |
| iisdma_rx_init | RX通道DMA初始化(接收地址、中断周期) |
| iisdma_rx_addr | 设置RX接收缓冲地址 |
| iisdma_rx_size_config | RX传输大小配置(中断周期/回卷次数/单次大小) |
| iisdma_txaddr0 / iisdma_txaddr1 | 设置TX乒乓缓冲地址0/地址1 |
| iisdma_txaddr0_size_config / iisdma_txaddr1_size_config | TX乒乓地址回卷及单次搬运大小配置 |
| iisdma_pingpong_txaddr_index | 手动切换TX乒乓地址索引 |
| iisdma_get_txaddr_index | 获取当前TX乒乓地址索引 |
| iisdma_switch_cnt_en | 使能TX/RX传输计数 |
| iisdma_get_addr_count | 获取TX/RX传输计数 |
| iisdma_priority_config | IISDMA通道优先级配置 |
| iisdma_addr_swith_irq_mask_config | 地址切换(回卷)中断屏蔽配置 |
| iisdma_done_irq_mask_config | 传输完成中断屏蔽配置 |
| iisdma_channel_en_all | 使能所有IISDMA通道 |
| iisdma_irq_all_clear | 清除所有IISDMA中断 |
| iisdma_check_databus_busy | 查询数据总线是否忙 |
4、关键类型¶
| 类型 | 说明 |
|---|---|
| iis_base_t | 控制器选择:IIS0_BASE、IIS1_MADC_RX_BASE、IIS1_DCODEC_TX_BASE、IIS2_DCODEC_RX_BASE |
| iis_data_width_t | 数据宽度:IIS_DW_16BIT / 20BIT / 24BIT / 32BIT |
| iis_data_format_t | 数据格式:IIS_DF_IIS(标准)、IIS_DF_MSB(左对齐)、IIS_DF_LSB(右对齐)、IIS_DF_PARALLEL(并行) |
| iis_sound_channel_t | 声道选择:IIS_SC_STEREO(双声道)、IIS_SC_MONO(单声道) |
| iis_txfifo_trig_t | TX FIFO触发深度:IIS_TX_FIFO_1D2(16word)/ 1D4(8word) |
| iis_rxfifo_trig_t | RX FIFO触发深度:IIS_RX_FIFO_1D4(32word)/ 1D8 / 1D16 / 1D32 |
| iis_sck_lrck_t | SCK/LRCK比值:IIS_SCK_LRCK_32、IIS_SCK_LRCK_64 |
| iis_irq_t | 中断类型:IIS_TX_ADDR_SWITCH_IRQ、IIS_RX_ADDR_LOOP_IRQ、IIS_TX_BURST_DONE_IRQ、IIS_RX_REQ_DONE_IRQ、FIFO上溢/下溢中断、IIS_ALL_IRQ |
| iis_tx_config_t | TX配置结构体(SCK/LRCK比值、FIFO触发、数据宽度、通道复制、数据格式、声道、merge、swap) |
| iis_rx_config_t | RX配置结构体(SCK/LRCK比值、FIFO触发、数据宽度、数据格式、声道、merge、swap) |
| iisdma_tx_init_t | IISDMA TX初始化结构体(两路乒乓地址回卷次数、单次搬运大小、iis_base) |
| iisdma_rx_init_t | IISDMA RX初始化结构体(接收地址、中断周期、回卷次数、单次大小、iis_base) |
| iisdma_txrx_singlesize_t | 单次搬运数据大小:16byte ~ 496byte(16*x,x为1~31) |
| iisdma_rxdone_irq_trans_t | 传输完成中断触发搬运次数(1~32次) |
| iisdma_rxtxrollback_irq_trans_t | 地址回卷中断触发搬运次数(1~1024次) |
5、示例¶
1) 以下代码配置IIS0 TX通道并启动发送(单声道16bit,标准IIS格式):
#include "ci14lp_iis.h"
#include "ci14lp_scu.h"
void iis_tx_demo(void)
{
iis_tx_config_t tx_cfg;
//打开IIS0外设时钟
scu_set_device_clock_en(HAL_I2S0_BASE, ENABLE);
tx_cfg.sck_lrck_ratio = IIS_SCK_LRCK_64;
tx_cfg.txfifo_trig = IIS_TX_FIFO_1D2;
tx_cfg.txch_dw = IIS_DW_16BIT;
tx_cfg.txch_copy = 0; //不复制通道
tx_cfg.tx_df = IIS_DF_IIS; //标准IIS格式
tx_cfg.tx_sc = IIS_SC_MONO; //单声道
tx_cfg.tx_merge = 0; //不merge
tx_cfg.tx_swap = 0; //不交换声道
iis_tx_config(IIS0_BASE, &tx_cfg);
iis_tx_enable(IIS0_BASE, ENABLE);
}
2) 以下代码配置IISDMA RX通道接收MADC采集的音频数据(乒乓接收):
#include "ci14lp_iis.h"
#define PCM_BUF_SIZE (1280) //例如64ms@16K/16bit
static int32_t pcm_buf[PCM_BUF_SIZE / 4] __attribute__((aligned(4)));
void iisdma_rx_demo(void)
{
iisdma_rx_init_t rx_init;
rx_init.rxaddr = (uint32_t)pcm_buf; //接收缓冲地址
rx_init.rxinterruptsize = IISDMA_RXDONE_IRQ_TRANS16; //搬运16次产生完成中断
rx_init.rollbackaddrsize = IISDMA_RXTXROLLBACK_IRQ_TRANS16;
rx_init.rxsinglesize = IISDMA_TXRX_SINGLESIZE_16BYTES;
rx_init.iis_base = IIS1_MADC_RX_BASE; //接收MADC数据
iisdma_rx_init(&rx_init);
iisdma_channel_en_all();
//使能传输完成中断
iisdma_done_irq_mask_config(IIS1_MADC_RX_BASE, IISDMA_SELECT_RX, DISABLE);
}
3) IIS中断处理函数示例(FIFO错误中断):
#include "ci14lp_iis.h"
void IIS_IRQHandler(void)
{
if (iis_get_irq_mask_status(IIS0_BASE, IIS_TXFIFO_OVERFLOW_IRQ))
{
//处理发送FIFO上溢
iis_clean_irq(IIS0_BASE, IIS_TXFIFO_OVERFLOW_IRQ);
}
iis_clean_irq(IIS0_BASE, IIS_ALL_IRQ);
}
6、其它¶
- IIS的时钟(MCLK、SCK、LRCK)来源由SCU统一管理,参见
scu_iis_src_config、scu_iis_mclk_config、scu_iis_clk_config等接口(系统API-时钟配置)。 - 使用内部DCODEC/MADC时,IIS通路已在codec_manager组件中完成配置,应用层一般无需直接操作IIS驱动;直接操作IIS适用于外挂外部codec或IIS探针输出的场景。
- 单次搬运大小(singlesize)建议配置为FIFO触发深度的整数倍,避免FIFO溢出/下溢。
- TX通道支持乒乓双地址(txaddr0/txaddr1)自动切换,适合不间断的播放场景。
7、API 参考¶
本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_iis.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_iis.c。