请选择 进入手机版 | 继续访问电脑版
查看: 2852|回复: 2

[分享] LPC55(s)XX系列I2S与TDM接口

[复制链接]

该用户从未签到

648

主题

6301

帖子

0

超级版主

Rank: 8Rank: 8

积分
19546
最后登录
2024-3-28
发表于 2021-6-16 11:01:12 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-6-16 11:03 编辑

随着单片机性能的提升,音频开发被广泛用于MCU开发中。有些客户在使用MCU进行音频开发时,需要将多个I2S模块合并到TDM流中,本文就主要针对LPC55(s)xx系列,讲解如何实现此功能。

1.    音频、I2S与TDM接口
       音频分为模拟音频与数字音频。麦克风输入音频为模拟音频,需要通过ADC才能被MCU采集。数字音频,无法直接驱动喇叭,必须通过MCU通过DAC转化成模拟音频,数字音频接口主要有I2S、TDM等。音频编解码器本质上为DAC与ADC芯片。
       以恩智浦开发板常用的WM8904为例,音频设备开发通常包括数据总线接口、控制总线接口、音频编解码器(Codec)、扬声器和麦克风等,如下:
1.png
I2S接口包括三个主要信号,分别为SCK,WS与DATA。SCK为位时钟,对应数字音频的每一位数据,SCK=2 x 采样频率 x 采样位数;WS为声道选择时钟,故WS= 采样频率;DATA为输入与输出的音频数据。WM8904工作时还需要一路主时钟MCLK,时钟频率为采样率的256或384倍,如下:
2.png

TDM(时分多路复用)是按传输信号的时间进行分割的,它使不同的信号在不同的时间内传送,将整个传输时间分为许多时间间隔,每个时间片被一路信号占用,可以理解为I2S的多路复用。

2.    LPC55(s)xx I2S接口共享功能
LPC55(s)XX系列I2S接口有信号共享功能,在不用外部连线的情况下,多个I2S接口可以共享同一个I2S接口的SCK,WS和DATA,增强了I2S接口使用的灵活性,且节省MCU引脚。
如下:
3.png

注:DATA input可以与DATA input共享,但是DATA output与DATA output之间是无法共享的,参考LPC55(s)xx用户手册:
4.JPG

每个Flexcomm都可以设置为I2S共享源,包括WS、SCK 和 DATA input.



每个Flexcomm都可以使用上面的共享源,借助FCxCTRLSEL 寄存器进行配置:



举个简单的例子,Flexcomm7为共享源,Flexcomm6分享Flecomm7的I2S信号,用SDK实现如下:
12.jpg
注意:不同型号MCU的I2S通道数略有差异。如LPC55(S)6x的每个Flexcomm有一个通道对,即两个通道,左声道与右声道,LPC55(S)1x的Flexcomm6与Flexcomm7有四个通道对,其他Flexcomm有一个通道对,请参看具体型号对应的手册。


3.    LPC55(s)ss TDM输出实验
以LPC55S69-EVK为例,由于每个Flexcomm只有两个I2S通道,需要两个Flexcomm才可以配置四通道。设置Flexcomm7为主机,Flexcomm2为从机,Flexcomm2同步Flexcomm7的SCK与WS。共享信号配置方法如下:

/* select signal source for share set */
    SYSCTL_SetShareSignalSrc(SYSCTL, kSYSCTL_ShareSet0, kSYSCTL_SharedCtrlSignalSCK, kSYSCTL_Flexcomm7);
    SYSCTL_SetShareSignalSrc(SYSCTL, kSYSCTL_ShareSet0, kSYSCTL_SharedCtrlSignalWS, kSYSCTL_Flexcomm7);
    /* select share set for special flexcomm signal */
    SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm7, kSYSCTL_FlexcommSignalSCK, kSYSCTL_ShareSet0);
    SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm7, kSYSCTL_FlexcommSignalWS, kSYSCTL_ShareSet0);
    SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm2, kSYSCTL_FlexcommSignalSCK, kSYSCTL_ShareSet0);
SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm2, kSYSCTL_FlexcommSignalWS, kSYSCTL_ShareSet0);


设置信号共享引脚,由于DATA output引脚无法共享,需要将Flexcomm7与Flexcomm2的DATA output引脚外部连接输出,如下:
9.JPG

设置Flexcomm7为主机:s_TxConfig.masterSlave =kI2S_MasterSlaveNormalMaster;
设置Flexcomm2为从机:s_TxConfig.masterSlave = kI2S_MasterSlaveNormalSlave;


I2S与TDM模式支持帧位置配置,有四种模式,简单介绍两种,如下:
10.JPG
此实验中,使用第一种。


设置Flexcomm7与Flexcomm2为Classic I2S模式:
    s_TxConfig.mode = kI2S_ModeI2sClassic;
设置帧长度为四个通道长度,每个通道数据为16位:
     s_TxConfig.frameLength = 16 *4;

设置Flexcomm7数据起始位置为0:    s_TxConfig.position = 0;
设置Flexcomm2数据起始位置为16:   s_TxConfig.position = 16;

Flexcomm7传输的数据为:
{0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0x07U, 0xDCU, 0x0EU}
Flexcomm2传输的数据为:
{0x55U, 0x55U, 0x55U, 0x55U, 0x55U, 0x55U, 0x55U,0x55U, 0x55U, 0x55U}

如下为逻辑分析仪捕捉到的四通道TDM数据输出结果:
11.jpg

帧格式为:通道一,Flexcomm7中0~15位;通道二,Flexcomm2中0~15位;通道三,Flexcomm7中16~31位;通道四,Flexcomm2中16~31位。

测试工程可以从附件下载,基于MCUXpresso IDE v11.3.1.




I2S_TDM_LPC55.zip

6.98 MB, 下载次数: 32, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    慵懒
    2021-12-23 09:57
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    5

    主题

    3046

    帖子

    23

    金牌会员

    Rank: 6Rank: 6

    积分
    8183
    最后登录
    2024-3-28
    发表于 2021-6-18 22:34:23 | 显示全部楼层
    很好,支持一下!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    注册会员

    Rank: 2

    积分
    113
    最后登录
    2024-3-19
    发表于 2023-3-30 15:43:04 | 显示全部楼层
    想请教一下,逻辑分析仪最后抓的 DATA 脚波形,是将 Flexcomm7 DATA 脚 和 Flexcomm2 DATA 脚 短接在一起测的吗?是 TDM 内需要多少 channel 就需要多少组 Flexcomm DATA 脚吗?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 05:45 , Processed in 0.122476 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表