本帖最后由 小恩GG 于 2025-10-15 18:14 编辑
基于 CS42448 音频板和MIMXRT170-EVKB实现SAI1模块4 个 TX 数据传输 一 简介 本项目聚焦于利用i.MX RT1170 跨界双核 MCU及CS42448 音频扩展板,通过SAI1 模块的 4 个 TX 数据线达成特定音频播放功能。i.MXRT1170 凭借其实时性能与高集成度,广泛应用于汽车、工业及物联网等领域。其中,Arm®Cortex® - M7 运行频率可达1GHz,且配备 2MB片上 RAM,并提供多样存储器接口与丰富连接接口。该芯片具备多种音频接口,涵盖SAI - 1、SAI - 2、SAI - 3、SAI - 4、PDM、ASRC、SPDIF 和 MQS 等。 本文详细阐述基于RT1170 EVKB 开发板搭配CS42448 Audio Card,借助 SAI1模块 的 4 个 TX 数据线输出 8 个声道音频的具体实现过程,同时介绍如何生成适配SDK 例程需求的 8 声道音频数据。 CS42448 Audio Card 可直接连接RT1170 EVKB 板卡,开发者可在该开发平台上开展更为复杂的音频应用开发。NXPSDK 库提供的“evkbmimxrt1170_sai_edma_multi_channel_transfer_cm7” 例程,默认启用两路数据传输通道(TX_DATA0 和TX_DATA1),运行时可在CS42448 Audio Card 的 J6 和 J7 接口听到1KHZ 正弦波音频信号。然而,当客户需求升级为启用TX_DATA0、TX_DATA1、TX_DATA2、TX_DATA3四个数据线,且各数据线需输出不同音频时,该如何实现呢?本文将围绕此场景展开深入探讨与实践验证。 2 SAI简介 (一)RT1170芯片 SAI 模块特性 查阅 IMXRT170RM 数据手册可知,SAI2、SAI3、SAI4 模块的输入输出仅各有 1 根数据线,而 SAI1 模块的输入输出则拥有 4 根数据线,这意味着唯有 SAI1 模块支持多数据线通信传输。 也就是说只有IMXRT170芯片的SAI1模块支持多数据线通信传输,那是否RT1170SAI1同时支持4根Rx数据线和4根Tx数据线呢,答案是不支持的。 请看下面IMXRT1170RM数据手册描述。 SAI1 并非同时支持4 根 Rx 数据线和 4 根 Tx 数据线,其数据线引脚分配存在多种选项,部分Rx 和 Tx 数据线相互复用,即同一引脚只能配置为Rx 或 Tx,且 Rx 数据线与 Tx 数据线总数相加不超过5 。在使用SAI1 模块进行多数据线场景开发时,开发者一定要关注这一限制条件。 (二)本方案的配置要点 本文采用 4 根 Tx 数据线的方案,需要正确配置一个很重要的寄存器TransmitConfiguration 3 (TCR3) TCE 根据 IMXRT1170RM Table 54 - 2 选取 Option0 进行引脚配置。为实现SAI1 模块的 4 个 Tx 数据线传输,关键在于正确配置Transmit Configuration 3 (TCR3) 寄存器的TCE 位。具体而言,SAI1模块 TCR3 寄存器的第16bit、17bit、18bit、19bit 分别对应使能TX_DATA0、TX_DATA1、TX_DATA2、TX_DATA3。若要实现 4 个 Tx 数据线传输,需将SAI1 TCR3[19 - 16]设置为 1111。同理,若需配置多个Rx 数据线传输,则需相应设置寄存器SAI1 RCR3[19 - 16] RCE。 三、硬件准备工作 (一)硬件开发环境准备清单 - Mini/micro USB 线缆
- MIMXRT1170 - EVKB 开发板
- 个人电脑
- 耳机(OMTP 标准)
- CS42448 音频板
(二)MIMXRT1170 - EVKB 开发板硬件改动- 焊接电阻:请焊接电阻 R2008、R2022、R2011、R2021、R2009、R2010、R2012、R2016、R1998、R2013、R2014、R2018、R2017、R2000。
- 移除电阻:拆除电阻 R2001、R2002、R2003、R2004、R2005、R2006 和 R2007。
由于硬件变更较多,在进行后续程序验证前,请仔细检查硬件变更的准确性,确保无误后再进行下一步操作。完成硬件改动后,将CS42448 音频扩展板连接至MIMXRT1170 - EVKB 的 J76 接口。 四、音源准备工作 本文选用功能强大且免费的Audiocity 音频编辑软件,将音源从MP3 格式转换为.wav格式。鉴于本项目旨在演示SAI1 模块的 4 个 TX 数据线,每根Tx 数据线需传输 2个声道音源数据,因此共需准备8 个声道的音源。 (一)音源分配策略 我使用Audiocity,生成了多路音频声道,其中HelloWorld 为单声道,故对其进行复用处理。具体分配如下: - TX_DATA0:传输 HelloWorld,对应Channel1 和Channel5。
- TX_DATA1:传输 Audio1,Audio1左声道传输Channel2,Audio1右声道传输Channel6。
- TX_DATA2:传输 Audio2,Audio2左声道传输Channel3,Audio2右声道传输Channel7。
- TX_DATA3:传输 Audio3,Audio3左声道传输Channel4 ,Audio3右声道传输Channel8。
对应在CS42448 音频扩展板上,J6播放TX_DATA0(即HelloWorld 音频内容),J7播放Audio1,J8 播放Audio2,J9 播放Audio3。
(二)音频格式要求 转换后的.wav格式需与 NXPSDK lib 中例程格式保持一致。查看“evkbmimxrt1170_sai_edma_multi_channel_transfer_cm7” 例程可知,音频格式为 48KHz 采样率、16bit 位宽。在使用 Audiocity 软件转换时,务必确保参数设置与此一致。 (三)音源数据处理 使用WinHex 将生成的HelloWorld - 8 - channel.wav 文件转换成C 语言数组。需注意,SDK例程使用的是Raw data。完成转换后,即可得到所需的音源转换后的C 语言数组。 感兴趣的同学可以参考我之前发布的一篇文章中的第二章和第三章内容。 五、软件修改工作 (一)配置SAI1 模块寄存器 如前文所述,要实现 SAI1 的 4 个 Tx 数据线传输,需设置 SAI1 模块寄存器 TCR3 的 TCE 位。在 NXP SDK 库代码中,可通过修改 DEMO_SAI_CHANNEL_MASK 宏定义,设置 I2S 模式配置 saiConfig,函数 SAI_TransferSendEDMA 中会对 TCR3 TCE 寄存器进行相应设置。 (二)替换音源数据及修改宏定义 将音源准备步骤中生成的C 语言数组内容复制替换原SDK例程music.h文件中的uint8_t music[]数组内容。同时,修改宏定义MUSIC_LEN,其长度应为music[]字节长度,且为1600 的倍数。 完成上述所有操作后,编译并烧写程序至MIMXRT1170 - EVKB 开发板。此时,使用耳机连接CS42448 音频扩展板上的J6 接口,即可听到HelloWorld 音频内容;连接J7 接口,可听到Audio1音频内容;连接J8 接口,可听到Audio2音频内容;连接J9 接口,可听到Audio3音频内容。 下图就是本文硬件开发环境,因没有足够的耳机线,故只连接了J6和J9。 六、结论总结 本项目成功基于 CS42448 音频扩展板和MIMXRT170-EVKB开发板实现SAI1模块4 个 TX 数据线传输功能,通过CS42448 的物理接口(J6~J9),各 TX 数据线能独立输出差异化音频内容,满足复杂音频场景需求。
|