Tx Polling

该示例通过使用 I2S 外设以轮询的方式实现数据发送功能。

将 I2S TX 引脚连接到逻辑分析仪,可以看到发送数据的波形。

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

将 EVB 上的 P3_2, P3_3 和 P4_0 连接逻辑分析仪。

其中 P3_2 为LRCK, P3_3 为 BCLK, P4_0 为 DATA。

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

  1. EVB 启动后, 通过逻辑分析仪观察 I2S 输出波形。I2S 输出波形如下图所示。

这里应该是I2S波形图片

I2S output 波形

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\i2s\tx_polling\proj

  • 源码路径: sdk\samples\peripheral\i2s\tx_polling\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX。

    void board_i2s_init(void)
    {
       Pad_Config(I2S_BCLK_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_LOW);
       Pad_Config(I2S_LRCK_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_LOW);
       Pad_Config(I2S_DATA_TX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
                   PAD_OUT_LOW);
    
       Pinmux_Config(I2S_BCLK_PIN, I2S_BCLK_PINMUX);
       Pinmux_Config(I2S_LRCK_PIN, I2S_LRCK_PINMUX);
       Pinmux_Config(I2S_DATA_TX_PIN, I2S_DATA_TX_PINMUX);
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 I2S 时钟。

  3. 对 I2S 外设进行初始化:

    1. 定义 I2S_InitTypeDef 类型 I2S_InitStruct ,调用 I2S_StructInit()I2S_InitStruct 预填默认值。

    2. 根据需求修改 I2S_InitStruct 参数。I2S 的初始化参数配置如下表。

    3. 调用 I2S_Init(),初始化 I2S 外设。

I2S 初始化参数

I2S Hardware Parameters

Setting in the I2S_InitStruct

I2S

Clock Source

I2S_InitTypeDef::I2S_ClockSource

I2S_CLK_40M

Sample Rate (Mi)

I2S_InitTypeDef::I2S_TxBClockMi

0x271

Sample Rate (Ni)

I2S_InitTypeDef::I2S_TxBClockNi

0x10

Device Mode

I2S_InitTypeDef::I2S_DeviceMode

I2S_DeviceMode_Master

Channel Type

I2S_InitTypeDef::I2S_TxChannelType

I2S_Channel_stereo

Data Width

I2S_InitTypeDef::I2S_TxDataWidth

I2S_Width_16Bits

Data Format

I2S_InitTypeDef::I2S_TxDataFormat

I2S_Mode

  1. 使能 I2S TX 功能。

    I2S_Cmd(I2S_NUM, I2S_MODE_TX, ENABLE);
    

功能实现

定义发送数据,调用 I2S_SendData() 循环发送数据。在逻辑分析仪内可以观察到 I2S 发送的数据。

void i2s_senddata(void)
{
   uint32_t i = 0x12348800;

   while (1)
   {
      if (I2S_GetTxFIFOFreeLen(I2S_NUM))
      {
            /* 16bit format, lower half word send first! */
            I2S_SendData(I2S_NUM, i++);
      }
   }
}