单片机/MCUwilliam hill官网
直播中

成尔秩

8年用户 977经验值
私信 关注
[问答]

求助,为什么aduc7060 IIC接口无法实现对at24c04的读取?

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#define BIT8 0x100
#define BIT9 0x200
#define BIT10 0x400
#define BIT11 0x800
#define BIT12 0x1000
#define BIT13 0x2000
#define BIT14 0x4000
#define BIT15 0x8000
#define BIT16 0x10000
#define BIT22 0x400000
#define BIT24 0x1000000
#define BIT25 0x2000000
#define BIT26 0x4000000
#define BIT27 0x8000000
#define BIT30 0x40000000
void Undef_Handler(void) { }
void IRQ_Handler(void) { }
void SWI_Handler(void) { }
void PAbt_Handler(void) { }
void DAbt_Handler(void) { }
void FIQ_Handler(void) { }
unsigned char szTxData[]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char szRxData[]={0x00};
#include
int main(void)
{ unsigned char ucWaitingForXIRQ0;
unsigned int I2CMSTATUS ;
unsigned char ucRxCount ;
unsigned char ucTxCount ;
POWKEY1 = 0x1;
POWCON0 = 0x78; // 主频 10.24Mhz
POWKEY2 = 0xF4;
GP1CON = BIT0 + BIT4; // Select UART functionality for P1.0/P1.1
COMCON0 = BIT7; // Enable access to COMDIV registers
COMDIV0 = 0x21; // Set baud rate to 9600.
COMDIV1 = 0x00;
COMCON0 = BIT0 + BIT1 + BIT2;
//==========================================
GP0CON0 = BIT4 + BIT12; // Select SPI/I2C alternative function for P0.1   P0.3
GP0KEY1 = 0x7; // Write to GP0KEY1
GP0CON1 = BIT1; // Select I2C functionality for P0.1   P0.3
GP0KEY2 = 0x13; // Write to GP0KEY2
I2CMCON = BIT0 ;
I2CDIV = 0x3e3e; // Select 80kHz clock rate
ucTxCount = 0;
I2CFSTA = BIT9; // Flush Master Tx FIFO
I2CFSTA  = ~BIT9;
I2CMTX = 0x00;
I2CADR0 = 0xA0;
ucWaitingForXIRQ0 = 1;
ucRxCount = 0;
while (1)
{ if (ucWaitingForXIRQ0 == 0) // Wait for XIRQ0 to trigger - cleared in XIRQ0 ISR
{ ucWaitingForXIRQ0 = 1;
ucRxCount = 0;
I2CMCNT0 = 9; // Read back 6 bytes
I2CADR0 = 0xA1;}// + I2C_RD_BIT; // Begin Read sequence from Slave
if(ucWaitingForXIRQ0 == 1)
{ I2CMSTATUS = 0;
I2CMSTATUS = I2CMSTA;
if ((I2CMSTATUS   BIT2) == BIT2) // If I2C Master Tx IRQ
{ if (ucTxCount < 8) // Have max 6 bytes been sent?
{I2CMTX = szTxData[ucTxCount++]; // Load Tx buffer
}
ucWaitingForXIRQ0 =0;}
if ((I2CMSTATUS   BIT3) == BIT3) // If I2C Master Rx IRQ
{if (ucRxCount < 8) // Have max 6 bytes been received?
{szRxData[ucRxCount] = I2CMRX; // Read Rx buffer
while(!((COMSTA0 BIT6)==BIT6)){};
COMTX=szRxData[ucRxCount];
ucRxCount++;}
ucWaitingForXIRQ0 =1;
}
}
}
}

                                                                                                                        

回帖(2)

林立

2024-1-11 14:56:17
在ADuC7060的网页上有参考代码可以下载,里面有一个例程是关于I2C_EPROM的。
举报

远不及你

2024-1-11 15:20:24
根据您提供的代码片段,无法确定为什么aduc7060 IIC接口无法读取at24c04。首先,代码片段中的定义只是一些位掩码,与IIC接口相关的代码并未给出。请提供完整的代码以便进一步分析和帮助解决问题。

同时,如果您遇到问题,可以尝试以下步骤进行排查:
1. 确保IIC接口的硬件连接正确,包括SDA、SCL、上拉电阻等。
2. 检查IIC接口的初始化是否正确,包括设置IIC的时钟频率、模式等参数。
3. 确保正确的IIC通信地址已被设置,确保配置正确,与at24c04的通信地址匹配。
4. 检查是否有其他硬件或软件冲突造成读取失败。
5. 使用适当的调试工具(如串口打印)输出调试信息,检查是否有错误提示或异常情况发生。

如果以上方法都无法解决问题,请提供更多相关的代码和错误信息,以便更准确地分析和解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分