主题中讨论的其他器件:REG102、 REG101
工具/软件:TI-RTOS
大家好,
我正在使用 TDA3XX 作为参考板的定制板上工作,它具有音频编解码器 TLV320AIC3109。 我知道 TDA3xx 不支持 McASP 驱动程序。
我想知道,我们可以通过任何方式为 TDA3XX 音频支持编写自己的驱动程序/代码 ,以支持给定的音频编解码器。 我还想知道我们是否可以引用任何代码并开始编写驱动程序
谢谢和此致,
V.B.Surendar
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.
工具/软件:TI-RTOS
大家好,
我正在使用 TDA3XX 作为参考板的定制板上工作,它具有音频编解码器 TLV320AIC3109。 我知道 TDA3xx 不支持 McASP 驱动程序。
我想知道,我们可以通过任何方式为 TDA3XX 音频支持编写自己的驱动程序/代码 ,以支持给定的音频编解码器。 我还想知道我们是否可以引用任何代码并开始编写驱动程序
谢谢和此致,
V.B.Surendar
您好 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、®Data);
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++);
}
}