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
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译 APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下 reset 按键,开始运行。
测试验证
在逻辑分析仪观察 I2S 输出波形。I2S 输出波形如下图所示。

I2S 输出波形
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
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 设置,包含如下流程:
配置 PAD:设置引脚、PINMUX 模式、PowerOn、无内部上拉。
配置 PINMUX:分配引脚分别为 BCLK_SPORT0、LRC_SPORT0、DACDAT_SPORT0 功能。
driver_i2s_init
为对 I2S 外设的初始化,包含如下流程:
使能 RCC 时钟。
设置 I2S 时钟源为 40MHz。
设置采样率为 16kHz。
设置 I2S 为主设备模式。
设置 I2S 为双声道模式。
设置数据宽度和数据格式。
关闭 I2S DMA 传输。
使能 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++);
}
}
}