CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

APP I2S驱动

结构体

app_i2s_pin_t

结构体定义如下:

表 177 app_i2s_pin_t结构体成员
成员 描述 取值

app_io_type_t type

设置IO类型

app_io_evt_t结构体定义

app_io_mux_t mux

设置IO映射功能

查看app_io_init_t结构体定义,具体取值参考芯片Datasheet中的Pin Mux

uint32_t pin

选择IO引脚

查看app_io_init_t结构体定义,具体取值参考芯片Datasheet中的Pin Mux

app_io_pull_t pull

设置IO上拉/下拉/浮空

app_io_init_t结构体中描述

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_pin_cfg_t

结构体定义如下:

表 178 app_i2s_pin_cfg_t结构体成员
成员 描述 取值

app_i2s_pin_t ws

I2S WS引脚配置

参考app_i2s_pin_t结构体

app_i2s_pin_t sdo

I2S SDO引脚配置

参考app_i2s_pin_t结构体

app_i2s_pin_t sdi

I2S SDI引脚配置

参考app_i2s_pin_t结构体

app_i2s_pin_t sclk

I2S SCLK引脚配置

参考app_i2s_pin_t结构体

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_dma_cfg_t

结构体定义如下:

表 179 app_i2s_dma_cfg_t结构体成员
成员 描述 取值

dma_reg_t *tx_dma_instance

I2S TX指定DMA模块配置

参考app_dma_params_t中DMA实例描述

dma_reg_t *rx_dma_instance

I2S RX指定DMA模块配置

参考app_dma_params_t中DMA实例描述

dma_channel_t tx_dma_channel

I2S TX的DMA通道选择

参考app_dma_params_t中通道描述

dma_channel_t rx_dma_channel

I2S RX的DMA通道选择

参考app_dma_params_t中通道描述

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_params_t

结构体定义如下:

表 180 app_i2s_params_t结构体成员
成员 描述 取值

app_i2s_id_t id

设置使用的I2S模块ID

该参数的取值可以是下列值中的任意一个:
  • APP_I2S_ID_SLAVE(I2S Slave)
  • APP_I2S_ID_MASTER(I2S Master)
  • APP_I2S_ID_MAX(I2S模块总个数,无其他用途)

app_i2s_pin_cfg_t pin_cfg

I2S引脚功能设置

参考app_i2s_pin_cfg_t结构体

app_i2s_dma_cfg_t dma_cfg

I2S DMA参数配置

参考app_i2s_dma_cfg_t结构体

i2s_init_t init

I2S初始化参数配置

参考i2s_init_t结构体

i2s_env_t i2s_env

仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

i2s_init_t

结构体定义如下:

表 181 i2s_init_t结构体成员
成员 描述 取值

uint32_t data_size

I2S数据位宽

该参数的取值可以是下列值中的任意一个:
  • I2S_DATASIZE_12BIT(12 bits)
  • I2S_DATASIZE_16BIT(16 bits)
  • I2S_DATASIZE_20BIT(20 bits)
  • I2S_DATASIZE_24BIT(24 bits)
  • I2S_DATASIZE_32BIT(32 bits)

uint32_t clock_source

I2S时钟源

该参数的取值可以是下列值中的任意一个:
  • I2S_CLOCK_SRC_96M(96 MHz)
  • I2S_CLOCK_SRC_64M(64 MHz)
  • I2S_CLOCK_SRC_32M(32 MHz)

uint32_t ws_cycles

I2S WS时钟长度

该参数的取值可以是下列值中的任意一个:
  • I2S_WS_CYCLES_16(16个BCLK时钟周期,代表传输16 bits的数据)
  • I2S_WS_CYCLES_24(24个BCLK时钟周期,代表传输24 bits的数据)
  • I2S_WS_CYCLES_32(32个BCLK时钟周期,代表传输32 bits的数据)

uint32_t audio_freq

I2S音频采样率,单位:Hz

最高96000(I2S_WS_CYCLES_16)

uint32_t channel_active

I2S激活通道(I2S_CHANNEL_NUM > 1)

暂不可用

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_evt_t

结构体定义如下:

表 182 app_i2s_evt_t结构体成员
成员 描述 取值

app_i2s_evt_type_t type

I2S事件类型

该参数的取值可以是下列值中的任意一个:
  • APP_I2S_EVT_ERROR(I2S传输错误)
  • APP_I2S_EVT_TX_CPLT(I2S发送完成)
  • APP_I2S_EVT_RX_DATA(I2S接收完成)
  • APP_I2S_EVT_TX_RX(I2S发送接收完成)

union

{

uint32_t error_code;

uint16_t size;

}data;

  • uint32_t error_code:I2S事件返回的错误号
  • uint16_t size:I2S已接收/发送的数据长度

说明:

若事件类型为传输错误,此处返回错误号; 若事件类型为接收/发送完成,此处显示已接收/发送的数据长度

I2S错误号如下:
  • HAL_I2S_ERROR_NONE(无错误)
  • HAL_I2S_ERROR_TIMEOUT(操作超时)
  • HAL_I2S_ERROR_TRANSFER(传输中断错误)
  • HAL_I2S_ERROR_DMA(DMA传输错误)
  • HAL_I2S_ERROR_INVALID_PARAM(非法传参错误)

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

枚举

app_i2s_id_t

枚举定义如下:

表 183 app_i2s_id_t枚举成员
成员 描述

APP_I2S_ID_MASTER = 0

I2S Master模块

APP_I2S_ID_SLAVE = 1

I2S Slave模块

APP_I2S_ID_MAX = 2

I2S模块总个数,用于参数检测

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_evt_type_t

枚举定义如下:

表 184 app_i2s_evt_type_t枚举成员
成员 描述

APP_I2S_EVT_ERROR = 0

I2S传输错误事件

APP_I2S_EVT_TX_CPLT = 1

I2S发送完成事件

APP_I2S_EVT_RX_DATA = 2

I2S接收完成事件

APP_I2S_EVT_TX_RX = 3

I2S发送接收完成事件

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_dma_state_t

枚举定义如下:

表 185 app_i2s_dma_state_t枚举成员
成员 描述
APP_I2S_DMA_INVALID I2S DMA不可用
APP_I2S_DMA_ACTIVITY I2S DMA激活

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

app_i2s_state_t

枚举定义如下:

表 186 app_i2s_state_t枚举成员
成员 描述

APP_I2S_INVALID = 0

I2S不可用

APP_I2S_ACTIVITY = 1

I2S激活

APP_I2S_SLEEP = 2

I2S睡眠

详细信息请参考文件:SDK_Folder\drivers\inc\app_i2s.h

接口函数

表 187 I2S驱动接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_i2s_init

Y

Y

Y

N N

app_i2s_deinit

Y

Y

Y

N N

app_i2s_receive_async

Y

Y

Y

N N

app_i2s_receive_sync

Y

Y

Y

N N

app_i2s_transmit_async

Y

Y

Y

N N

app_i2s_transmit_sync

Y

Y

Y

N N

app_i2s_transmit_receive_sync

Y

Y

Y

N N

app_i2s_transmit_receive_async

Y

Y

Y

N N

app_i2s_enable

Y

Y

Y

N N

app_i2s_disable

Y

Y

Y

N N

app_i2s_enable_clock

Y

Y

Y

N N

app_i2s_disable_clock

Y

Y

Y

N N

app_i2s_flush_tx_fifo

Y

Y

Y

N N

app_i2s_flush_rx_fifo

Y

Y

Y

N N

app_i2s_get_handle

Y

Y

Y

N N

app_i2s_abort

Y

Y

Y

N N

app_i2s_init

表 188 app_i2s_init接口
函数原型

uint16_t app_i2s_init(app_i2s_params_t *p_params, app_i2s_evt_handler_t evt_handler)

功能说明

初始化I2S

输入参数
  • p_params:初始化参数的结构体指针
  • evt_handler:用户自己实现的中断回调函数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

回调函数形式参照typedef void (*app_i2s_evt_handler_t)(app_i2s_evt_t *p_evt);

HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理,回调函数根据返回事件类型进行相应的处理即可。

app_i2s_deinit

表 189 app_i2s_deinit接口
函数原型

uint16_t app_i2s_deinit(app_i2s_id_t id)

功能说明

反初始化I2S

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_receive_sync

表 190 app_i2s_receive_sync接口
函数原型

uint16_t app_i2s_receive_sync(app_i2s_id_t id, uint16_t *p_data, uint16_t size, uint32_t timeout)

功能说明

I2S轮询方式(同步)接收数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以半字(Half-Word)为单位
  • timeout:接收超时时间
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 I2S同步方式接收数据,如果被打断,可能会由于FIFO溢出导致数据丢失,建议使用DMA方式,或通过关闭中断等方式避免被打断。

app_i2s_receive_async

表 191 app_i2s_receive_async接口
函数原型

uint16_t app_i2s_receive_async(app_i2s_id_t id, uint16_t *p_data, uint16_t size)

功能说明

I2S中断方式(异步)接收数据

输入参数
  • id:I2S模块ID (参考app_i2s_id_t
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 在RTOS睡眠模式下,有溢出风险,推荐使用DMA接口

app_i2s_transmit_sync

表 192 app_i2s_transmit_sync接口
函数原型

uint16_t app_i2s_transmit_sync(app_i2s_id_t id, uint16_t *p_data, uint16_t size, uint32_t timeout)

功能说明

I2S轮询方式(同步)发送数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_data:需要发送的数据buffer指针
  • size:需要发送的数据长度,以半字(Half-Word)为单位
  • timeout:发送超时时间
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 I2S同步发送时,如果被打断,可能会产生无意义的0数据,建议使用DMA方式,或者通过关闭中断的方式避免被打断。

app_i2s_transmit_async

表 193 app_i2s_transmit_async接口
函数原型

uint16_t app_i2s_transmit_async(app_i2s_id_t id, uint16_t *p_data, uint16_t size)

功能说明

I2S中断方式(异步)发送数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_data:接收数据的buffer
  • size:需要发送的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

从设备调用这个接口发送时,如果要发送的数据小于36个Half-Word的长度,不管是否发送成功都会进入发送完成中断

app_i2s_transmit_receive_sync

表 194 app_i2s_transmit_receive_sync接口
函数原型

uint16_t app_i2s_transmit_receive_sync(app_i2s_id_t id, uint16_t *p_tx_data, uint16_t *p_rx_data, uint32_t length, uint32_t timeout)

功能说明

I2S轮询方式(同步)发送接收数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • length:需要接收的数据长度,以半字(Half-Word)为单位
  • timeout:接收超时时间
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 同步接口如果被打断则存在数据异常风险,建议使用DMA接口。

app_i2s_transmit_receive_async

表 195 app_i2s_transmit_receive_async接口
函数原型

uint16_t app_i2s_transmit_receive_async(app_i2s_id_t id, uint16_t *p_tx_data, uint16_t *p_rx_data, uint32_t length)

功能说明

I2S使用中断方式(异步)发送接收数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • length:需要接收的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

在RTOS睡眠模式下,有溢出风险,推荐使用DMA接口

app_i2s_enable

表 196 app_i2s_enable接口
函数原型

uint16_t app_i2s_enable(app_i2s_id_t id)

功能说明

使能I2S模块

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_disable

表 197 app_i2s_disable接口
函数原型

uint16_t app_i2s_disable(app_i2s_id_t id)

功能说明

禁用I2S模块

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_enable_clock

表 198 app_i2s_enable_clock接口
函数原型

uint16_t app_i2s_enable_clock(app_i2s_id_t id)

功能说明

使能I2S Clock,仅Master可使用

输入参数

id:I2S模块ID。参数只能传APP_I2S_ID_MASTER,否则会返回参数错误

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_disable_clock

表 199 app_i2s_disable_clock接口
函数原型

uint16_t app_i2s_disable_clock(app_i2s_id_t id)

功能说明

禁用I2S Clock,仅Master可使用

输入参数

id:I2S模块ID,参数只能传APP_I2S_ID_MASTER,否则会返回参数错误

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_flush_tx_fifo

表 200 app_i2s_flush_tx_fifo接口
函数原型

uint16_t app_i2s_flush_tx_fifo(app_i2s_id_t id)

功能说明

清除I2S写缓冲区

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_flush_rx_fifo

表 201 app_i2s_flush_rx_fifo接口
函数原型

uint16_t app_i2s_flush_rx_fifo(app_i2s_id_t id)

功能说明

清除I2S读缓冲区

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_get_handle

表 202 app_i2s_get_handle接口
函数原型

i2s_handle_t *app_i2s_get_handle(app_i2s_id_t id)

功能说明

获取I2S句柄

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

I2S句柄指针

备注

app_i2s_abort

表 203 app_i2s_abort接口
函数原型

uint16_t app_i2s_abort(app_i2s_id_t id)

功能说明

中止I2S数据传输

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

DMA接口函数

表 204 DMA接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_i2s_dma_init

Y

Y

Y

N N

app_i2s_dma_deinit

Y

Y

Y

N N

app_i2s_dma_receive_async

Y

Y

Y

N N

app_i2s_dma_transmit_async

Y

Y

Y

N N

app_i2s_dma_transmit_receive_async

Y

Y

Y

N N

app_i2s_dma_init

表 205 app_i2s_dma_init接口
函数原型

uint16_t app_i2s_dma_init(app_i2s_params_t *p_params)

功能说明

初始化I2S的DMA方式传输

输入参数

p_params:初始化参数的结构体指针

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_dma_deinit

表 206 app_i2s_dma_deinit接口
函数原型

uint16_t app_i2s_dma_deinit(app_i2s_id_t id)

功能说明

反初始化I2S的DMA方式传输

输入参数

id:I2S模块ID(参考app_i2s_id_t

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_dma_receive_async

表 207 app_i2s_dma_receive_async接口
函数原型

uint16_t app_i2s_dma_receive_async(app_i2s_id_t id, uint16_t *p_data, uint16_t size)

功能说明

I2S DMA方式(异步)接收数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_dma_transmit_async

表 208 app_i2s_dma_transmit_async接口
函数原型

uint16_t app_i2s_dma_transmit_async(app_i2s_id_t id, uint16_t *p_data, uint16_t size)

功能说明

I2S DMA方式(异步)发送数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_data:接收数据的buffer
  • size:需要发送的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_i2s_dma_transmit_receive_async

表 209 app_i2s_dma_transmit_receive_async接口
函数原型

uint16_t app_i2s_dma_transmit_receive_async(app_i2s_id_t id, uint16_t *p_tx_data, uint16_t *p_rx_data, uint32_t length)

功能说明

I2S使用DMA方式(异步)发送接收数据

输入参数
  • id:I2S模块ID(参考app_i2s_id_t
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • length:需要接收的数据长度,以半字(Half-Word)为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

示例工程

I2S Master和Slave中断传输

示例实现I2S之间的通信,其中一端为Master主设备,另一端为Slave从设备。工程路径:SDK_Folder\projects\peripheral\i2s\app_i2s

流程图

图 17 I2S Master和Slave中断传输流程

初始化参数

I2S主设备初始化参数,从设备类似:

app_i2s_params_t i2sm_params = {
   .id = APP_I2S_ID_MASTER,
   .pin_cfg = {
       .ws = {
           .type = APP_I2S_MASTER_WS_IO_TYPE,
           .mux  = APP_I2S_MASTER_WS_PINMUX,
           .pin  = APP_I2S_MASTER_WS_PIN,
           .pull = APP_IO_NOPULL,
       },
       .sdo = {
           .type = APP_I2S_MASTER_SDO_IO_TYPE,
           .mux  = APP_I2S_MASTER_SDO_PINMUX,
           .pin  = APP_I2S_MASTER_SDO_PIN,
           .pull = APP_IO_NOPULL,
       },
       .sdi = {
           .type = APP_I2S_MASTER_SDI_IO_TYPE,
           .mux  = APP_I2S_MASTER_SDI_PINMUX,
           .pin  = APP_I2S_MASTER_SDI_PIN,
           .pull = APP_IO_NOPULL,
       },
       .sclk = {
           .type = APP_I2S_MASTER_SCLK_IO_TYPE,
           .mux  = APP_I2S_MASTER_SCLK_PINMUX,
           .pin  = APP_I2S_MASTER_SCLK_PIN,
           .pull = APP_IO_NOPULL,
       },
   },
    .dma_cfg = {
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
        .tx_dma_instance = DMA1,
        .rx_dma_instance = DMA1,
#else
        .tx_dma_instance = DMA,
        .rx_dma_instance = DMA,
#endif
        .tx_dma_channel  = DMA_Channel2,
        .rx_dma_channel  = DMA_Channel3,
    },
    .init = {
        .data_size    = I2S_DATASIZE_32BIT,
        .clock_source = I2S_CLOCK_SRC_96M,
 #if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
        .ws_cycles   = I2S_WS_CYCLES_32,
 #endif
        .audio_freq = 48000,
    }, };
  • id:角色配置

    APP_I2S_ID_MASTER:主设备

  • pin_cfg:引脚配置

    主要配置IO类型、复用MUX模式、引脚和上下拉模式,具体选择的参数请参考board_SK.h

    以GR5526为例,下面是具体IO配置:

    /*******I2S IO CONFIG***************************/  
    #define APP_I2S_MASTER_WS_PIN               APP_IO_PIN_6
    #define APP_I2S_MASTER_SDO_PIN              APP_IO_PIN_7
    #define APP_I2S_MASTER_SDI_PIN              APP_IO_PIN_8
    #define APP_I2S_MASTER_SCLK_PIN             APP_IO_PIN_9
    #define APP_I2S_MASTER_WS_IO_TYPE           APP_IO_TYPE_GPIOA
    #define APP_I2S_MASTER_SDO_IO_TYPE          APP_IO_TYPE_GPIOA
    #define APP_I2S_MASTER_SDI_IO_TYPE          APP_IO_TYPE_GPIOA
    #define APP_I2S_MASTER_SCLK_IO_TYPE         APP_IO_TYPE_GPIOA
    #define APP_I2S_MASTER_WS_PINMUX            APP_IO_MUX_3
    #define APP_I2S_MASTER_SDO_PINMUX           APP_IO_MUX_3
    #define APP_I2S_MASTER_SDI_PINMUX           APP_IO_MUX_3
    #define APP_I2S_MASTER_SCLK_PINMUX          APP_IO_MUX_3
    
    #define APP_I2S_SLAVE_WS_PIN                APP_IO_PIN_3
    #define APP_I2S_SLAVE_SDO_PIN               APP_IO_PIN_2
    #define APP_I2S_SLAVE_SDI_PIN               APP_IO_PIN_1
    #define APP_I2S_SLAVE_SCLK_PIN              APP_IO_PIN_0
    #define APP_I2S_SLAVE_WS_IO_TYPE            APP_IO_TYPE_MSIO
    #define APP_I2S_SLAVE_SDO_IO_TYPE           APP_IO_TYPE_MSIO
    #define APP_I2S_SLAVE_SDI_IO_TYPE           APP_IO_TYPE_MSIO
    #define APP_I2S_SLAVE_SCLK_IO_TYPE          APP_IO_TYPE_MSIO
    #define APP_I2S_SLAVE_WS_PINMUX             APP_IO_MUX_4
    #define APP_I2S_SLAVE_SDO_PINMUX            APP_IO_MUX_4
    #define APP_I2S_SLAVE_SDI_PINMUX            APP_IO_MUX_4
    #define APP_I2S_SLAVE_SCLK_PINMUX           APP_IO_MUX_4
    

    使用MSIO3作为Slave端WS引脚,MSIO0作为Slave端SCL引脚,MSIO2作为Slave端SDO引脚,MSIO1作为Slave端SDI引脚。使用GPIO6作为Master端WS引脚,GPIO9作为Master端SCL引脚,GPIO7作为Master端SDO引脚,GPIO8作为Master端SDI引脚。

  • dma_cfg:DMA配置

    • dma_cfg.tx_dma_instance:I2S发送使用的DMA实例
    • dma_cfg.rx_dma_instance:I2S接收使用的DMA实例
    • dma_cfg.tx_dma_channel:I2S发送使用的DMA实例通道
    • dma_cfg.rx_dma_channel:I2S接收使用的DMA实例通道
  • init:I2S传输参数配置

    • init.data_size:I2S数据位宽I2S_DATASIZE_32BIT,数据位宽32 bits
    • init.clock_source:I2S时钟源I2S_CLOCK_SRC_96M,选择96 MHz的时钟源
    • init.ws_cycles:I2S WS时钟长度I2S_WS_CYCLES_32,32个BCLK时钟周期代表传输32 bits的数据
    • init.audio_freq:I2S音频采样频率48000 Hz

重要函数

  • I2S初始化
    ret = app_i2s_init(&i2sm_params, app_i2sm_callback)
  • I2S清理TX FIFO
    app_i2s_flush_tx_fifo(APP_I2S_ID_MASTER);
  • I2S清理RX FIFO
    app_i2s_flush_rx_fifo(APP_I2S_ID_MASTER)
  • I2S接收数据
    app_i2s_receive_async(APP_I2S_ID_SLAVE, rdata, sizeof(rdata) >> 2)
  • I2S发送数据
    app_i2s_transmit_async(APP_I2S_ID_MASTER, wdata, sizeof(wdata) >> 2)

测试验证

  1. 按代码配置连接引脚。
  2. 连接开发板到PC端,打开串口助手,连接串口,查看串口日志如下:
    I2SM interrupt write start.
    Please check I2SS Received: 
    0x00010000 0x00030002 0x00050004 0x00070006 
    0x00090008 0x000B000A 0x000D000C 0x000F000E 
    0x00110010 0x00130012 0x00150014 0x00170016 
    0x00190018 0x001B001A 0x001D001C 0x001F001E 
    0x00210020 0x00230022 0x00250024 0x00270026 
    0x00290028 0x002B002A 0x002D002C 0x002F002E 
    0x00310030 0x00330032 0x00350034 0x00370036 
    0x00390038 0x003B003A 0x003D003C 0x003F003E 
    0x00410040 0x00430042 0x00450044 0x00470046 
    0x00490048 0x004B004A 0x004D004C 0x004F004E 
    0x00510050 0x00530052 0x00550054 0x00570056 
    0x00590058 0x005B005A 0x005D005C 0x005F005E 
    0x00610060 0x00630062 0x00650064 0x00670066 
    0x00690068 0x006B006A 0x006D006C 0x006F006E 
    0x00710070 0x00730072 0x00750074 0x00770076 
    0x00790078 0x007B007A 0x007D007C 0x007F007E 
    0x00810080 0x00830082 0x00850084 0x00870086 
    0x00890088 0x008B008A 0x008D008C 0x008F008E 
    0x00910090 0x00930092 0x00950094 0x00970096 
    0x00990098 0x009B009A 0x009D009C 0x009F009E 
    0x00A100A0 0x00A300A2 0x00A500A4 0x00A700A6 
    0x00A900A8 0x00AB00AA 0x00AD00AC 0x00AF00AE 
    0x00B100B0 0x00B300B2 0x00B500B4 0x00B700B6 
    0x00B900B8 0x00BB00BA 0x00BD00BC 0x00BF00BE 
    0x00C100C0 0x00C300C2 0x00C500C4 0x00C700C6 
    0x00C900C8 0x00CB00CA 0x00CD00CC 0x00CF00CE 
    0x00D100D0 0x00D300D2 0x00D500D4 0x00D700D6 
    0x00D900D8 0x00DB00DA 0x00DD00DC 0x00DF00DE 
    0x00E100E0 0x00E300E2 0x00E500E4 0x00E700E6 
    0x00E900E8 0x00EB00EA 0x00ED00EC 0x00EF00EE 
    0x00F100F0 0x00F300F2 0x00F500F4 0x00F700F6 
    0x00F900F8 0x00FB00FA 0x00FD00FC 0x00FF00FE 
    0x01010100 0x01030102 0x01050104 0x01070106 
    0x01090108 0x010B010A 0x010D010C 0x010F010E 
    0x01110110 0x01130112 0x01150114 0x01170116 
    0x01190118 0x011B011A 0x011D011C 0x011F011E 
    0x01210120 0x01230122 0x01250124 0x01270126 
    0x01290128 0x012B012A 0x012D012C 0x012F012E 
    0x01310130 0x01330132 0x01350134 0x01370136 
    0x01390138 0x013B013A 0x013D013C 0x013F013E 
    0x01410140 0x01430142 0x01450144 0x01470146 
    0x01490148 0x014B014A 0x014D014C 0x014F014E 
    0x01510150 0x01530152 0x01550154 0x01570156 
    0x01590158 0x015B015A 0x015D015C 0x015F015E 
    0x01610160 0x01630162 0x01650164 0x01670166 
    0x01690168 0x016B016A 0x016D016C 0x016F016E 
    0x01710170 0x01730172 0x01750174 0x01770176 
    0x01790178 0x017B017A 0x017D017C 0x017F017E 
    0x01810180 0x01830182 0x01850184 0x01870186 
    0x01890188 0x018B018A 0x018D018C 0x018F018E 
    0x01910190 0x01930192 0x01950194 0x01970196 
    0x01990198 0x019B019A 0x019D019C 0x019F019E 
    0x01A101A0 0x01A301A2 0x01A501A4 0x01A701A6 
    0x01A901A8 0x01AB01AA 0x01AD01AC 0x01AF01AE 
    0x01B101B0 0x01B301B2 0x01B501B4 0x01B701B6 
    0x01B901B8 0x01BB01BA 0x01BD01BC 0x01BF01BE 
    0x01C101C0 0x01C301C2 0x01C501C4 0x01C701C6 
    0x01C901C8 0x01CB01CA 0x01CD01CC 0x01CF01CE 
    0x01D101D0 0x01D301D2 0x01D501D4 0x01D701D6 
    0x01D901D8 0x01DB01DA 0x01DD01DC 0x01DF01DE 
    0x01E101E0 0x01E301E2 0x01E501E4 0x01E701E6 
    0x01E901E8 0x01EB01EA 0x01ED01EC 0x01EF01EE 
    0x01F101F0 0x01F301F2 0x01F501F4 0x01F701F6 
    0x01F901F8 0x01FB01FA 0x01FD01FC 0x01FF01FE 
    
    
    I2SM interrupt read start.
    Please check I2SM Received: 
    0x00010000 0x00030002 0x00050004 0x00070006 
    0x00090008 0x000B000A 0x000D000C 0x000F000E 
    0x00110010 0x00130012 0x00150014 0x00170016 
    0x00190018 0x001B001A 0x001D001C 0x001F001E 
    0x00210020 0x00230022 0x00250024 0x00270026 
    0x00290028 0x002B002A 0x002D002C 0x002F002E 
    0x00310030 0x00330032 0x00350034 0x00370036 
    0x00390038 0x003B003A 0x003D003C 0x003F003E 
    0x00410040 0x00430042 0x00450044 0x00470046 
    0x00490048 0x004B004A 0x004D004C 0x004F004E 
    0x00510050 0x00530052 0x00550054 0x00570056 
    0x00590058 0x005B005A 0x005D005C 0x005F005E 
    0x00610060 0x00630062 0x00650064 0x00670066 
    0x00690068 0x006B006A 0x006D006C 0x006F006E 
    0x00710070 0x00730072 0x00750074 0x00770076 
    0x00790078 0x007B007A 0x007D007C 0x007F007E 
    0x00810080 0x00830082 0x00850084 0x00870086 
    0x00890088 0x008B008A 0x008D008C 0x008F008E 
    0x00910090 0x00930092 0x00950094 0x00970096 
    0x00990098 0x009B009A 0x009D009C 0x009F009E 
    0x00A100A0 0x00A300A2 0x00A500A4 0x00A700A6 
    0x00A900A8 0x00AB00AA 0x00AD00AC 0x00AF00AE 
    0x00B100B0 0x00B300B2 0x00B500B4 0x00B700B6 
    0x00B900B8 0x00BB00BA 0x00BD00BC 0x00BF00BE 
    0x00C100C0 0x00C300C2 0x00C500C4 0x00C700C6 
    0x00C900C8 0x00CB00CA 0x00CD00CC 0x00CF00CE 
    0x00D100D0 0x00D300D2 0x00D500D4 0x00D700D6 
    0x00D900D8 0x00DB00DA 0x00DD00DC 0x00DF00DE 
    0x00E100E0 0x00E300E2 0x00E500E4 0x00E700E6 
    0x00E900E8 0x00EB00EA 0x00ED00EC 0x00EF00EE 
    0x00F100F0 0x00F300F2 0x00F500F4 0x00F700F6 
    0x00F900F8 0x00FB00FA 0x00FD00FC 0x00FF00FE 
    0x01010100 0x01030102 0x01050104 0x01070106 
    0x01090108 0x010B010A 0x010D010C 0x010F010E 
    0x01110110 0x01130112 0x01150114 0x01170116 
    0x01190118 0x011B011A 0x011D011C 0x011F011E 
    0x01210120 0x01230122 0x01250124 0x01270126 
    0x01290128 0x012B012A 0x012D012C 0x012F012E 
    0x01310130 0x01330132 0x01350134 0x01370136 
    0x01390138 0x013B013A 0x013D013C 0x013F013E 
    0x01410140 0x01430142 0x01450144 0x01470146 
    0x01490148 0x014B014A 0x014D014C 0x014F014E 
    0x01510150 0x01530152 0x01550154 0x01570156 
    0x01590158 0x015B015A 0x015D015C 0x015F015E 
    0x01610160 0x01630162 0x01650164 0x01670166 
    0x01690168 0x016B016A 0x016D016C 0x016F016E 
    0x01710170 0x01730172 0x01750174 0x01770176 
    0x01790178 0x017B017A 0x017D017C 0x017F017E 
    0x01810180 0x01830182 0x01850184 0x01870186 
    0x01890188 0x018B018A 0x018D018C 0x018F018E 
    0x01910190 0x01930192 0x01950194 0x01970196 
    0x01990198 0x019B019A 0x019D019C 0x019F019E 
    0x01A101A0 0x01A301A2 0x01A501A4 0x01A701A6 
    0x01A901A8 0x01AB01AA 0x01AD01AC 0x01AF01AE 
    0x01B101B0 0x01B301B2 0x01B501B4 0x01B701B6 
    0x01B901B8 0x01BB01BA 0x01BD01BC 0x01BF01BE 
    0x01C101C0 0x01C301C2 0x01C501C4 0x01C701C6 
    0x01C901C8 0x01CB01CA 0x01CD01CC 0x01CF01CE 
    0x01D101D0 0x01D301D2 0x01D501D4 0x01D701D6 
    0x01D901D8 0x01DB01DA 0x01DD01DC 0x01DF01DE 
    0x01E101E0 0x01E301E2 0x01E501E4 0x01E701E6 
    0x01E901E8 0x01EB01EA 0x01ED01EC 0x01EF01EE 
    0x01F101F0 0x01F301F2 0x01F501F4 0x01F701F6 
    0x01F901F8 0x01FB01FA 0x01FD01FC 0x01FF01FE
    

I2S Master和Slave DMA传输

示例实现I2S之间的DMA通信,其中一端为Master主设备,另一端为Slave从设备。工程路径:SDK_Folder\projects\peripheral\i2s\app_i2s

流程图

图 18 I2S Master和Slave DMA传输流程

重要函数

  • I2S初始化
    ret = app_i2s_init(&i2sm_params, app_i2sm_callback);
  • 配置DMA模式
    ret = app_i2s_dma_init(&i2sm_params);
  • I2S清理TX FIFO
    app_i2s_flush_tx_fifo(APP_I2S_ID_MASTER);
  • I2S清理RX FIFO
    app_i2s_flush_rx_fifo(APP_I2S_ID_MASTER)
  • I2S接收数据
    app_i2s_receive_async(APP_I2S_ID_SLAVE, rdata, sizeof(rdata) >> 2)
  • I2S发送数据
    app_i2s_transmit_async(APP_I2S_ID_MASTER, wdata, sizeof(wdata) >> 2)

测试验证

  1. 按代码配置连接引脚。
  2. 连接开发板到PC端,打开串口助手,连接串口,查看串口日志如下:
    I2SM dma write start.
    Please check I2SS Received: 
    0x00010000 0x00030002 0x00050004 0x00070006 
    0x00090008 0x000B000A 0x000D000C 0x000F000E 
    0x00110010 0x00130012 0x00150014 0x00170016 
    0x00190018 0x001B001A 0x001D001C 0x001F001E 
    0x00210020 0x00230022 0x00250024 0x00270026 
    0x00290028 0x002B002A 0x002D002C 0x002F002E 
    0x00310030 0x00330032 0x00350034 0x00370036 
    0x00390038 0x003B003A 0x003D003C 0x003F003E 
    0x00410040 0x00430042 0x00450044 0x00470046 
    0x00490048 0x004B004A 0x004D004C 0x004F004E 
    0x00510050 0x00530052 0x00550054 0x00570056 
    0x00590058 0x005B005A 0x005D005C 0x005F005E 
    0x00610060 0x00630062 0x00650064 0x00670066 
    0x00690068 0x006B006A 0x006D006C 0x006F006E 
    0x00710070 0x00730072 0x00750074 0x00770076 
    0x00790078 0x007B007A 0x007D007C 0x007F007E 
    0x00810080 0x00830082 0x00850084 0x00870086 
    0x00890088 0x008B008A 0x008D008C 0x008F008E 
    0x00910090 0x00930092 0x00950094 0x00970096 
    0x00990098 0x009B009A 0x009D009C 0x009F009E 
    0x00A100A0 0x00A300A2 0x00A500A4 0x00A700A6 
    0x00A900A8 0x00AB00AA 0x00AD00AC 0x00AF00AE 
    0x00B100B0 0x00B300B2 0x00B500B4 0x00B700B6 
    0x00B900B8 0x00BB00BA 0x00BD00BC 0x00BF00BE 
    0x00C100C0 0x00C300C2 0x00C500C4 0x00C700C6 
    0x00C900C8 0x00CB00CA 0x00CD00CC 0x00CF00CE 
    0x00D100D0 0x00D300D2 0x00D500D4 0x00D700D6 
    0x00D900D8 0x00DB00DA 0x00DD00DC 0x00DF00DE 
    0x00E100E0 0x00E300E2 0x00E500E4 0x00E700E6 
    0x00E900E8 0x00EB00EA 0x00ED00EC 0x00EF00EE 
    0x00F100F0 0x00F300F2 0x00F500F4 0x00F700F6 
    0x00F900F8 0x00FB00FA 0x00FD00FC 0x00FF00FE 
    0x01010100 0x01030102 0x01050104 0x01070106 
    0x01090108 0x010B010A 0x010D010C 0x010F010E 
    0x01110110 0x01130112 0x01150114 0x01170116 
    0x01190118 0x011B011A 0x011D011C 0x011F011E 
    0x01210120 0x01230122 0x01250124 0x01270126 
    0x01290128 0x012B012A 0x012D012C 0x012F012E 
    0x01310130 0x01330132 0x01350134 0x01370136 
    0x01390138 0x013B013A 0x013D013C 0x013F013E 
    0x01410140 0x01430142 0x01450144 0x01470146 
    0x01490148 0x014B014A 0x014D014C 0x014F014E 
    0x01510150 0x01530152 0x01550154 0x01570156 
    0x01590158 0x015B015A 0x015D015C 0x015F015E 
    0x01610160 0x01630162 0x01650164 0x01670166 
    0x01690168 0x016B016A 0x016D016C 0x016F016E 
    0x01710170 0x01730172 0x01750174 0x01770176 
    0x01790178 0x017B017A 0x017D017C 0x017F017E 
    0x01810180 0x01830182 0x01850184 0x01870186 
    0x01890188 0x018B018A 0x018D018C 0x018F018E 
    0x01910190 0x01930192 0x01950194 0x01970196 
    0x01990198 0x019B019A 0x019D019C 0x019F019E 
    0x01A101A0 0x01A301A2 0x01A501A4 0x01A701A6 
    0x01A901A8 0x01AB01AA 0x01AD01AC 0x01AF01AE 
    0x01B101B0 0x01B301B2 0x01B501B4 0x01B701B6 
    0x01B901B8 0x01BB01BA 0x01BD01BC 0x01BF01BE 
    0x01C101C0 0x01C301C2 0x01C501C4 0x01C701C6 
    0x01C901C8 0x01CB01CA 0x01CD01CC 0x01CF01CE 
    0x01D101D0 0x01D301D2 0x01D501D4 0x01D701D6 
    0x01D901D8 0x01DB01DA 0x01DD01DC 0x01DF01DE 
    0x01E101E0 0x01E301E2 0x01E501E4 0x01E701E6 
    0x01E901E8 0x01EB01EA 0x01ED01EC 0x01EF01EE 
    0x01F101F0 0x01F301F2 0x01F501F4 0x01F701F6 
    0x01F901F8 0x01FB01FA 0x01FD01FC 0x01FF01FE 
    
    
    I2SM dma read start.
    Please check I2SM Received: 
    0x00010000 0x00030002 0x00050004 0x00070006 
    0x00090008 0x000B000A 0x000D000C 0x000F000E 
    0x00110010 0x00130012 0x00150014 0x00170016 
    0x00190018 0x001B001A 0x001D001C 0x001F001E 
    0x00210020 0x00230022 0x00250024 0x00270026 
    0x00290028 0x002B002A 0x002D002C 0x002F002E 
    0x00310030 0x00330032 0x00350034 0x00370036 
    0x00390038 0x003B003A 0x003D003C 0x003F003E 
    0x00410040 0x00430042 0x00450044 0x00470046 
    0x00490048 0x004B004A 0x004D004C 0x004F004E 
    0x00510050 0x00530052 0x00550054 0x00570056 
    0x00590058 0x005B005A 0x005D005C 0x005F005E 
    0x00610060 0x00630062 0x00650064 0x00670066 
    0x00690068 0x006B006A 0x006D006C 0x006F006E 
    0x00710070 0x00730072 0x00750074 0x00770076 
    0x00790078 0x007B007A 0x007D007C 0x007F007E 
    0x00810080 0x00830082 0x00850084 0x00870086 
    0x00890088 0x008B008A 0x008D008C 0x008F008E 
    0x00910090 0x00930092 0x00950094 0x00970096 
    0x00990098 0x009B009A 0x009D009C 0x009F009E 
    0x00A100A0 0x00A300A2 0x00A500A4 0x00A700A6 
    0x00A900A8 0x00AB00AA 0x00AD00AC 0x00AF00AE 
    0x00B100B0 0x00B300B2 0x00B500B4 0x00B700B6 
    0x00B900B8 0x00BB00BA 0x00BD00BC 0x00BF00BE 
    0x00C100C0 0x00C300C2 0x00C500C4 0x00C700C6 
    0x00C900C8 0x00CB00CA 0x00CD00CC 0x00CF00CE 
    0x00D100D0 0x00D300D2 0x00D500D4 0x00D700D6 
    0x00D900D8 0x00DB00DA 0x00DD00DC 0x00DF00DE 
    0x00E100E0 0x00E300E2 0x00E500E4 0x00E700E6 
    0x00E900E8 0x00EB00EA 0x00ED00EC 0x00EF00EE 
    0x00F100F0 0x00F300F2 0x00F500F4 0x00F700F6 
    0x00F900F8 0x00FB00FA 0x00FD00FC 0x00FF00FE 
    0x01010100 0x01030102 0x01050104 0x01070106 
    0x01090108 0x010B010A 0x010D010C 0x010F010E 
    0x01110110 0x01130112 0x01150114 0x01170116 
    0x01190118 0x011B011A 0x011D011C 0x011F011E 
    0x01210120 0x01230122 0x01250124 0x01270126 
    0x01290128 0x012B012A 0x012D012C 0x012F012E 
    0x01310130 0x01330132 0x01350134 0x01370136 
    0x01390138 0x013B013A 0x013D013C 0x013F013E 
    0x01410140 0x01430142 0x01450144 0x01470146 
    0x01490148 0x014B014A 0x014D014C 0x014F014E 
    0x01510150 0x01530152 0x01550154 0x01570156 
    0x01590158 0x015B015A 0x015D015C 0x015F015E 
    0x01610160 0x01630162 0x01650164 0x01670166 
    0x01690168 0x016B016A 0x016D016C 0x016F016E 
    0x01710170 0x01730172 0x01750174 0x01770176 
    0x01790178 0x017B017A 0x017D017C 0x017F017E 
    0x01810180 0x01830182 0x01850184 0x01870186 
    0x01890188 0x018B018A 0x018D018C 0x018F018E 
    0x01910190 0x01930192 0x01950194 0x01970196 
    0x01990198 0x019B019A 0x019D019C 0x019F019E 
    0x01A101A0 0x01A301A2 0x01A501A4 0x01A701A6 
    0x01A901A8 0x01AB01AA 0x01AD01AC 0x01AF01AE 
    0x01B101B0 0x01B301B2 0x01B501B4 0x01B701B6 
    0x01B901B8 0x01BB01BA 0x01BD01BC 0x01BF01BE 
    0x01C101C0 0x01C301C2 0x01C501C4 0x01C701C6 
    0x01C901C8 0x01CB01CA 0x01CD01CC 0x01CF01CE 
    0x01D101D0 0x01D301D2 0x01D501D4 0x01D701D6 
    0x01D901D8 0x01DB01DA 0x01DD01DC 0x01DF01DE 
    0x01E101E0 0x01E301E2 0x01E501E4 0x01E701E6 
    0x01E901E8 0x01EB01EA 0x01ED01EC 0x01EF01EE 
    0x01F101F0 0x01F301F2 0x01F501F4 0x01F701F6 
    0x01F901F8 0x01FB01FA 0x01FD01FC 0x01FF01FE 
    
    
    This example demo end.
    

I2S和PDM麦克风

开发板集成PDM模块和编解码Codec芯片,示例使用PDM模块作为音频输入,通过I2S传输音频数据到Codec芯片,播放音乐。工程路径:SDK_Folder\projects\peripheral\pdm\app_loopback。该示例仅适用于GR5526。

流程图

图 19 简易麦克风实现流程

初始化参数

  1. PDM初始化参数
    app_pdm_params_t g_pdm_params = {
        .pin_cfg = {
            .clk = {
                .type = APP_IO_TYPE_GPIOA,
                .mux  = APP_IO_MUX_1,
                .pin  = APP_IO_PIN_2,
                .pull = APP_IO_NOPULL,
            },
            .data = {
                .type = APP_IO_TYPE_GPIOA,
                .mux  = APP_IO_MUX_1,
                .pin  = APP_IO_PIN_3,
                .pull = APP_IO_NOPULL,
            },
        },
        .dma_cfg = {
            .dma_instance = DMA1,
            .dma_channel  = DMA_Channel0,
        },
        .init = {
            .mode   = PDM_MODE_STEREO,
            .gain_l = 0x400U, // gain(db): 20 * log(0x400/1024) = 0db, 20 * log(0x800/1024) = 6db
            .gain_r = 0x400U, // gain(db): 20 * log(0x400/1024) = 0db, 20 * log(0x800/1024) = 6db
            .sample_rate = PDM_SAMPLE_RATE_16K,
        },
    };
    
    • pin_cfg:引脚配置
      • pin_cfg.clk:PDM时钟引脚配置,IO类型为APP_IO_TYPE_GPIOA,引脚为APP_IO_PIN_2,复用方式为APP_IO_MUX_1,并配置为上拉模式APP_IO_NOPULL
      • pin_cfg.data:PDM数据引脚配置,IO类型为APP_IO_TYPE_GPIOA,引脚为APP_IO_PIN_3,复用方式为APP_IO_MUX_1,并配置为上拉模式APP_IO_NOPULL,即PDM数据引脚为GPIO3
    • dma_cfg:DMA参数配置
      • dma_cfg.dma_instance:指定使用DMA1实例
      • dma_cfg.dma_channel:指定使用DMA1实例通道,选择通道0
    • init:传输参数配置
      • init.mode:立体声采样PDM_MODE_STEREO
      • init.gain_l:左声道增益
      • init.gain_r:右声道增益
      • init.sample_rate:采样频率PDM_SAMPLE_RATE_16K,即16 kHz
  2. I2S初始化参数
    app_i2s_params_t g_i2s_master_params = {
       .id = APP_I2S_ID_MASTER,
       .pin_cfg = {
           .ws = {
               .type = APP_IO_TYPE_GPIOA,
               .mux  = APP_IO_MUX_3,
               .pin  = APP_IO_PIN_6,
               .pull = APP_IO_NOPULL,
           },
           .sdo = {
               .type = APP_IO_TYPE_GPIOA,
               .mux  = APP_IO_MUX_3,
               .pin  = APP_IO_PIN_7,
               .pull = APP_IO_NOPULL,
           },
           .sdi = {
               .type = APP_IO_TYPE_GPIOA,
               .mux  = APP_IO_MUX_3,
               .pin  = APP_IO_PIN_8,
               .pull = APP_IO_NOPULL,
           },
           .sclk = {
               .type = APP_IO_TYPE_GPIOA,
               .mux  = APP_IO_MUX_3,
               .pin  = APP_IO_PIN_9,
               .pull = APP_IO_NOPULL,
           },
       },
       .dma_cfg = {
           .tx_dma_instance = I2S_DMA,
           .rx_dma_instance = I2S_DMA,
           .tx_dma_channel  = DMA_Channel2,
           .rx_dma_channel  = DMA_Channel3,
       },
       .init = {
           .data_size    = I2S_DATASIZE_16BIT,
           .clock_source = I2S_CLOCK_SRC_64M,
           .ws_cycles    = I2S_WS_CYCLES_16,
           .audio_freq   = 16000,
       },
    };
    
    • id:I2S角色定义,为APP_I2S_ID_MASTER
    • pin_cfg:I2S引脚定义,包含WS、SDO、SDI、SCLK引脚的IO类型、引脚、复用模式和上下拉模式
    • dma_cfg:DMA参数配置
      • dma_cfg.tx_dma_instance:I2S发送使用的DMA实例
      • dma_cfg.rx_dma_instance:I2S接收使用的DMA实例,定义如下:
        #if (APP_DRIVER_CHIP_TYPE == APP_DRIVER_GR551x)
        #define I2S_DMA                    DMA
        #else
        #define I2S_DMA                    DMA1
        #endif
        
      • dma_cfg.tx_dma_channel:I2S发送使用的DMA通道,选择DMA_Channel2,即通道2
      • dma_cfg.rx_dma_channel:I2S接收使用的DMA通道,选择DMA_Channel3,即通道3
    • init:传输参数配置
      • init.data_size:I2S数据位宽I2S_DATASIZE_16BIT,即数据位宽为16 bits

    init.clock_source:I2S时钟源I2S_CLOCK_SRC_64M,选择64 MHz的时钟源

    init.ws_cycles:I2S WS时钟长度I2S_WS_CYCLES_16,16个BCLK时钟周期代表传输16 bits的数据

    init.audio_freq:I2S音频采样频率,16000 Hz

重要函数

  • 初始化PDM
    uint16_t ret = loopback_pdm_init()
  • 初始化I2S
    ret = loopback_i2s_master_init(APP_I2S_TYPE_DMA)
  • PDM开启音频数据采集传输
    ret = app_pdm_stereo_start_dma_sg_llp(loopback_ctrl_p->pdm_audio_buf, PDM_AUDIO_FRAME_LEN, &loopback_ctrl_p->pdm_dma.sg_llp_config)
  • I2S将音频数据传输到Codec芯片
    ret = loopback_i2s_stereo_start(block_num, &loopback_ctrl_p->i2s_audio_buf[block_num * I2S_AUDIO_FRAME_LEN * I2S_CHANNEL_NUM], I2S_AUDIO_FRAME_LEN)

测试验证

  1. 开发板连接到PC端,打开串口助手,打印如下,表明初始化成功,开始数据传输。
    loopback_pdm_init ret = 0
    loopback_i2s_master_init ret = 0
    loopback_pdm_dma_start!
  2. 连接耳机到开发板,对着麦克风讲话,通过耳机听到所讲内容。

扫描关注

打开微信,使用“扫一扫”即可关注。