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.

[参考译文] RTOS/TDA3XEVM:用于 TLV320AIC3109音频编解码器的自有驱动程序

Guru**** 1489625 points
Other Parts Discussed in Thread: REG102, REG101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/651366/rtos-tda3xevm-own-driver-for-tlv320aic3109-audio-codec

器件型号:TDA3XEVM
主题中讨论的其他器件:REG102REG101

工具/软件:TI-RTOS

大家好,

我正在使用 TDA3XX 作为参考板的定制板上工作,它具有音频编解码器 TLV320AIC3109。 我知道 TDA3xx 不支持 McASP 驱动程序。

我想知道,我们可以通过任何方式为 TDA3XX 音频支持编写自己的驱动程序/代码 ,以支持给定的音频编解码器。  我还想知道我们是否可以引用任何代码并开始编写驱动程序

谢谢和此致,

V.B.Surendar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Surendar、

    请检查此主题是否能帮助您:
    e2e.ti.com/.../2366089

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!


    感谢您分享该主题。

    我已经完成了该主题。 我的怀疑是,有一个用于 TDA2X 的 Starterware 音频的示例程序。 我想知道是否可以将该代码移植到定制的 TDA3xx 板[具有音频编解码器]中进行检查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、

    Starterware 专家将在此处收到通知并直接发表评论。

    此致、
    Mariya
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Surendar、

    我们在 starterware 中有一个示例、该示例支持 tda2xx 板上存在的 aic3106编解码器。
    它是您所使用的同一系列的编解码器、但在移植时、您可能需要检查它们之间的差异。

    此致、
    Prasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Prasad、您好!

    我们使用的是 aic3109编解码器,我想知道我需要在 starterware 示例中进行哪些更改才能移植到 TDA3XX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Surendar、

    请参阅以下帖子。
    e2e.ti.com/.../2378559

    我提到了将示例移植到 Tda3xx 所需的步骤。

    此致、
    Prasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Prasad,

    我已经按照您在帖子中提到的那样,在同一参考程序中进行了更新,并且我已经为 tda3xx 进行了编译。

    但应用程序映像卡在"McASPTxClkStart"函数之前,并且我也没有获得 音频的任何输入主时钟。

    请就此向我提供帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Prasad,

    是否有任何更新
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Surendar、

    您能否分享您在应用程序中所做的更改?

    此致、
    Prasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Prasad,

    我使用的是 mcasp2引脚,我在这里添加了 pinmux 和 prcm 使能,因此请在下面找到附带的代码。

    /*********
    **                     内部宏定义
    秘书长的报告 /
    /*在检查 I2C 读取和写入值时将宏调试更改为1 */
    #define 调试                            (0)

    #define SOC_MCASP_3_FIFO_REGS            (SOC_MCASP2_CFG_BASE + 0x1000)

    /*
    **可配置的值
    *
    /*用于发送/接收数据的时隙大小*/
    #define SLOT_SIZE                        (32U)

    /*用于发送/接收数据的字大小。 字大小<=插槽大小*/
    #define WORD_SIZE                        (32U)

    /*通道数、L 和 R */
    #define NUM_I2S_CHANNELS                 (2U)

    /*串行器数量*/
    #define NUM_OF_serializer                (1U)

    /*每个音频缓冲器要使用的样本数*/
    #define NUM_SAMESS_PER_AUDIO_BUF        (96U)

    /*指定参数集起始位置*/
    #define PAR_ID_START                     (72U)

    // McASP 串行器0用于发送*/
    #define MCASP_XSER_TX_0                  (0U)

    /*
    **下面的宏是根据上述输入计算的
    *
    #define I2S_SLOTS                        ((1 << NUM_I2S_CHANNELS)- 1)

    define bytes_per_sample"                 ((word_size >> 3)\
                                              * NUM_OF_serializer)

    #define AUDIO_BUF_SIZE                   (NUM_SAMESS_PER_AUDIO_BUF \
                                              * bytes_per_sample")

    #define PAR_TX_START                     (PAR_ID_START)

    /*
    ** EMDA 参数集大小
    *
    #define Size_ParamSet                    (32U)

    /*
    **根据应用程序要求可配置的定义
    *
    #define MCASP_ACLKX_CLKXDIV_VALUE        (0x6U)
    #define MCASP_AHCLKX_HCLKXDIV_VALUE      (0x9U)

    /*
    **音频编解码器 I2C 从地址
    *
    #IF 定义(SOC_TDA2EX)
    #define AUDIO_CODE_SLAVE_ADDR           (0x18)
    其他
    /*
     *对于 TDA2xx 修订版 G 或更高版本的电路板、如果 SW8引脚2打开、则编解码器
     *地址将为0x19、如果 SW8引脚2关闭、则编解码器地址将为0x18。
     *在较低版本的电路板上、编解码器地址固定为0x18。
     *
     *如果连接了10英寸 LCD、则地址0x18与冲突
     * STM 触摸屏。 因此、在修订版 G 和更高版本上、使用0x19作为编解码器的默认地址
     *
     *如果此操作失败、要确定编解码器应用程序的地址、将首先探测0x19
     *假设未连接10英寸 LCD、则探测0x18以获取备用地址。
     *
     *
    #define AUDIO_CODE_SLAVE_ADDR           (0x18)
    #define AUDIO_CODE_SLAVE_ADDR_1         (0x18)
    #endif

    #define GPIO_IO_EXPANDER_SLAVE_ADDR      (0x26)

    /*
    ** EDMA 完成中断编号
    *
    #define EDMA3_CC_Xfer_Complete_INT_A15               (12U)
    #define EDMA3_CC_Xfer_Complete_INT_DSP               (38U)

    #ifdef __ARM_ARCH_7A__
    #define EDMA3_CC_XFER_Complete_INT EDMA3_CC_XFER_Complete_INT_A15
    #elif defed _TMS320C6x
    #define EDMA3_CC_Xfer_Complete_INT EDMA3_CC_Xfer_Complete_INT_DSP
    #endif

    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_MASK    (0x00FF0000U)
    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_SHIFT   (0x00000010U)
    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_RESETVAL (0x000000000000)

    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_0_MASK    (0x000000FFU)
    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_0_SHIFT   (0x000000000000U)
    #define INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_0_RESETVAL (0x000000000000)

    #define EDMA3_MAX_cross_bar_events_TI814X            (230U)

    #define EDMA3_EVENT_MUX_REG_BASE_ADDR                (0x4a002c78)

    /*:w

    **根据要使用的内核可配置的定义
    *
    #define EDMA3_CHA_MCASP3_TX              (1)

    #define EDMA3_CC_REGASE_A15              (0U)
    #define EDMA3_CC_REGION DSP              (2U)

    #define EDMA3_CC_queue                   (0U)

    #define MCASP3_RX_DMA_XBAR_INST          (132U)
    #define MCASP3_TX_DMA_XBAR_INST          (133U)

    #define I2S_MODE (                         2U)

    void sampleDelay (int32_t delay);

    /*********
    **                     结构定义
    秘书长的报告 /
    typedef 结构{
       volatile unsigned int tPCC_EVTMUX[32];
    } IntmuxRegs;

    /*********
    **                     内部函数原型
    秘书长的报告 /
    静态空 EDMA3IntSetup (空);
    静态空 I2SDMAParamInit (空);
    静态空 McASPI2SConfigure (void);
    静态空 I2SDataTxActivate (空);
    静态空 EDMA3CCComplisr (空*虚拟);
    void PlatformMCASP3PrcmEnable (void);

    /*I2C Init*/
    void i2c_init (LLD_Hs2cInstId_t instId);

    /*I2C 去 Init */
    void i2c_deinit();

    LLD_hsi2cErrorCode_t I2CWrite (uint8_t address、uint8_t data);
    LLD_hsi2cErrorCode_t I2CWrite1 (uint8_t 地址、uint8_t 数据);
    LLD_hsi2cErrorCode_t I2C_read (uint8_t 地址、uint8_t *数据);
    LLD_hsi2cErrorCode_t I2CWriteBf (uint8_t regAddr、uint8_t bfPosition、
                                   uint8_t bfSize、
                                   uint8_t bfData);

    /*DAC 初始化*/
    static void aic31InitDac();

    /*编解码器初始化*/
    静态空 aic31MdCreateChan ();

    静态 LLD_hsi2cErrorCode_t updateAudioCodecAddr (void);

    /*********
    **                     内部变量定义
    秘书长的报告 /

    typedef volatile IntmuxRegs * IntmuxRegsOvly;

    /* I2C 传输缓冲器*/
    uint8_t       DATA_TX[4];

    /* I2C 接收缓冲器*/
    uint8_t       DATA_Rx[4];

    int16_t       _sineWavePattern []=

       0x0000、0x0000、0x10b4、0x10b4、0x2120、 0x2120、0x30fb、0x30fb、0x3fff、
       0x3fff、0x4dea、0x4dea、0x5a81、0x5a81、 0x658b、0x658b、
       0x6ed8、0x6ed8、0x763f、0x763f、0x7ba1、 0x7ba1、0x7e5、0x7e5、0x7ffd、
       0x7ffd、0x7e5、0x7e5、0x7ba1、0x7ba1、 0x76ef、0x76ef、
       0x6ed8、0x6ed8、0x658b、0x658b、0x5a81、 0x5a81、0x4dea、0x4dea、0x3fff、
       0x3fff、0x30fb、0x30fb、0x2120、0x2120、 0x10b4、0x10b4、
       0x0000、0x0000、0xef4c、0xef4c、0xdee0、 0xdee0、0xcf06、0xcf06、0xc002、
       0xc002、0xb2216、0xa57f、0xa57f、 0x9a75、0x9a75、
       0x9128、0x9128、0x89c1、0x89c1、0x845f、 0x845f、0x811b、0x811b、0x8002、
       0x8002、0x811b、0x811b、0x845f、0x845f、 0x89c1、0x89c1、
       0x9128、0x9128、0x9a76、0x9a76、0xa57f、 0xa57f、b2216、b2216、0xc002、
       0xc002、0xcf06、0xcf06、0xdee0、0xdee0、 0xef4c、0xef4c
    };

    /*
    ** McASP 发送缓冲器。
    *
    静态 uint8_t txBuf0[AUDIO_BUF_SIZE];

    /*
    ** I2C 实例零句柄
    *
    hsI2cHandle   i2cHandle;

    /*
    ** I2C 实例一个句柄
    *
    hsI2cHandle   i2cHandle1;

    uint8_t       audioCodecSlaveAddr =(uint8_t) audio_codec_slave_ADDR;
    /*********
    **                     内部 CONSTATNT 定义
    秘书长的报告 /

    /*
    **发送段的默认参数。 这将从传输
    **循环缓冲区。
    *
    静态 EDMA3CCPaRAMEntry const txDefaultPar ={
       (uint32_t) EDMA3CC_OPT_TCC_SET (EDMA3_CHA_MCASP3_TX)、
       (uint32_t) txBuf0、                               /*源地址*/
       (uint16_t)(4)、                                  /* aCnt */
       (uint16_t)(AUDIO_BUF_SIZE / 4)、                 /* bCnt */
       (uint32_t)(SOC_MCASP2_base)、                    /* dest 地址*/
       (uint16_t)(4)、                                  /*源 bIdx *
       (uint16_t)(0)、                                  /* dest bIdx */
       (uint16_t)(PAR_TX_START * SIZE _ParamSet)、       /*链接地址*/
       (uint16_t)(1)、                                  // bcnt reload 值*/
       (uint16_t)(0)、                                  /*源 cIdx *
       (uint16_t)(0)、                                  /* dest cIdx */
       (uint16_t)(1)                                   /* ccnt */
    };

    /*********
    **                         函数定义
    秘书长的报告 /

    /* I2C 实例初始化*/
    void i2c_init (LLD_Hs2cInstId_t instId)

     ld_hsi2c_initParam_t initPar;
     hsI2cObjHandle i2cObjHandle;
     
     initPar.opMode = HSI2C_OPMODE_POLED;
     initPar.i2cBusFreq = I2C_normal;
     initPar.is10BitAddr = 0;
     initPar.isMasterMode = 1;

     LLD_i2c_init (&i2cObjHandle、instId、&initPar);

     IF (HSI2C_INST_1 => instId)
     {
     i2cHandle = LLD_i2c_open (instId、NULL、NULL);
     }
    #IF (已定义(SOC_TDA2XX)||已定义(SOC_TDA2PX)
     IF (HSI2C_INST_1 => instId)
     {
     i2cHandle1 = LLD_i2c_open (instId、NULL、NULL);
     }
    #Elif (定义的(SOC_TDA2EX))
     IF (HSI2C_INST_4 = instId)
     {
     i2cHandle1 = LLD_i2c_open (instId、NULL、NULL);
     }
    #endif



    /* I2C 关闭并取消初始化*/
    void i2c_deinit()

       LLD_i2c_close (&i2cHandle);

       LLD_i2c_deinit (HSI2C_INST_0);

       LLD_i2c_close (&i2cHandle1);
    #IF (已定义(SOC_TDA2XX)||已定义(SOC_TDA2PX)
       LLD_i2c_deinit (HSI2C_INST_1);
    #Elif (定义的(SOC_TDA2EX))
       LLD_i2c_deinit (HSI2C_INST_4);
    #endif


    /* I2C 写入函数*/
    LLD_hsi2cErrorCode_t I2CWrite (uint8_t 地址、uint8_t 数据)

       LLD_hsi2cErrorCode_t      RetVal = LLD_HSI2C_Success;
       ld_hsi2c_datatfr_params_t i2cXferParams;

       i2cXferParams.bufLen = 2;
       i2cXferParams.buffer =&DATA_TX[0];

       DATA_TX[0]=地址;
       DATA_TX[1]=数据;

    #if debug
       UARTPuts("\r\ni2c 写入:  地址: ",-1);
       UARTPutHexNum (DATA_TX[0]);
       UARTPuts("data : ",-1);
       UARTPutHexNum (DATA_TX[1]);
    #endif

       i2cXferParams.flags = LLD_HSI2C_WRITE | LLD_HSI2C_MASTER | LLD_HSI2C_START
                             | LLD_HSI2C_STOP;
       i2cXferParams.slaveAddr = audioCodecSlaveAddr;
       i2cXferParams.timeout  = 0xFFFFFF;

       RetVal = LLD_i2c_transfer (i2cHandle、&i2cXferParams);

       if (LLD_HSI2C_Success!= RetVal)
       {
           UARTPUTs ("\r\nI2c 写入失败"、-1);
       }
    #if debug
       其他
       {
           UARTPuts ("\r\nI2c 写入成功"、-1);
       }
    #endif

       返回 RetVal;


    LLD_hsi2cErrorCode_t I2CWrite1 (uint8_t 地址、uint8_t 数据)

       LLD_hsi2cErrorCode_t      RetVal = LLD_HSI2C_Success;
       ld_hsi2c_datatfr_params_t i2cXferParams;
       hsI2cHandle               ioexpi2cHandle;

       i2cXferParams.bufLen = 2;
       i2cXferParams.buffer =&DATA_TX[0];

       DATA_TX[0]=地址;
       DATA_TX[1]=数据;

    #if debug
       UARTPuts("\r\ni2c 写入:  地址: ",-1);
       UARTPutHexNum (DATA_TX[0]);
       UARTPuts("data : ",-1);
       UARTPutHexNum (DATA_TX[1]);
    #endif

       i2cXferParams.flags = LLD_HSI2C_WRITE | LLD_HSI2C_MASTER | LLD_HSI2C_START
                             | LLD_HSI2C_STOP;
       i2cXferParams.slaveAddr =(uint8_t) GPIO_IO_EXPANDER_SLAVE_ADDR;
       i2cXferParams.timeout  = 0x4000;

    #IF 定义(SOC_TDA2PX)
       //对于 TDA2PX,IO 扩展器和编解码器都位于 i2c0上*/
       ioexpi2cHandle = i2cHandle;
    其他
       ioexpi2cHandle = i2cHandle1;
    #endif
       RetVal = LLD_i2c_transfer (ioexpi2cHandle、&i2cXferParams);

       if (LLD_HSI2C_Success!= RetVal)
       {
           UARTPUTs ("\r\nI2c 写入失败"、-1);
       }
    #if debug
       其他
       {
           UARTPuts ("\r\nI2c 写入成功"、-1);
       }
    #endif

       返回 RetVal;


    LLD_hsi2cErrorCode_t I2C_read (uint8_t 地址、uint8_t *数据)

       LLD_hsi2cErrorCode_t      RetVal = LLD_HSI2C_Success;
       ld_hsi2c_datatfr_params_t i2cXferParams;

       i2cXferParams.bufLen = 1;
       i2cXferParams.buffer =&DATA_TX[0];

       DATA_TX[0]=地址;/*地址字节 MSB*/

       i2cXferParams.flags =
           LLD_HSI2C_WRITE | LLD_HSI2C_MASTER | LLD_HSI2C_START /*|
                                                                 *LLD_HSI2C_STOP*/;
       i2cXferParams.slaveAddr = audioCodecSlaveAddr;
       i2cXferParams.timeout  = 0xFFFFFF;

       RetVal = LLD_i2c_transfer (i2cHandle、&i2cXferParams);

       if (LLD_HSI2C_Success!= RetVal)
       {
           UARTPUTs ("\r\nI2c 写入失败"、-1);
       }
    #if debug
       其他
       {
           UARTPuts ("\r\nI2c 写入成功"、-1);
       }
    #endif

       i2cXferParams.buffer =&DATA_Rx[0];
       i2cXferParams.flags = LLD_HSI2C_Read | LLD_HSI2C_MASTER |
                              LLD_HSI2C_START | LLD_HSI2C_STOP |
                              LLD_HSI2C_IGNORE_BUS_BUSY;
       RetVal = LLD_i2c_transfer (i2cHandle、&i2cXferParams);

    #if debug
       UARTPuts("\r\ni2c 读取:  地址:" ,-1);
       UARTPutHexNum (DATA_TX[0]);
       UARTPuts("data : ",-1);
       UARTPutHexNum (DATA_Rx[0]);
    #endif

       if (LLD_HSI2C_Success!= RetVal)
       {
           UARTPUTs ("\r\nI2c 读取失败"、-1);
       }
    #if debug
       其他
       {
           UARTPuts ("\r\nI2c 读取成功"、-1);
           *数据= DATA_Rx[0];
       }
    #endif

       返回 RetVal;


    LLD_hsi2cErrorCode_t I2CWriteBf (uint8_t regAddr、uint8_t bfPosition、
                                   uint8_t bfSize、
                                   uint8_t bfData)

       uint8_t regData = 0;             /*临时寄存器数据     */
       uint8_t mask   = 0;             /*位字段掩码              */
       LLD_hsi2cErrorCode_t RetVal = LLD_HSI2C_Success;

       /*从 regAddr*/读取数据
       RetVal = I2C_Read (regAddr、&regData);

       if (LLD_HSI2C_Success!= RetVal)
       {
           UARTPUTs ("\r\nI2c 读取失败"、-1);
       }

       mask   =((1 << bfSize)- 1)<< bfPosition;
       regData =(regData &(uint8_t)(~(mask)));
       regData =(regData |(uint8_t)(bfData << bfPosition));

       /*将修改后的数据写回寄存器                */
       RetVal = I2CWrite (regAddr、regData);

       返回 RetVal;


    /**
     *
     * \brief 此函数会写入 Aic31 DAC 的初始化值
              *寄存器。 应调用此函数来初始化
              * DAC 的寄存器。
     *
     * \返回无
     *
    静态空 aic31InitDac()

      LLD_hsi2cErrorCode_t RetVal = LLD_HSI2C_Success;
       uint8_t 增益= 0x24;

       /*为 DAC 寄存器写入初始化值                 */
       RetVal = I2CWriteBf ((uint8_t) Aic31_P0_REG7、(uint8_t) 1、(uint8_t) 4、
                           (uint8_t) 5);

       /*为左右 DAC 加电                                      */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG37、
                                            (uint8_t) 0x80));

       /*选择 DAC L1 R1路径                                            *///  已从02更改为01
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG41、
                                            (uint8_t) 0x00);  //00h

       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG42、
                                            (uint8_t) 0x6C);

       /*撤消 DAC 的静音                                                        */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG43、
                                            (uint8_t) 0x00);
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG44、
                                            (uint8_t) 0x80));

       /* DAC L 到 HPL 输出已连接                                         */// 已从47更改为
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG61、
                                            (uint8_t) 0x80));
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG65、
                                            (uint8_t) 0x09));

       /* DAC R 至 HPROUT 已连接                                          */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG64、
                                            (uint8_t) 0x00);
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG65、
                                            (uint8_t) 0x09));

       /* DACL1连接到线路1输出                                         */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG82、
                                            (uint8_t) 0x80));
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG86、
                                            (uint8_t) 0x09));

       /* DACR1连接到 Line1 Rout                                         */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG89、
                                            (uint8_t) 0x80));
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG93、
                                            (uint8_t) 0x09));

       /*左/右 DAC 数字音量增益                                    */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite (((uint8_t) Aic31_left_DAC_VOL_CTRL_ADDR、
                                            /*(uint8_t)增益*/增益);
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite (uint8_t)
                                            Aic31_right_DAC_VOL_CTRL_ADDR、
                                            /*(uint8_t)增益*/增益);

       if (LLD_HSI2C_Success!= RetVal)
       {
           //UARTPuts ("\r\nDAC 初始化失败"、-1);
       }
       其他
       {
           //UARTPuts ("\r\nDAC 初始化成功"、-1);
       }


    静态空 aic31MdCreateChan ()

     uint8_t tempData           = 0;
       uint8_t pllPValue          = 0;
       uint8_t pllRValue          = 0;
       uint8_t pllJValue          = 0;
       uint8_t pllDLowValue       = 0;
       uint8_t pllDHighValue      = 0;
       uint8_t dualRate           = 0;
       uint8_t sampleRateDiv      = 0;
       uint8_t fsRef              = 0;
       LLD_hsi2cErrorCode_t RetVal = LLD_HSI2C_Success;

       /*选择 Aic31的寄存器第0页                           */
       RetVal = I2CWrite (Aic31_PAGE_SELECT_ADDR、Aic31_PAGE_0);

       /*重置 Aic31                                           */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal | I2CWrite (Aic31_P0_REG1、(uint8_t) 0x80));

       /*配置音频串行数据接口模式            */
       tempData =(0U << 6U);

       /*配置插槽宽度                                  */
       tempData |=(3U << 4U);

       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite (Aic31_serial_INTERFACEB_ADDR、tempData);

       /*配置 sampleRateDiv 和 dualRate                       */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG2、(uint8_t) 0、
                                              (uint8_t) 4、
                                              (uint8_t)
                                              SampleRateDiv);

       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG25、(uint8_t) 6、
                                              (uint8_t) 2、
                                              (uint8_t) 0x11));



       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG7、(uint8_t) 5、
                                              (uint8_t) 1、
                                              (uint8_t) dualRate));

       /*启用 PLL                                            */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG3、(uint8_t) 7、
                                              (uint8_t) 1、
                                              (uint8_t) 1));

       /*选择 MCLK 作为 PLL 和 CLKDIV (N = 16)的输入*/
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG102、
                                              (uint8_t) 4、(uint8_t) 2、
                                              (uint8_t) 0x00);

       /*选择 PLL_IN 作为编解码器输入                          */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG101、
                                              (uint8_t) 0、(uint8_t) 1、
                                              (uint8_t) 0x00);
    #if 0
       /*选择 GPIO 以输出分频的 PLL_IN 时钟(测试目的)*/
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG98、
                                           (uint8_t) 0x20));
    #endif

       /*写入 PLL 编程寄存器 A                           */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG3、(uint8_t) 0、
                                              (uint8_t) 3、
                                              pllPValue);


    //根据数据表启用的 q 值
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG3、(uint8_t) 3、
                                              (uint8_t) 3、
                                              pllPValue);


       /*写入 PLL 编程寄存器 B                           */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG4、(uint8_t) 2、
                                              (uint8_t) 6、
                                              pllJValue);

       /*写入 D 值的高和低位                    */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal | I2CWrite (Aic31_P0_REG5、pllDHighValue));

       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWrite ((uint8_t) Aic31_P0_REG6、
                                            (uint8_t)(pllDLowValue << 2));

       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG11、
                                              (uint8_t) 0、(uint8_t) 4、
                                              pllRValue);

       /*写入编解码器数据路径设置寄存器                        */
       RetVal =
           (LLD_hsi2cErrorCode_t)(RetVal |
                                   I2CWriteBf ((uint8_t) Aic31_P0_REG7、(uint8_t) 7、
                                              (uint8_t) 1、
                                              fsRef);

       if (LLD_HSI2C_Success!= RetVal)
       {
           //UARTPuts ("\r\n 编解码器初始化失败"、-1);
       }
       其他
       {
           //UARTPuts ("\r\n 编解码器初始化成功"、-1);
       }

       /*初始化 DAC*/
       aic31InitDac();


    /*
    **初始化 DMA 参数。
    ** TX 基本参数集(通道)为12。
    **
    ** TX 参数集将被初始化以从循环缓冲区发送。
    **可以配置循环缓冲区的大小。
    **传输完成中断不会为参数集1启用;
    参数**集1将链接到 TX 的链接参数集起始(PAR_TX_START)。
    **所有其它参数集将链接到自身。
    **且仅通过链接参数集进行进一步传输。
    **例如,如果 PAR_TX_START 值为72,且参数数量为2,
    **因此传输参数集链接将初始化为1->72->73、73->73。
    *
    静态空 I2SDMAParamInit (空)

       int16_t         * sineToneDataPtr =空;
       int32_t         *温度;
       uint32_t         i = 0;
       EDMA3CCPaRAMEntry 参数集;

       /*初始化 TX 缓冲区
        *
        *在串行器0和串行器1上可以看到/输出这些模式
        *

       SineToneDataPtr =_sineWavePattern;

       temp =(int32_t *) txBuf0;

       对于(I = 0;I <(AUDIO_BUF_SIZE / 4);I++)
       {
           *temp =(int32_t)(* sineToneDataPtr);

           temp++;
           SineToneDataPtr ++;
       }

       /*初始化传输的第一个参数集*/
       memcpy (&ParamSet、&txDefaultPar、Size_ParamSet - 2);

       EDMA3SetPaRAM (SOC_EDMA_TPCC_BASE_virt、EDMA3_CHA_MCASP3_TX、&ParamSet);

       /*设置链接参数*/
       EDMA3SetPaRAM (SOC_EDMA_TPCC_BASE_virt、PAR_TX_START、&ParamSet);


    /*
    **将 McASP 发送部分配置为 I2S 模式。
    *
    静态空 McASPI2SConfigure (空)

       McASPTxReset (SOC_MCASP2_CFG_BASE);

       /*为 DMA 传输启用 FIFO */
       McASPWriteFifoEnable (SOC_MCASP_3_FIFO_REGS、1、1);

       /*假设32位字为整数格式,设置掩码*/
       McASPTxFmtMaskSet (SOC_MCASP2_CFG_BASE、0xFFFFFFFF);

       /*以发送器/接收器格式单位设置 I2S 格式*/
       McASPTxFmtSet (SOC_MCASP2_CFG_BASE、(MCASP_TX_SYNC_DELAY_0BIT |
                                           McASP_TX_bitstream_MSB_first |
                                           McASP_TX_SLOTIZE_32位|
                                           McASP_TX_ROT_RIGHT _20BITS));

       McASPTxFrameSyncCfg (SOC_MCASP2_CFG_BASE、I2S_MODE、MCASP_TX_FS_WIDTH_WORD、
                           McASP_TX_FS_EXT_BEGIN_ON_FALL_EDGE |
                           McASP_TX_FS_INTERNAL);

       /*配置发送器的时钟*/
       McASPTxClkCfg (SOC_MCASP2_CFG_BASE、MCASP_TX_CLK_INTERNAL、
                     (((MCASP_ACLKX_CLKXDIV_VALUE 和 MCASP_ACLKXCTL_CLKXDIV_MASK)>>
                      McASP_ACLKXCTL_CLKXDIV_SHIFT)、
                     ((MCASP_AHCLKX_HCLKXDIV_VALUE &
                       McASP_AHCLKXCTL_HCLKXDIV_MASK)>>
                      McASP_AHCLKXCTL_HCLKXDIV_SHIFT);

       McASPTxClkPolaritySet (SOC_MCASP2_CFG_base、MCASP_TX_CLK_POL_FALL_EDGE);

       McASPTxClkCheckConfig (SOC_MCASP2_CFG_BASE、MCASP_TX_CLKCHK_DIV32、0x00、
                             0xFF);

       /*启用发送器/接收器插槽。 I2S 使用2个插槽*/
       McASPTxTimeSlotSet (SOC_MCASP2_CFG_BASE、I2S_SLOTS);

       /*
       **设置串行器
       *
       McASPSerializerTxSet (SOC_MCASP2_CFG_BASE、MCASP_XSER_TX_0);

       /*
       **配置 McASP 引脚
       **输出-帧同步、时钟、串行器 Rx 和串行器 Tx
       **         (内部生成的时钟)
       *
       McASPPinMcASPSet (SOC_MCASP2_CFG_BASE、
                        (McASP_PIN_AFSX
                         | MCASP_PIN_AHCLKX | MCASP_PIN_ACLKX | MCASP_PIN_AMUTE
                         | MCASP_PIN_AXR (MCASP_XSER_TX_0)
                        ));

       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_AFR);
       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_ACLKR);

       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_AFSX);

       /*将高电平时钟配置为输出*/
       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_AHCLKX);

       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_ACLKX);

       /*两个串行器均用于输出数据*/
       McASPPinDirOutputSet (SOC_MCASP2_CFG_BASE、MCASP_PIN_AXR (MCASP_XSER_TX_0));


    /*
    **在 AINTC 中为 EDMA 设置中断
    *
    静态空 EDMA3内部设置(空)

       /*解锁纵横制寄存器*/
       PlatformUnlockMMR();

    #ifdef __ARM_ARCH_7A__
       IRQXBARConnect (SOC_IRQ_DMARQ_crossbar_register_base、CPU_MPUSS、7、
                      EDMA_TPCC_IRQ_REGION0);

    定义的#Elif (_TMS320C6x)
       IRQXBARConnect (SOC_IRQ_DMARQ_crossbar_register_base、CPU_DSP1、7、
                      EDMA_TPCC_IRQ_Region2);
    #endif

       /*启用 EDMA 中断*/
       INTC_Init();
       INTC_IntEnable (0);

       INTC_IntRegister (EDMA3_CC_XFER_Complete_INT、
                        (IntincuncPtr) EDMA3CCComplisr、
                        null);
       INTC_IntPrioritySet (EDMA3_CC_Xfer_Complete_INT、1、0);
       INTC_SystemEnable (EDMA3_CC_XFER_Complete_INT);


    /*
    **激活数据传输/接收
    **在调用此函数之前,DMA 参数应准备就绪。
    *
    静态空 I2SDataTxActivate (空)


          
       /*启动时钟*/
       McASPTxClkStart (SOC_MCASP2_CFG_BASE、MCASP_TX_CLK_INTERNAL);


    #if 1.

       /*为传输启用 EDMA */
       EDMA3 EnableTransfer (SOC_EDMA_TPCC_BASE_virt、EDMA3_CHA_MCASP3_TX、
                           EDMA3_TRIG_MODE_EVENT);
       


       /*激活 串行器*/
       McASPTxSerActivate (SOC_MCASP2_CFG_BASE);
       

       /*确保 XDATA 位清零*/
      while (McASPTxStatusGet (SOC_MCASP2_CFG_BASE)和 MCASP_TX_STAT_DATAREADY);

       

       /*激活状态机*/



     
         McASPTxEnable (SOC_MCASP2_CFG_BASE);

    #endif


    void sampleConfigScr (unsigned int eventNum、unsigned int chanNum){
       unsigned int  scrChanOffset = 0;
       unsigned int  scrRegOffset=0 ;
       unsigned int  xBarEvtNum   = 0;
       IntmuxRegsOvly scrEvtMux    =
           (IntmuxRegsOvly)(EDMA3_EVENT_MUX_REG_BASE_ADDR);

       if ((eventNum < EDMA3_MAX_cross_bar_events_TI814X)&&
           (chanNum < EDMA3_NUM_TCC))
       {
           scrRegOffset = chanNum /2;
           scrChanOffset = chanNum -(scrRegOffset * 2);
           xBarEvtNum   =(eventNum + 1);

           开关(scrChanOffset)
           {
               情况0:
                   scrEvtMux->TPCC_EVTMUX[scrRegOffset]&=
                       ~(INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_0_MASK);
                   scrEvtMux->TPCC_EVTMUX[scrRegOffset]|=
                       (xBarEvtNum & INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_0_MASK);
                   中断;
               案例1:
                   scrEvtMux->TPCC_EVTMUX[scrRegOffset]&=
                       ~(INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_MASK);
                   scrEvtMux->TPCC_EVTMUX[scrRegOffset]|=
                       ((xBarEvtNum <<
                         INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_SHIFT)和
                        (INTMUX_TPCC_EVTMUX_TPCCEVT_MUX_1_MASK);
                   中断;
               默认值:
                   中断;
           }
       }


    /*配置 EDMA Xbar*/
    void Configure_EDMA_Xbar ()

       SampleConfigScr (MCASP3_RX_DMA_XBAR_INST、EDMA3_CHA_MCASP3_TX);


    /*引脚复用和时钟配置*/
    空 pinMuxClkConfig (空)

       /*解锁控制寄存器*/
       PlatformUnlockMMR();

       McASP 实例2的/*焊盘多路复用器配置*/
       PlatformMCASP3SetPinMux();

       /*打开 McASP 实例2*/
       PlatformMCASP3PrcmEnable();
    #IF (已定义(SOC_TDA2XX)||已定义(SOC_TDA2PX)
       /* I2C 实例2的焊盘多路复用器配置*/
       PlatformI2C2SetPinMux();
    #Elif (定义的(SOC_TDA2EX))
       /* I2C 实例5的焊盘多路复用器配置*/
       PlatformI2C5SetPinMux();
    #endif

       PlatformUART1 SetPinMux();


    /*EDMA 配置*/
    空 edmaConfig (空)

    #if 已定义(__arm_arch_7A__)
       EMDAsetRegion (EDMA3_CC_REGASE_A15);
    定义的#Elif (_TMS320C6x)
       EMDAsetRegion (EDMA3_CC_REGION _DSP);
    #endif

       EDMA3初始(SOC_EDMA_TPCC_BASE_virt、EDMA3_CC_queue);

       CONFIG_EDMA_Xbar ();

       EDMA3IntSetup();

       /*请求 EDMA 通道*/
       EDMA3RequestChannel (SOC_EDMA_TPCC_BASE_virt、EDMA3_CHANNEL TYPE_DMA、
                           EDMA3_CHA_MCASP3_TX、EDMA3_CHA_MCASP3_TX、
                           EDMA3_CC_queue);


    静态 LLD_hsi2cErrorCode_t updateAudioCodecAddr (void)

       LLD_hsi2cErrorCode_t RetVal = LLD_HSI2C_Success;

       //uint32 i2cInstId1 = 1;
       RetVal = LLD_i2c_probe (i2cHandle、0x18);
       if (LLD_HSI2C_Success!= RetVal)
       {
    #ifdef AUDIO_CODE_SLAVE_ADDR_1
           RetVal = LLD_i2c_probe (i2cHandle、0x18);
           if (LLD_HSI2C_Success!= RetVal)
           {
               UARTPuts ("\r\nProbe to audio codec failed "、-1);
               RetVal = LLD_HSI2C_FAIL;
           }
           其他
           {
               /*使用备用音频编解码器 Addr */
               audioCodecSlaveAddr = audio_codec_slave_ADDR_1;
           }
    其他
           UARTPuts ("\r\nProbe to audio codec failed "、-1);
           RetVal = LLD_HSI2C_FAIL;

    #endif
       }
       其他
       {
           /*使用默认的音频编解码器地址*/
           audioCodecSlaveAddr = audio_codec_slave_ADDR;
       }

       返回 RetVal;


    /*:W

    **
    **主函数。 应用从这里启动。
    *
    int main (空)


       SampleDelay (5000);

       UARTStdioInit();

       UARTPuts ("\r\nMcASP Sinetone 应用程序"、-1);


       uint32_t value = hw_RD_REG32 (SOC_MCASP2_CFG_base);
       UARTPutHexNum (value);

       LLD_hsi2cErrorCode_t RetVal = LLD_HSI2C_Success;

       /*引脚复用和时钟配置*/
           pinMuxClkConfig();


       /*I2C 实例0 init*/
       //i2c_init (HSI2C_INST_0);
       I2C_init (HSI2C_INST_1);


       RetVal = updateAudioCodecAddr();
       if (LLD_HSI2C_Success!= RetVal)
       {
       UARTPuts ("\r\ninside update audio codec addr "、-1);
           /*无法探测音频编解码器*/
           while (1);
       }

       /*EDMA 配置*/
       edmaConfig();

       /*Init 编解码器和 DAC*/
       aic31MdCreateChan();

       /*初始化 DMA 参数*/
       I2SDMAParamInit();


       /*配置 McASP*/
       McASPI2SConfigure();


       /*激活音频传输和接收*/
       I2SDataTxActivate();


       /*取消初始化 I2C*/
       i2C_deinit();


       /*即使应用程序结束,数据传输也会无限发生
        *此处。 由于编译器发出非警告、已删除 while 循环
        *可返回主功能
        *
       返回0;


    /*
    ** EDMA 传输完成 ISR
    *
    静态空 EDMA3CCComplisr (空*虚拟)

       /*检查传输 DMA 是否已完成*/
       IF (EDMA3GetIntrStatus (SOC_EDMA_TPCC_BASE_virt)和(1 << EDMA3_CHA_MCASP3_TX))
       {
           /*清除第一个通道的中断状态*/
           EDMA3ClrIntr (SOC_EDMA_TPCC_BASE_virt、EDMA3_CHA_MCASP3_TX);
       }


    空平台 MCASP3SetPinMux (空)

          /*音频*/
          /*Pad 配置*/
       #define CTRL_CORE_SEC_SMA_SW_14 (0x290U)      
       HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_AD7、0x0000000F);
           HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_AD5、0x0000000F);
           HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_AD6、0x0000000F);
           HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_AD10、0x0000000F);
           HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_AD11、0x0000000F);
           HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_BEN0、0x0006000E);
                   
       GPIODirModeSet (SOC_GPIO1_base、1、GPIO_DIR_OUTPUT);
       GPIOPinWrite (SOC_GPIO1_base、1、GPIO_PIN_HIGH);
       HW_WR_REG32 (SOC_CORE_PAD_IO_REGISTER_BASE + CTRL_CORE_PAD_IO_GPMC_BEN1、0x0006000E);//音频扬声器启用
       GPIODirModeSet (SOC_GPIO1_base、2、GPIO_DIR_OUTPUT);
       GPIOPinWrite (SOC_GPIO1_base、2、GPIO_PIN_HIGH);
       
       HW_WR_REG32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_SEC_SMA_SW_14、0x00200033);
    /** 用于环回
       HW_WR_FIELD32 (SOC_MCASP2_CFG_BASE + MCASP_LBCTL、MCASP_LBCTL_DLBEN、
                               McASP_LBCTL_DLBEN_ENABLE);
       HW_WR_FIELD32 (SOC_MCASP2_CFG_BASE + MCASP_LBCTL、MCASP_LBCTL_IOLBEN、
                               McASP_LBCTL_IOLBEN_ENABLE);
       HW_WR_FIELD32 (SOC_MCASP2_CFG_BASE + MCASP_LBCTL、MCASP_LBCTL_MODE、
                               McASP_LBCTL_MODE_XMTCLK);
       HW_WR_FIELD32 (SOC_MCASP2_CFG_BASE + MCASP_LBCTL、MCASP_LBCTL_ORD、0x0);
       HW_WR_FIELD32 (SOC_MCASP2_CFG_BASE + MCASP_ACLKXCTL、
                 McASP_ACLKXCTL_异 步、
                 McASP_ACLKXCTL_ASYNC_SYNC);

       HW_WR_REG32 (SOC_MCASP2_CFG_BASE + MCASP_TXFMCTL、0x00000200);

       HW_WR_REG32 (SOC_MCASP2_CFG_BASE + MCASP_RXFMCTL、0x00000200);**/
       




    空平台 MCASP3PrcmEnable (空)

       HW_WR_REG32 (0x4a009860、0x02);
       while ((HW_RD_REG32 (0x4a009860))!= 0x02U)
       {
           ;
       }



    void sampleDelay (int32_t delay)

       volatile int32_t i、j;

       对于(I = 0;I <延迟;I++)
       {
           对于(j = 0;j < 100;j++);
       }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    是否有任何更新
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Surendar、

    您的代码究竟在哪里卡住了?

    它是否位于函数平台 MCASP3PrcmEnable 中?

    此致、

    Prasad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Prasad,

    代码卡在"I2SDataTxActivate"内的"McASPTxClkStart"函数上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Surendar、

    McASP 模块的时钟可能未激活、
    是否可以检查 CM_L4PER2_CLKSTCTRL (0x4a00 98FC) 22、23和26位的值是否设置为1?

    您还可以从 PRCM、MCASP2_AHCLKR、MCASP2_AHCLKX、MCASP2_AUX2_GFCLK、L4PER2_L3_GICLK 中检查 McASP 模块的输入时钟状态。 您可以检查它们从相应的多路复用器控制寄存器连接的时钟源、并检查它们的状态。

    此致、
    Prasad