主题 : 4412读写IIC寄存器 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 94381
精华: 0
发帖: 30
金钱: 155 两
威望: 31 点
综合积分: 60 分
注册时间: 2013-07-15
最后登录: 2013-10-16
楼主  发表于: 2013-08-01 17:05

 4412读写IIC寄存器

想自己手动实现一个IIC,于是需要读写I2C的寄存器,但是神奇的是寄存器读取(写入)一直失败,返回的数都是0,但是读写GPIO寄存器的数都是正确的,这是为什么呢。。。
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
1楼  发表于: 2013-08-01 18:23
建议你先详细的描述一下问题,具体是怎么做的等
级别: 新手上路
UID: 94381
精华: 0
发帖: 30
金钱: 155 两
威望: 31 点
综合积分: 60 分
注册时间: 2013-07-15
最后登录: 2013-10-16
2楼  发表于: 2013-08-02 09:22

 回 1楼(911gt3) 的帖子

是这样的,我经过ioremap将I2C操作相关的寄存器映射,然后通过writeb等写入寄存器,然后使用reab等读出寄存器,但是读出数值为0。代码如下:

78         data = readl(devp->GPD1CON);
79         printk(KERN_INFO "GPM4CON = %x\n",data);
80         writeb(0x90,I2CSTA0);                   //stop i2c, not generate x
81         writeb(0xef,I2CCON0);                   //set rx mode, enable tx interrupt,
82         writeb(0xf1,I2CLC0);                    //set SCL
83         writeb((devp->slave_addr<<1)|0x01,I2CDS0);              //write slave address
84         tmp[0] = readb(I2CSTA0);
85         tmp[1] = readb(I2CCON0);
86         tmp[2] = readb(I2CLC0);
87         tmp[3] = readb(I2CDS0);
88         printk(KERN_INFO "I2CSTA0 = %x, I2CCON0 = %x, I2CLC0 = %x, I2CDS0 = %x\n",tmp[0],tmp[1],tmp[2],tmp[3]);

第一个printk输出GPIO寄存器信息,能够正确输出,第二个printk输出I2C寄存器信息,输出全部都是0
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
3楼  发表于: 2013-08-02 12:49
4412的内核已经启用了I2C,codec、电容屏需要用到i2c,因此不建议你另外这样子直接进行读/写操作
另外也不清楚你这些代码执行的时机如何,如果是很早,则还有可能是因为clock没有正确的初始化
具体如何操作,你可以直接参考内核中已有的驱动 drivers/i2c/busses/i2c-s3c2410.c
级别: 新手上路
UID: 94381
精华: 0
发帖: 30
金钱: 155 两
威望: 31 点
综合积分: 60 分
注册时间: 2013-07-15
最后登录: 2013-10-16
4楼  发表于: 2013-08-02 13:38

 回 3楼(911gt3) 的帖子

如何使用这些驱动有示例程序吗?