程序是创龙的例程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:
你好,请问你的问题解决没有