[DemoCode下载] PDMA传递I2S

[复制链接]
 楼主| xinxianshi 发表于 2024-5-18 21:41 | 显示全部楼层 |阅读模式
I2S, pd, DMA, DM
  1. // Configure PDMA to Scatter Gather mode */
  2. void PDMA_Init(void)
  3. {
  4.     /* Tx description */
  5.     DMA_TXDESC[0].ctl = ((BUFF_LEN-1)<<PDMA_DSCT_CTL_TXCNT_Pos)|PDMA_WIDTH_32|PDMA_SAR_INC|PDMA_DAR_FIX|PDMA_REQ_SINGLE|PDMA_OP_SCATTER;
  6.     DMA_TXDESC[0].src = (uint32_t)&PcmTxBuff[0];
  7.     DMA_TXDESC[0].dest = (uint32_t)&I2S0->TXFIFO;
  8.     DMA_TXDESC[0].offset = (uint32_t)&DMA_TXDESC[1] - (PDMA->SCATBA);

  9.     DMA_TXDESC[1].ctl = ((BUFF_LEN-1)<<PDMA_DSCT_CTL_TXCNT_Pos)|PDMA_WIDTH_32|PDMA_SAR_INC|PDMA_DAR_FIX|PDMA_REQ_SINGLE|PDMA_OP_SCATTER;
  10.     DMA_TXDESC[1].src = (uint32_t)&PcmTxBuff[1];
  11.     DMA_TXDESC[1].dest = (uint32_t)&I2S0->TXFIFO;
  12.     DMA_TXDESC[1].offset = (uint32_t)&DMA_TXDESC[0] - (PDMA->SCATBA);   //link to first description

  13.     /* Rx description */
  14.     DMA_RXDESC[0].ctl = ((BUFF_LEN-1)<<PDMA_DSCT_CTL_TXCNT_Pos)|PDMA_WIDTH_32|PDMA_SAR_FIX|PDMA_DAR_INC|PDMA_REQ_SINGLE|PDMA_OP_SCATTER;
  15.     DMA_RXDESC[0].src = (uint32_t)&I2S0->RXFIFO;
  16.     DMA_RXDESC[0].dest = (uint32_t)&PcmRxBuff[0];
  17.     DMA_RXDESC[0].offset = (uint32_t)&DMA_RXDESC[1] - (PDMA->SCATBA);

  18.     DMA_RXDESC[1].ctl = ((BUFF_LEN-1)<<PDMA_DSCT_CTL_TXCNT_Pos)|PDMA_WIDTH_32|PDMA_SAR_FIX|PDMA_DAR_INC|PDMA_REQ_SINGLE|PDMA_OP_SCATTER;
  19.     DMA_RXDESC[1].src = (uint32_t)&I2S0->RXFIFO;
  20.     DMA_RXDESC[1].dest = (uint32_t)&PcmRxBuff[1];
  21.     DMA_RXDESC[1].offset = (uint32_t)&DMA_RXDESC[0] - (PDMA->SCATBA);   //link to first description

  22.     /* Open PDMA channel 1 for I2S TX and channel 2 for I2S RX */
  23.     PDMA_Open(PDMA,0x3 << 1);

  24.     /* Configure PDMA transfer mode */
  25.     PDMA_SetTransferMode(PDMA,1, PDMA_I2S0_TX, 1, (uint32_t)&DMA_TXDESC[0]);
  26.     PDMA_SetTransferMode(PDMA,2, PDMA_I2S0_RX, 1, (uint32_t)&DMA_RXDESC[0]);

  27.     /* Enable PDMA channel 1&2 interrupt */
  28.     PDMA_EnableInt(PDMA,1, 0);
  29.     PDMA_EnableInt(PDMA,2, 0);

  30.     NVIC_EnableIRQ(PDMA_IRQn);
  31. }


 楼主| xinxianshi 发表于 2024-5-18 22:09 | 显示全部楼层
另外就是配置I2S了。
  1.     /* Open I2S0 interface and set to slave mode, stereo channel, I2S format */
  2.     I2S_Open(I2S0, I2S_MODE_SLAVE, 16000, I2S_DATABIT_16, I2S_DISABLE_MONO, I2S_FORMAT_I2S);

  3.     /* Set PE.13 low to enable phone jack on NuMaker board. */
  4.     SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE13MFP_Msk);
  5.     GPIO_SetMode(PE, BIT13, GPIO_MODE_OUTPUT);
  6.     PE13 = 0;

  7.     // select source from HXT(12MHz)
  8.     CLK_SetModuleClock(I2S0_MODULE, CLK_CLKSEL3_I2S0SEL_HXT, 0);

  9.     /* Set MCLK and enable MCLK */
  10.     I2S_EnableMCLK(I2S0, 12000000);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部