ME); I2C_major = MAJOR(dev); }
if(result<0) { printk(KERN_WARNING"I2C:unable to get major %d\n",I2C_major); return result; }
if(I2C_major == 0) I2C_major = result;
printk(KERN_NOTICE"[DEBUG] I2C device major is %d\n",I2C_major);
__raw_writel( (__raw_readl(S3C2410_CLKCON) | (1 << 16)), S3C2410_CLKCON);
#if 0 printk("\n S3C2410_CLKCON = %x \n", __raw_readl(S3C2410_CLKCON)); area = request_mem_region(0x54000000, 16,"I2C"); #endif
i2c_base = ioremap(0x54000000, 16); clkcon = ioremap(CLKCON, 0x4);
printk(KERN_INFO"i2c clock = %d\n", *clkcon & (0x1 << 16)); *clkcon |= 0x1 << 16;
I2C_setup_dev(&I2C_cdev,0,&I2C_remap_ops);
return 0; } //驱动模块卸载 static void s3c2410_I2C_exit(void) { #if 0 if (area) { release_resource(area); kfree(area); } #endif cdev_del(&I2C_cdev); unregister_chrdev_region(MKDEV(I2C_major,0),1); printk("I2C device uninstalled\n"); }
module_init(s3c2410_I2C_init); module_exit(s3c2410_I2C_exit);
//---------------测试程序------------------------- #include #include #include #include #include #include
#define WATCHDOG_MAGIC 'k' #define FEED_DOG _IO(WATCHDOG_MAGIC,1)
int main(int argc,char **argv) { int fd; char buff[]="farsight"; //打开I2C fd=open("/dev/i2c",O_RDWR); if(fd<0) { printf("cannot open the I2C device\n"); return -1; } sleep(1); printf("buff_write=%s\n",buff); write (fd, buff, sizeof(buff));
//printf(" read now!\n"); memset (buff, '\0', sizeof(buff)); //printf ("Read returns %d\n", read (fd, buff, sizeof(buff))); read (fd, buff, sizeof(buff)); //read (fd, buff, 3); printf ("buff_read = %s\n", buff);
// } close(fd); // while(1); // printf("end\n"); return 0; }
确定slave 设备地址

由原理图可以得到A2(即NC)为0,A1为0,A0为0,将这三个数代入下面这个图中,就可以得到slave地址为0xa0
下图是芯片资料中关于设备地址的资料
 本例中使用的是2K的EEPROM,所以地址格式应该是
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
1 0 1 0 A2 A1 A0 R/W
其中A2,A1和A0由上面的原理图已经得出了,全为0.
而最后一位,读(EEPROM)时为1,写(EEPROM)时为0
这样slave设备地址就已经确定了
确定EEPROM“内部”写需要的时间

上面用红色圈起来的,就是EEPROM内部写需要的时间twr,然后再在下面的图中查该时间是多少

由上图得时间最大为10ms
主机(master这里是mcu)发送详细分析
由MCU的资料得到,mcu作为master发送时的流程图为
 由上图知,在start和stop condition之间,可以发送任意多个连续字节的数据。注意:这里把数据地址(不是设备地址)也看作是数据了。

由IIC的从设备(EEPROM)的资料得上图,其中对数据格式做了严格的限制,要求必须是
起始条件->从设备地址(EEPROM自己的地址)->数据的“地址”->和真实需要被写到eeprom中的数据->停止位。
这里EEPROM(从设备)把mcu(主设备)认为是“数据”的 需要被写到eeprom中的数据 的地址 看作是地址,这里只把需要被写到EEPROM中的真实的数据 看作是数据。
要想用IIC来实现mcu(主设备)和EEPROM(从设备)的通信,必须满足主设备和从设备的数据格式。
|