如何使用I2S驱动
I2S的HAL驱动的使用方法如下:
- 定义一个i2s_handle_t句柄结构体变量,例如:i2s_handle_t i2s_handle(i2s_handle_t结构体由I2S的HAL驱动定义,开发者在使用时需要定义一个该结构体类型的变量)。
- 重写hal_i2s_msp_init()接口以初始化I2S底层资源:
- 配置I2S对应GPIO引脚的功能复用、使能上拉电阻。
- 如果需要使用中断或DMA方式的IO操作接口,则需调用相关的NVIC接口来配置:
- 调用hal_nvic_set_priority()配置I2S的中断优先级。
- 调用hal_nvic_enable_irq()使能I2S的NVIC中断。
- 如果需要使用DMA方式的IO操作接口,则还需配置使用的DMA通道:
- 定义用于发送/接收的dma_handle_t句柄结构体变量,如dma_handle_t dma_tx, dma_rx。
- 配置DMA句柄dma_tx及dma_rx中的参数,如指定Tx或RX通道。
- 将i2s_handler变量中的p_dmatx和p_dmarx指针分别指向已初始化的DMA句柄变量dma_tx和dma_rx。
- 配置DMA的中断优先级、使能DMA的NVIC中断。
- 配置I2S初始化结构体中的数据传输宽度、时钟源、音频频率。
- 调用hal_i2s_init()配置I2S寄存器,配置过程中hal_i2s_init()会自动调用开发者重写的hal_i2s_msp_init()函数初始化I2S所使用的GPIO等底层资源。
- 对于I2S的IO读写,支持三种操作方式:轮询、中断及DMA。
轮询方式的IO读写操作
- 以轮询方式发送大量数据时使用hal_i2s_transmit()。
- 以轮询方式接收大量数据时使用hal_i2s_receive()。
- 以轮询方式发送与接收大量数据时使用hal_i2s_transmit_receive()。
中断方式的IO读写操作
- 以中断非轮询方式发送大量数据时使用hal_i2s_transmit_it(),发送完成时回调函数hal_i2s_tx_cplt_callback()将会被调用。
- 中断非轮询方式接收大量数据时使用hal_i2s_receive_it(),发送和接收完成时回调函数hal_i2s_rx_cplt_callback()将会被调用。
- 中断非轮询方式发送与接收大量数据时使用hal_i2s_transmit_receive_it(),接收完成时回调函数hal_i2s_tx_rx_cplt_callback()将会被调用。
- 如果数据收发过程中发生了错误,则hal_i2s_error_callback()回调函数将会被调用。
- 如果需要中止数据收发,则可以使用hal_i2s_abort()。
说明:
对于上述回调函数,开发者均可通过重写函数完成指定的操作。
DMA方式的IO读写操作
- 作为主设备以DMA非轮询方式发送大量数据时使用hal_i2s_transmit_dma(),发送完成时回调函数hal_i2s_tx_cplt_callback()将会被调用。
- 作为主设备以DMA非轮询方式接收大量数据时使用hal_i2s_receive_dma(),接收完成时回调函数hal_i2s_rx_cplt_callback()将会被调用。
- 作为主设备以DMA非轮询方式发送与接收大量数据时使用hal_i2s_transmit_receive_dma(),接收完成时回调函数hal_i2s_tx_rx_cplt_callback()将会被调用。
- 如果数据收发过程中发生了错误,则hal_i2s_error_callback()回调函数将会被调用。
说明:
对于上述回调函数,开发者均可通过重写函数完成指定的操作。