跳转至

音频数字传输总线(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。