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

28335利用i2c读eeprom(24C01)问题

例程的程序如下

Uint16 WriteData(Uint16 *Wdata, Uint16 RomAddress, Uint16 number)
{
Uint16 i;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR = 0x50;
I2caRegs.I2CCNT = number + 1;
I2caRegs.I2CDXR = RomAddress;
I2caRegs.I2CMDR.all = 0x6E20;
for (i=0; i<number; i++)
{
while(!I2C_xrdy());
I2caRegs.I2CDXR = *Wdata;
Wdata++;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
} return I2C_SUCCESS;}

对其中的I2caRegs.I2CSAR = 0x50;和I2caRegs.I2CDXR = RomAddress;有疑惑。手册中说数据的第一个字节从机地址,那按理该发送0x55,但是程序运行时查看寄存器发送的是RomAddress,值为0x60,感觉可能是数据在从机中的地址,如果这样I2CSAR中的0x55作用是什么?但是这样如果有多个eeprom如何区分?

user4329368:I2CSAR是从机地址,看EEPROMA0~A2脚接的是高还是低值为:SAR=1 0 1 0A2 A1 A0 。上述程序能往EEPROM中写入数据吗?

例程的程序如下

Uint16 WriteData(Uint16 *Wdata, Uint16 RomAddress, Uint16 number)
{
Uint16 i;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR = 0x50;
I2caRegs.I2CCNT = number + 1;
I2caRegs.I2CDXR = RomAddress;
I2caRegs.I2CMDR.all = 0x6E20;
for (i=0; i<number; i++)
{
while(!I2C_xrdy());
I2caRegs.I2CDXR = *Wdata;
Wdata++;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
} return I2C_SUCCESS;}

对其中的I2caRegs.I2CSAR = 0x50;和I2caRegs.I2CDXR = RomAddress;有疑惑。手册中说数据的第一个字节从机地址,那按理该发送0x55,但是程序运行时查看寄存器发送的是RomAddress,值为0x60,感觉可能是数据在从机中的地址,如果这样I2CSAR中的0x55作用是什么?但是这样如果有多个eeprom如何区分?

Eric Ma:“对其中的I2caRegs.I2CSAR = 0x50;和I2caRegs.I2CDXR = RomAddress;有疑惑。手册中说数据的第一个字节从机地址,那按理该发送0x55,但是程序运行时查看寄存器发送的是RomAddress,值为0x60”
Eric:
I2CSAR是从机地址,I2CDXR是要访问的数据的地址。
地址是先发送的,然后才是数据地址。
你可以用示波器看看。

例程的程序如下

Uint16 WriteData(Uint16 *Wdata, Uint16 RomAddress, Uint16 number)
{
Uint16 i;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR = 0x50;
I2caRegs.I2CCNT = number + 1;
I2caRegs.I2CDXR = RomAddress;
I2caRegs.I2CMDR.all = 0x6E20;
for (i=0; i<number; i++)
{
while(!I2C_xrdy());
I2caRegs.I2CDXR = *Wdata;
Wdata++;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
} return I2C_SUCCESS;}

对其中的I2caRegs.I2CSAR = 0x50;和I2caRegs.I2CDXR = RomAddress;有疑惑。手册中说数据的第一个字节从机地址,那按理该发送0x55,但是程序运行时查看寄存器发送的是RomAddress,值为0x60,感觉可能是数据在从机中的地址,如果这样I2CSAR中的0x55作用是什么?但是这样如果有多个eeprom如何区分?

user4329368:

回复 Eric Ma:

示波器看不到波形说明什么问题?

例程的程序如下

Uint16 WriteData(Uint16 *Wdata, Uint16 RomAddress, Uint16 number)
{
Uint16 i;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR = 0x50;
I2caRegs.I2CCNT = number + 1;
I2caRegs.I2CDXR = RomAddress;
I2caRegs.I2CMDR.all = 0x6E20;
for (i=0; i<number; i++)
{
while(!I2C_xrdy());
I2caRegs.I2CDXR = *Wdata;
Wdata++;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
} return I2C_SUCCESS;}

对其中的I2caRegs.I2CSAR = 0x50;和I2caRegs.I2CDXR = RomAddress;有疑惑。手册中说数据的第一个字节从机地址,那按理该发送0x55,但是程序运行时查看寄存器发送的是RomAddress,值为0x60,感觉可能是数据在从机中的地址,如果这样I2CSAR中的0x55作用是什么?但是这样如果有多个eeprom如何区分?

Eric Ma:

回复 user4329368:

IO口有没有配置成I2C的功能?
还有把loopback 功能关掉。

赞(0)
未经允许不得转载:TI中文支持网 » 28335利用i2c读eeprom(24C01)问题
分享到: 更多 (0)