查看: 468|回复: 2

[求助] lpc55s28 dma0 如何修改传输格式

[复制链接]
  • TA的每日心情

    2024-12-31 10:51
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    6

    帖子

    0

    注册会员

    Rank: 2

    积分
    56
    最后登录
    2025-3-24
    发表于 2025-3-4 14:13:02 | 显示全部楼层 |阅读模式
    各位恩智浦开发者的老师们,你们好,我是一名恩智浦,我在使用LPC55S28 实现DMA 传输I2S的数据,我发现恩智浦官方sdk的I2S 使用DMA传输是16位,我不知道怎么修改成24位,麻烦各位老师指点我们一下。谢谢(鞠躬)。另外附上一部分代码
    //I2S的配置
    I2S_TxGetDefaultConfig(&s_TxConfig);
                    s_TxConfig.divider     = DEMO_I2S_CLOCK_DIVIDER;
                    s_TxConfig.masterSlave = DEMO_I2S_TX_MODE;
                    s_TxConfig.dataLength  = DataLenth;
                    s_TxConfig.frameLength = FrameLength;
                    s_TxConfig.leftJust    = false;
                    I2S_TxInit(DEMO_I2S_TX, &s_TxConfig);

                    I2S_RxGetDefaultConfig(&s_RxConfig);
                    s_RxConfig.divider     = DEMO_I2S_CLOCK_DIVIDER;
                    s_RxConfig.masterSlave = DEMO_I2S_RX_MODE;
                    s_RxConfig.dataLength  = DataLenth;
                    s_RxConfig.frameLength = FrameLength;
                    s_RxConfig.leftJust    = false;
                    I2S_RxInit(DEMO_I2S_RX, &s_RxConfig);

                    PRINTF("AUDIO Loopback started!\r\n");
                    PRINTF("Headphones will play what is input into Audio Line-In connector.\r\n");
    //                        PRINTF("CLOCK_GetPll0OutFreq = %d\r\n", CLOCK_GetPll0OutFreq);

                    s_RxTransfer.data     = &s_Buffer[0];
                    s_RxTransfer.dataSize = sizeof(s_Buffer);
    //                        s_TxTransfer.data     = &s_Buffer[0];
    //                        s_TxTransfer.dataSize = sizeof(s_Buffer);

    #if I2S_24BIT
    //  24位
                    s_TxTransfer.data     = &sin_24bit[0];
                    s_TxTransfer.dataSize = sizeof(sin_24bit);
    #else
    //  16位
                    s_TxTransfer.data     = &sin_16bit[0];
                    s_TxTransfer.dataSize = sizeof(sin_16bit);
    #endif


    //DMA0 的配置
    #if DMA_Transfer

                    DMA_Init(DEMO_DMA);

                    DMA_EnableChannel(DEMO_DMA, DEMO_I2S_TX_CHANNEL);
                    DMA_EnableChannel(DEMO_DMA, DEMO_I2S_RX_CHANNEL);
                   
                    DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S_TX_CHANNEL, kDMA_ChannelPriority2);
                    DMA_SetChannelPriority(DEMO_DMA, DEMO_I2S_RX_CHANNEL, kDMA_ChannelPriority3);
                   
                    DMA_CreateHandle(&s_DmaTxHandle, DEMO_DMA, DEMO_I2S_TX_CHANNEL);
                    DMA_CreateHandle(&s_DmaRxHandle, DEMO_DMA, DEMO_I2S_RX_CHANNEL);
                   
                    I2S_TxTransferCreateHandleDMA(DEMO_I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_TxTransfer);
                    I2S_TxTransferCreateHandleDMA(DEMO_I2S_RX, &s_RxHandle, &s_DmaRxHandle, RxCallback, (void *)&s_RxTransfer);
           
    // 这个屏蔽掉 帧时钟LRCK 位时钟BCLK 会失效
                    /* need to queue two transmit buffers so when the first one
                     * finishes transfer, the other immediatelly starts */
                    I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
                    I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
           
              //I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
                    I2S_RxTransferReceiveDMA(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);
                    I2S_RxTransferReceiveDMA(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);

    #else   //I2S传输
    // 这个屏蔽掉 帧时钟LRCK 位时钟BCLK 会失效
                    I2S_TxTransferCreateHandle(DEMO_I2S_TX, &s_TxHandle, TxCallback, (void *)&s_TxTransfer);
                    I2S_RxTransferCreateHandle(DEMO_I2S_RX, &s_RxHandle, RxCallback, (void *)&s_RxTransfer);

                    I2S_RxTransferNonBlocking(DEMO_I2S_RX, &s_RxHandle, s_RxTransfer);
                    I2S_TxTransferNonBlocking(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
    #endif       


    //另外附加我的工程代码


    我知道答案 目前已有2人回答

    usb_new(3).zip

    803.67 KB, 下载次数: 0, 下载积分: 威望 1

    USB hid
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3895

    主题

    7506

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39550
    最后登录
    2025-7-29
    发表于 2025-3-4 14:57:16 | 显示全部楼层
    I2S模块配置
    修改数据位宽和帧格式,在I2S_TxConfig和I2S_RxConfig中需明确配置24位模式:
    // 修改I2S配置结构体的dataLength和frameLength
    s_TxConfig.dataLength  = 24;    // 每个数据字的有效位数
    s_TxConfig.frameLength = 64;    // 每帧总位数 = 2声道 * 24位 + 填充位(可配置为32*2)
    s_TxConfig.leftJust    = true;  // 左对齐模式下更易处理24位数据
    s_RxConfig.dataLength  = 24;
    s_RxConfig.frameLength = 64;
    s_RxConfig.leftJust    = true;
    或者你可以看看:
    在MCUXpresso IDE中使用Pin Tool重新生成I2S引脚配置
    对比SDK中的driver_examples/i2s/dma示例,观察24位模式差异点
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-12-31 10:51
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    6

    帖子

    0

    注册会员

    Rank: 2

    积分
    56
    最后登录
    2025-3-24
     楼主| 发表于 2025-3-4 16:38:40 | 显示全部楼层
    NXP管管 发表于 2025-3-4 14:57
    I2S模块配置
    修改数据位宽和帧格式,在I2S_TxConfig和I2S_RxConfig中需明确配置24位模式:
    // 修改I2S配置 ...

    您好,谢谢您的回复,我的代码单独使用I2S发送数据,数据波形是正常的,但换成DMA发送之后,波形改变了,所以我才怀疑是DMA的问题。
    USB hid
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-29 14:35 , Processed in 0.088698 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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