Tx Polling

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

外接逻辑分析仪可以看到发送数据的波形。

环境需求

该示例支持以下开发套件:

开发套件

Hardware Platforms

Board Name

RTL8752H HDK

RTL8752H EVB

更多信息请参考 快速入门

硬件连线

将 EVB 上的 P3_2(LRCK),P3_3(BCLK)和 P4_0(DATA)连接逻辑分析仪。

编译和下载

该示例的工程路径如下:

Project file: board\evb\io_sample\I2S\Tx_polling\mdk

Project file: board\evb\io_sample\I2S\Tx_polling\gcc

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 快速入门编译 APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bingcc\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 快速入门MP Tool 给出的步骤将 app bin 烧录至 EVB 内。

  5. 按下 reset 按键,开始运行。

测试验证

在逻辑分析仪观察 I2S 输出波形。I2S 输出波形如下图所示。

这里应该是I2S波形图片

I2S 输出波形

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

  • 工程路径: sdk\board\evb\io_sample\I2S\Tx_polling

  • 源码路径: sdk\src\sample\io_sample\I2S\Tx_polling

该工程的工程文件代码结构如下:

└── Project: tx_polling
    └── secure_only_app
        └── include
            ├── app_define.h
            └── rom_uuid.h
        ├── cmsis                    includes CMSIS header files and startup files
            ├── overlay_mgr.c
            ├── system_rtl876x.c
            └── startup_rtl876x.s
        ├── lib                      includes all binary symbol files that user application is built on
            ├── rtl8752h_sdk.lib
            ├── gap_utils.lib
            └── ROM.lib
        ├── peripheral               includes all peripheral drivers and module code used by the application
            ├── rtl876x_rcc.c
            ├── rtl876x_pinmux.c
            ├── rtl876x_nvic.c
            └── rtl876x_i2s.c
        ├── profile
        └── app                      includes the ble_peripheral user application implementation
            └── main.c

初始化

当 EVB 复位启动时,执行 main 函数,执行以下流程:

int main(void)
{
    extern uint32_t random_seed_value;
    srand(random_seed_value);
    __enable_irq();
    i2s_demo();

    while (1)
    {
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
    }
}

i2s_demo 中,包含了 PAD/PINMUX 设置,I2S 外设的初始化等流程。

void i2s_demo(void)
{
    board_i2s_init();
    driver_i2s_init();
    i2s_senddata();
}

board_i2s_init 为 PAD 与 PINMUX 设置,包含如下流程:

  1. 配置 PAD:设置引脚、PINMUX 模式、PowerOn、无内部上拉。

  2. 配置 PINMUX:分配引脚分别为 BCLK_SPORT0、LRC_SPORT0、DACDAT_SPORT0 功能。

driver_i2s_init 为对 I2S 外设的初始化,包含如下流程:

  1. 使能 RCC 时钟。

  2. 设置 I2S 时钟源为 40MHz。

  3. 设置采样率为 16kHz。

  4. 设置 I2S 为主设备模式。

  5. 设置 I2S 为双声道模式。

  6. 设置数据宽度和数据格式。

  7. 关闭 I2S DMA 传输。

  8. 使能 I2S TX 模式。

备注

BCLK=I2S_ClockSource*(I2S_BClockNi/I2S_BClockMi)=1024K,LRCK=BCLK/64=16K

void driver_i2s_init(void)
{
    RCC_PeriphClockCmd(APB_I2S, APB_I2S_CLOCK, ENABLE);

    I2S_InitTypeDef I2S_InitStruct;

    I2S_StructInit(&I2S_InitStruct);
    I2S_InitStruct.I2S_ClockSource      = I2S_CLK_40M;
    /* BCLK = 40MHz*(ni/mi),  LRCK = BCLK/64 */
    I2S_InitStruct.I2S_BClockMi         = 0x271;    /* <!LRCK = 16K */
    I2S_InitStruct.I2S_BClockNi         = 0x10;     /* <!BCLK = 1024K */
    I2S_InitStruct.I2S_DeviceMode       = I2S_DeviceMode_Master;
    I2S_InitStruct.I2S_ChannelType      = I2S_Channel_stereo;
    I2S_InitStruct.I2S_DataWidth        = I2S_Width_16Bits;
    I2S_InitStruct.I2S_DataFormat       = I2S_Mode;
    I2S_InitStruct.I2S_DMACmd           = I2S_DMA_DISABLE;
    I2S_Init(I2S_NUM, &I2S_InitStruct);
    I2S_Cmd(I2S_NUM, I2S_MODE_TX, ENABLE);
}

功能实现

定义发送数据,当 TX FIFO 不满时,执行 I2S_SendData() 循环发送数据。在逻辑分析仪内观察发送数据波形。

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++);
        }
    }
}