TI中文支持网
TI专业的中文技术问题搜集分享网站

C6748 I2C 通信不正常

程序是创龙的例程MIC IN 开发板是TL138/1808/6748-EVM-A3

表现在卡在AIC芯片初始化里面,具体查看是卡在I2CSentBlocking函数中的最后一个等待发送完成的循环 好像是没有收到中断

/****************************************************************************/
/* */
/* 广州创龙电子科技有限公司 */
/* */
/* Copyright 2015 Tronlong All rights reserved */
/* */
/****************************************************************************/
/****************************************************************************/
/* */
/* 音频测试:MIC_IN读取音频数据,LINE_OUT输出数据(中断方式) */
/* */
/* 2015年07月13日 */
/* */
/****************************************************************************/
#include "TL6748.h" // 创龙 DSP6748 开发板相关声明
#include "hw_types.h"
#include "edma_event.h"#include "interrupt.h"
#include "soc_OMAPL138.h"
#include "hw_syscfg0_OMAPL138.h"

#include "codecif.h"
#include "mcasp.h"
#include "edma.h"
#include "psc.h"
#include "uartStdio.h"
#include "dspcache.h"

#include "aic3106_init.h"
#include "mcasp_init.h"

/****************************************************************************/
/* */
/* 宏定义 */
/* */
/****************************************************************************/
// AIC3106 I2C从地址
#define I2C_SLAVE_CODEC_AIC31 (0x18u)

// I2S 使用2个 slot
#define I2S_SLOTS (2u)

// 发送/接收 slot 大小
#define SLOT_SIZE (16u)

// 发送/接收数据 word 大小. Word size <= Slot size
#define WORD_SIZE (16u)

/****************************************************************************/
/* */
/* 全局变量 */
/* */
/****************************************************************************/

/****************************************************************************/
/* */
/* 函数声明 */
/* */
/****************************************************************************/
static void InitAIC31I2S(void);
static void InitMcaspIntr(void);
// DSP 中断初始化
static void InterruptInit(void);

/****************************************************************************/
/* */
/* McASP 中断函数 */
/* */
/****************************************************************************/
static void McASPIsr(void)
{
unsigned int sample, status;

IntEventClear(SYS_INT_MCASP0_INT);

status = McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS);

if(status & MCASP_TX_STAT_CURRSLOT_EVEN)
{
// 读取右通道数据
sample = InputSample();
// 输出右声道数据
OutputSample(sample);
}
else
{
// 读取左通道数据
sample = InputSample();
// 输出左声道数据
OutputSample(sample);
}
}

/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
int main(void)
{
// 使能缓存
CacheEnableMAR((unsigned int)0xC0000000, (unsigned int)0x10000000);
CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_256K);

// 串口终端初始化 使用串口2
UARTStdioInit();

UARTPuts("\r\n ============Test Start===========.\r\n", -1);
UARTPuts("Welcome to StarterWare Audio_Mic_In_Intr Demo application.\r\n\r\n", -1);
UARTPuts("This application loops back the input at MIC_IN of the EVM to the LINE_OUT of the EVM\r\n\r\n", -1);

// I2C 模块引脚配置
I2CPinMuxSetup(0);

// McASP 引脚配置
McASPPinMuxSetup();

// DSP 中断初始化
InterruptInit();

// 初始化 I2C 接口地址为 AIC31 的地址
I2CSetup(SOC_I2C_0_REGS, I2C_SLAVE_CODEC_AIC31);
I2CIntRegister(C674X_MASK_INT5, SYS_INT_I2C0_INT);

// 初始化 AIC31 音频芯片
InitAIC31I2S();

// 初始化 McASP 为中断方式
InitMcaspIntr();

while(1);
}

/****************************************************************************/
/* */
/* 初始化 AIC31 音频芯片 */
/* */
/****************************************************************************/
static void InitAIC31I2S(void)
{
volatile unsigned int delay = 0xFFF;

// 复位
AIC31Reset(SOC_I2C_0_REGS);
while(delay–);

// 初始化 AIC31 为 I2S 模式,slot 的大小
AIC31DataConfig(SOC_I2C_0_REGS, AIC31_DATATYPE_I2S, SLOT_SIZE, 0);

// 初始化采样率为 48000Hz
AIC31SampleRateConfig(SOC_I2C_0_REGS, AIC31_MODE_BOTH, FS_48000_HZ);

// 初始化 ADC 0分贝增益,连接 MIC IN
AIC31ADCInit(SOC_I2C_0_REGS, ADC_GAIN_0DB, AIC31_MIC_IN);

// 初始化 DAC 0分贝衰减
AIC31DACInit(SOC_I2C_0_REGS, DAC_ATTEN_0DB);
}

/****************************************************************************/
/* */
/* 初始化 McASP 为中断方式 */
/* */
/****************************************************************************/
static void InitMcaspIntr(void)
{
// 初始化 McASP 为 I2S 模式
McASPI2SConfigure(MCASP_BOTH_MODE, WORD_SIZE, SLOT_SIZE, I2S_SLOTS, MCASP_MODE_NON_DMA);

// 使能发送中断
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DATAREADY);

// 设置 McASP 中断
McASPIntSetup(C674X_MASK_INT6, McASPIsr);

// 启动 McASP 发送和接收
I2SDataTxRxActivate(MCASP_BOTH_MODE);
}

/****************************************************************************/
/* */
/* DSP 中断初始化 */
/* */
/****************************************************************************/
static void InterruptInit(void)
{
// 初始化 DSP 中断控制器
IntDSPINTCInit();

// 使能 DSP 全局中断
IntGlobalEnable();
}

卡在下面函数最后一句

static void I2CSendBlocking(unsigned int baseAddr, unsigned int dataCnt)
{
txCompFlag = 1;
dataIdx = 0; savedBase = baseAddr;
I2CSetDataCount(baseAddr, dataCnt);

I2CMasterControl(baseAddr, I2C_CFG_MST_TX | I2C_CFG_STOP);

I2CMasterIntEnableEx(baseAddr, I2C_INT_TRANSMIT_READY | I2C_INT_STOP_CONDITION);

I2CMasterStart(baseAddr);
// 等待数据发送完成
while(txCompFlag);
}

测试了别的I2C例程均有问题,换了核心板无效

user4557851:

 发现AIC芯片发烫,可能是芯片损坏?各位的AIC烫不烫?

Tony Tang:

txCompFlag是在哪里清0的?上面贴的程序里没这I2C ISR。

测一下AIC有没有返回ACK信号。

user4557851:

回复 Tony Tang:

没有 

这颗芯片是烫的 可能损坏

txCompFlag是在中断函数里面清零的

Maple Crystal:

回复 user4557851:

你好,请问你的问题解决没有

赞(0)
未经允许不得转载:TI中文支持网 » C6748 I2C 通信不正常
分享到: 更多 (0)