This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用6748的MCASP传输4路音频该怎么设置。

static void McASPI2SConfigure(void)
{
    McASPRxReset(SOC_MCASP_0_CTRL_REGS);
    McASPTxReset(SOC_MCASP_0_CTRL_REGS);
    /* Enable the FIFOs for DMA transfer
     * 启用FIFO进行DMA传输*/
    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 4, 1);
    McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 4, 1);
    /* Set I2S format in the transmitter/receiver format units
     * 以收发格式为单位设定i2s格式,在发送器/接收器单元的格式设定I2S格式*/
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
                     MCASP_RX_MODE_DMA);
    McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
                     MCASP_TX_MODE_DMA);
    /* Configure the frame sync. I2S shall work in TDM format with 2 slots*/
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 8, MCASP_RX_FS_WIDTH_WORD,
                        MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);//帧同步的信号设置,外部,上升沿
    McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 8, MCASP_RX_FS_WIDTH_WORD,
    MCASP_TX_FS_INT_BEGIN_ON_FALL_EDGE);//帧同步的信号设置,内部,上升沿
    /* configure the clock for receiver*/
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);//外部时钟
    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
                          0x00, 0xFF);
    /* configure the clock for transmitter
     * 
     */
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_MIXED, 11, 0);
    McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
    McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
                          0x00, 0xFF);
    /* Enable synchronization of RX and TX sections
    //McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
    /* Enable the transmitter/receiver slots. I2S uses 2 slots
   */
    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
    McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
    /*
    ** Set the serializers, Currently only one serializer is set as
    ** transmitter and one serializer as receiver.
    */
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX1);
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX1);
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX2);
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX2);
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX3);
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX3);
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX4);
    McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX4);
    /*
    ** Configure the McASP pins
    ** Input - Frame Sync, Clock and Serializer Rx
    ** Output - Serializer Tx is connected to the input of the codec
    */
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);//设置McASP引脚用于McASP功能
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(MCASP_XSER_TX1)
    | MCASP_PIN_AFSX
    | MCASP_PIN_ACLKX);//将McASP引脚配置为输出引脚。
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(MCASP_XSER_TX2)
    | MCASP_PIN_AFSX
    | MCASP_PIN_ACLKX);
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(MCASP_XSER_TX3)
    | MCASP_PIN_AFSX
    | MCASP_PIN_ACLKX);
    McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(MCASP_XSER_TX4)
    | MCASP_PIN_AFSX
    | MCASP_PIN_ACLKX);
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR
                                               | MCASP_PIN_ACLKR
                                               | MCASP_PIN_AXR(MCASP_XSER_RX1));
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR
                                               | MCASP_PIN_ACLKR
                                               | MCASP_PIN_AXR(MCASP_XSER_RX2));
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR
                                               | MCASP_PIN_ACLKR
                                               | MCASP_PIN_AXR(MCASP_XSER_RX3));
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR
                                               | MCASP_PIN_ACLKR
                                               | MCASP_PIN_AXR(MCASP_XSER_RX4));
    /* Enable error interrupts for McASP 
    McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
                                            | MCASP_TX_CLKFAIL
                                            | MCASP_TX_SYNCERROR
                                            | MCASP_TX_UNDERRUN);
    McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
                                            | MCASP_RX_CLKFAIL
                                            | MCASP_RX_SYNCERROR
                                            | MCASP_RX_OVERRUN);
}
这样对不对。还有edma3怎么弄
  • */
        McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX1);
        McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX1);
        McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX2);
        McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX2);
        McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX3);
        McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX3);
        McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX4);
        McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX4);
        /*

    这个对照下面的源码,是不是后一个把前一个覆盖了啊。MCASP_XSER_RX1, MCASP_XSER_TX1是在哪定义的?

    /**
    * \brief Sets a serializer as transmitter
    *
    * \param baseAddr Base Address of the McASP Module Registers.
    * \param serNum Serializer which is to be used as Transmitter.
    *
    * \return None.
    *
    **/
    void McASPSerializerTxSet(unsigned int baseAddr, unsigned int serNum)
    {
    HWREG(baseAddr + MCASP_SRCTL(serNum)) &= ~MCASP_SRCTL0_SRMOD;
    HWREG(baseAddr + MCASP_SRCTL(serNum)) |= MCASP_SRCTL_SRMOD_TX;

    }

    /**
    * \brief Sets a serializer as receiver
    *
    * \param baseAddr Base Address of the McASP Module Registers.
    * \param serNum Serializer which is to be used as Receiver.
    *
    * \return None.
    *
    **/
    void McASPSerializerRxSet(unsigned int baseAddr, unsigned int serNum)
    {
    HWREG(baseAddr + MCASP_SRCTL(serNum)) &= ~MCASP_SRCTL0_SRMOD;
    HWREG(baseAddr + MCASP_SRCTL(serNum)) |= MCASP_SRCTL_SRMOD_RX;

    }

    多通道的配置对于单通道来说,仅仅是使能多个数据线就好了。

    关于EDMA的配置,参考下面截图的说明:

  • 您好,我的定义是这样的

    /* 用于接收的串行器 */
    #define MCASP_XSER_RX1 (0u)
    #define MCASP_XSER_RX2 (2u)
    #define MCASP_XSER_RX3 (4u)
    #define MCASP_XSER_RX4 (6u)

    /* 用于发送的串行器 */
    #define MCASP_XSER_TX1 (1u)
    #define MCASP_XSER_TX2 (3u)
    #define MCASP_XSER_TX3 (5u)
    #define MCASP_XSER_TX4 (7u)

    我的理解是这样,您看对吗。

    如果用TDM传输方式,就只用配置两个串行器,一个用于接收8个通道,一个用于发送处理完的8个通道。

    如果用I2S传输方式,就需要配置八个串行器,每个传输2个通道(左右)。