跳到主要内容

tlk_i2s | I2S 驱动

简要说明

I2S 全称 Inter-IC Sound, Integrated Interchip Sound,或简写 IIS,是飞利浦在 1986 年定义(1996 年修订)的数字音频传输标准,用于数字音频数据在系统内部器件之间传输,例如编解码器 CODEC、DSP、数字输入/输出接口、ADC、DAC 和数字滤波器等。

I2S 是比较简单的数字接口协议,没有地址或设备选择机制。在 I2S 总线上,只能同时存在一个主设备和发送设备。主设备可以是发送设备,也可以是接收设备,或是协调发送设备和接收设备的其它控制设备。

在 I2S 系统中,提供时钟(SCK 和 WS)的设备为主设备,下面为常见的 I2S 系统框图。

image-20220411195655196
image-20220411195655196

image-20220411200756538
image-20220411200756538

image-20220411200931639
image-20220411200931639

其中:

SCK: 对应数字音频的每一位数据,SCK 都有 1 个脉冲。SCK 的频率= 2 × 采样频率 × 采样位数。

WS: 用于切换左右声道的数据。WS的频率 = 采样频率,WS为 “1” 表示正在传输的是左声道的数据,WS 为 “0” 表示正在传输的是右声道的数据。

SD:串行数据,用二进制补码表示的音频数据。

API 说明

tkl_i2s_init

OPERATE_RET tkl_i2s_init(TUYA_I2S_NUM_E i2s_num, const TUYA_I2S_BASE_CFG_T *i2s_config);
  • 功能描述:

    • 通过设备号和基础配置初始化对应的 I2S 实例,返回初始化结果。
  • 参数:

    • i2s_num: 端口号。

    • i2s_config: 基础配置

      typedef struct {
      TUYA_I2S_MODE_E mode; /*!< I2S work mode */
      uint32_t sample_rate; /*!< I2S sample rate */
      uint32_t mclk; /*!< I2S mclk */
      TUYA_I2S_BITS_PER_SAMP_E bits_per_sample; /*!< I2S sample bits in one channel */
      TUYA_I2S_CHANNEL_FMT_E channel_format; /*!< I2S channel format.*/
      TUYA_I2S_COMM_FORMAT_E communication_format; /*!< I2S communication format */
      uint32_t i2s_dma_flags; /*!< I2S dma format , 1 use dma */
      } TUYA_I2S_BASE_CFG_T;

      TUYA_I2S_MODE_E:

      名字定义备注
      TUYA_I2S_MODE_MASTER主机模式
      TUYA_I2S_MODE_SLAVE从机模式
      TUYA_I2S_MODE_TX发送模式
      TUYA_I2S_MODE_RX接收模式

      用户可使用四种模式组合,分别是:

      • TUYA_I2S_MODE_MASTER|TUYA_I2S_MODE_TX
      • TUYA_I2S_MODE_MASTER|TUYA_I2S_MODE_RX
      • TUYA_I2S_MODE_SLAVE|TUYA_I2S_MODE_TX
      • TUYA_I2S_MODE_SLAVE|TUYA_I2S_MODE_RX

      sample_rate: 采样频率。

      mclk: 主时钟,一般是采样频率的 256 或者 384 倍。

      TUYA_I2S_BITS_PER_SAMP_E:

      名字定义备注
      TUYA_I2S_BITS_PER_SAMPLE_8BIT数据位宽8
      TUYA_I2S_BITS_PER_SAMPLE_16BIT数据位宽16
      TUYA_I2S_BITS_PER_SAMPLE_24BIT数据位宽24
      TUYA_I2S_BITS_PER_SAMPLE_32BIT数据位宽32

      TUYA_I2S_CHANNEL_FMT_E:

      名字定义备注
      TUYA_I2S_CHANNEL_FMT_RIGHT_LEFT左右通道分开
      TUYA_I2S_CHANNEL_FMT_ALL_RIGHT加载右声道数据到两个通道
      TUYA_I2S_CHANNEL_FMT_ALL_LEFT加载左声道数据到两个通道
      TUYA_I2S_CHANNEL_FMT_ONLY_RIGHT仅加载右声道数据单声道模式
      TUYA_I2S_CHANNEL_FMT_ONLY_LEFT仅加载左声道数据单声道模式

      TUYA_I2S_COMM_FORMAT_E:

      名字定义备注
      I2S_COMM_FORMAT_STAND_I2SPhilips标准,数据在第二个BCK传输
      I2S_COMM_FORMAT_STAND_MSBMSB(左对齐)标准,数据在第一个BCK传输
      I2S_COMM_FORMAT_STAND_PCM_SHORTPCM短标准,也称为DSP模式。 同步信号(WS)的周期为1个BCK周期 。
      I2S_COMM_FORMAT_STAND_PCM_LONGPCM长标准,同步信号(WS)的周期为channel_bit个BCK周期
  • 返回值:

    • NULL: 初始化失败。
    • 其它: 实例句柄。

tkl_i2s_send

OPERATE_RET tkl_i2s_send(TUYA_I2S_NUM_E i2s_num, void *buff, uint32_t len);
  • 功能描述:

    • I2S 传送数据到发送器。
  • 参数:

    • i2s_num: 端口号。

    • buff: 指向将要发送的数据。

    • len: 发送数据的长度。

  • 返回值:

    • OPRT_OK 成功,其他请参考文件tuya_error_code.h,OS_ADAPTER_I2S定义部分。

tkl_i2s_send_stop

OPERATE_RET tkl_i2s_send_stop(TUYA_I2S_NUM_E i2s_num);
  • 功能描述:

    • I2S 停止传送数据到发送器。
  • 参数:

    • i2s_num: 端口号。
  • 返回值:

    • OPRT_OK 成功,其他请参考文件tuya_error_code.h,OS_ADAPTER_I2S定义部分。

tkl_i2s_recv

int tkl_i2s_recv(TUYA_I2S_NUM_E i2s_num, void *buff, uint32_t len);
  • 功能描述:

    • I2S 异步接收数据。
  • 参数:

    • i2s_num: 端口号。

    • buff: 指向将要接收数据的缓存。

    • len: 接收数据的长度。

  • 返回值:

    • OPRT_OK 成功,其他请参考文件tuya_error_code.h,OS_ADAPTER_I2S定义部分。

tkl_i2s_recv_stop

OPERATE_RET tkl_i2s_recv_stop(TUYA_I2S_NUM_E i2s_num);
  • 功能描述:

    • I2S 停止数据的接收。
  • 参数:

    • i2s_num: 端口号。
  • 返回值:

    • OPRT_OK 成功,其他请参考文件tuya_error_code.h,OS_ADAPTER_I2S定义部分。

tkl_i2s_deinit

OPERATE_RET tkl_i2s_deinit(TUYA_I2S_NUM_E i2s_num);
  • 功能描述:

    • I2S 去初始化。
  • 参数:

    • i2s_num: 端口号。
  • 返回值:

    • OPRT_OK 成功,其他请参考文件tuya_error_code.h,OS_ADAPTER_I2S定义部分。