设为首页 加入收藏

TOP

Linux IIC驱动程序(三)
2014-11-24 07:34:53 来源: 作者: 【 】 浏览:7
Tags:Linux IIC 驱动程序
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(从设备)的通信,必须满足主设备和从设备的数据格式。


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++虚基类解决二义性问题及执行结.. 下一篇x86-qtopia应用程序编写及到arm板..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)