我用的是S3C410的开发板,想通过IIC往24C04里写点东西,我开发板附带的文档里说24C04的地址是1010,可我怎么写都写不进去,我十分怀疑这个地址的真实性,然后我看网上说2410的板子还有个24C02寄存器,地址是0X50,于是我往0X50这个地址写数据,结果成功了,现在我疑惑的是0X50这个地址真的是24C02的地址吗,有什么确认的方法没,还有为什么24C04的地址会是1010啊,总觉得这个地址怪怪的,为什么办法办附带的文档上并没有24C02的资料呢,2410板子上一共有哪些寄存器呢?他们的地址是多少呢,用什么方式能查看这些寄存器及其地址呢?
呵呵,哪位达人帮我解解惑,感激不尽!!
24C04的地址是1010,这个地址是IIC器件的设备地址,也就是说,所有的24C04的器件地址都是1010;
但是24C04的地址是7位(IIC总线的7位地址模式,第八位为读写位)的,厂商生产时只是制定了前4位(1010),后3位的地址决定于24C04几个管脚的接高接低;
找个24C04的Datasheet看看,就明白了。
有点糊涂,能结合代码解释下吗?怎么我写地址的时候是直接往0X50写的呢,这么以来1010这个地址有什么用呢?
如果如你所说,那么一定是S3C410芯片I2C控制器的原因,可能有个I2C地址寄存器,而这个寄存器需要写的地址是不包括R/W位的地址。
而当向slave设备发送地址字节时会在最后一位加上读写位,
0xA0 | R/W = (0x50 << 1) | R/W; 红色操作可能是芯片I2C控制器自动完成的。
不管怎么说,slave设备看到一定是和自己地址匹配的地址。
这只是CPU I2C控制器处理上的细微差异,有的CPU就是这么约定,Microchip好像也是这样。
是这样的,我是再linux做的IIC读写,驱动程序是开发板自带的,已成功加载,我的程序如下:
#include
#include
#include
#include
#define CHIP_ADDR 0x50
#define PAGE_SIZE 0x06
#define I2C_DEV_PATH "/dev/i2c-0"
static int read_eeprom(int fd, char buff[], int addr, int count)
{
int res;
if(write(fd, &addr, 1) != 1)
return -1;
res=read(fd, buff, count);
return res;
}
int main(void)
{
int fd, n, res;
unsigned char buf[PAGE_SIZE];
fd = open(I2C_DEV_PATH, O_RDWR);
if(fd < 0)
{
printf("####i2c test device open fail####\n");
return (-1);
}
printf("success, i2c open file device %d \n",fd);
res = ioctl(fd, I2C_TENBIT,0); //do not use 10bit address mode
res = ioctl(fd, I2C_SLAVE_FORCE,CHIP_ADDR); //set slave device address
printf("ioctl I2C_SLAVE_FORCE msg NO:%d\n",res);
for(n=0; n
read_eeprom(fd, buf, 0, sizeof(buf));
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我并没有用到1010的地址啊?
#define CHIP_ADDR 0x50
0x50=0b10100000 >> 1;
你看看EEPROM的手册吧,这个1010只是器件高4位的地址。
英雄,太感谢了!!醍醐灌顶啊。。。。。。。。。。!!!!!!