通过I2C与ROHM BU94603对话

时间:2014-06-22 08:14:49

标签: c driver device microcontroller i2c

我正在尝试编写一个简单的程序来与ROHM BU94603KV音频解码器IC进行通信。我使用的主机控制器是Atmega8。语言是C.

BU94603KV是AAC + WMA + MP3解码器IC,包含USB主机,SD卡I / F,音频DAC,系统控制器和用于内部CORE电源的稳压器。

我为MANUAL SLAVE MODE设置了硬件,它可以通过I2C接口将存储设备信息发送到主控微机,并通过主微机完全控制播放序列等序列(称为MODE3)。

我正在尝试为健全性检查编写最短的测试代码。为此,我通过I2C(写入EQINF寄存器的命令)将0x5E和0x03写入BU94603KV。一切似乎都正常工作(I2C例程没有错误返回代码)。但是,结果不是预期的结果。

这是我的源代码;

unsigned char BU94603_Read_Test(void){

unsigned char errorStatus;

errorStatus = i2c_start();
if(errorStatus == 1)
{
    i2c_stop();
    return(-1);
}

// STEP1 send command to read EQ ----------------------
while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_sendAddress(BU94603_WRITE_ADDRESS);
if(errorStatus == 1)
{
    i2c_stop();
    return(-2);
}

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_sendData(BU94603_READ_STAT);
if(errorStatus == 1)
{
    i2c_stop();
    return(-3);
}

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_sendData(BU94603_READ_EQ);
if(errorStatus == 1)
{
    i2c_stop();
    return(-4);
}
i2c_stop();

// STEP2 read EQ status --------------------------
errorStatus = i2c_start();
if(errorStatus == 1)
{
    i2c_stop();
    return(-5);
}

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_sendAddress(BU94603_READ_ADDRESS);
if(errorStatus == 1)
{
    i2c_stop();
    return(-6);
}

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_receiveData_ACK();
if(errorStatus == ERROR_CODE)
{
    i2c_stop();
    return(-7);
}

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_receiveData_NACK();
if(errorStatus == ERROR_CODE)
{
    i2c_stop();
    return(-7);
}   

while((PINC & (1<<BU94603_BUSY)));  // wait while BU94603 is busy
errorStatus = i2c_receiveData_NACK();
if(errorStatus == ERROR_CODE)
{
    i2c_stop();
    return(-7);
}   

i2c_stop();
return(errorStatus);

}

运行结果为0xFB(假设为0x40)。可能是什么问题呢?

1 个答案:

答案 0 :(得分:0)

返回状态并返回相同值的数据可能有点奇怪,特别是当它们可以重叠时。

无论如何,0xfb是-5,所以看起来你有第二个i2c_start()失败的问题。可能需要等待BU94603再次准备好的循环。

您没有描述任何引脚配置(通常需要将引脚设置为i2c模式),硬件方面也没有任何内容(初学者的常见问题是缺少引线)。

您是否可以访问任何硬件调试工具(可能是示波器)?