gpio模拟i2c 读取24c02寄存器的值为0xff?
我把24c02的A0,A1,A2悬空,把wp接地,用的是hi3515板子,下面是我的代码:
#include <linux/module.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/workqueue.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#include "gpio_i2c.h"
/* GPIO0_0 */
#define SCL (1 << 6) /* 6 indicated 6th bit*/
/* GPIO0_1 */
#define SDA (1 << 7)
#define GPIO_I2C_BASE 0x20180000
#define GPIO_I2C_DIR IO_ADDRESS(GPIO_I2C_BASE + 0x400)
#define GPIO_I2C_SDA_REG IO_ADDRESS(GPIO_I2C_BASE + (SDA<<2)) /* data reg */
#define GPIO_I2C_SCL_REG IO_ADDRESS(GPIO_I2C_BASE + (SCL<<2))
#define GPIO_I2C_SCLSDA_REG IO_ADDRESS(GPIO_I2C_BASE + 0x300)
#define HW_REG(reg) *((volatile unsigned int *)(reg))
#define DELAY(us) time_delay_us(us)
static void i2c_clr(unsigned char whichline)
{
unsigned char regvalue;
if(whichline == SCL)
{
regvalue = HW_REG(GPIO_I2C_DIR);
regvalue |= SCL;
HW_REG(GPIO_I2C_DIR) = regvalue; /* set scl dir output */
HW_REG(GPIO_I2C_SCL_REG) = 0; /* set scl data 0 */
return;
}
else if(whichline == SDA)
{
regvalue = HW_REG(GPIO_I2C_DIR);
regvalue |= SDA;
HW_REG(GPIO_I2C_DIR) = regvalue;
HW_REG(GPIO_I2C_SDA_REG) = 0;
return;
}
else if(whichline == (SDA|SCL))
{
regvalue = HW_REG(GPIO_I2C_DIR);
regvalue |= (SDA|SCL);
HW_REG(GPIO_I2C_DIR) = regvalue;
HW_REG(GPIO_I2C_SCLSDA_REG) = 0;
return;
}
else
{
printk("Error input.\n");
return;
}
}
static void i2c_set(unsigned char whichline)
{
unsigned char regvalue;
if(whichline == SCL)
{
regvalue = HW_REG(GPIO_I2C_DIR);
regvalue |= SCL;
HW_REG(GPIO_I2C_DIR) = regvalue;
HW_REG(GPIO_I2C_SCL_REG) = SCL;
return;
}
else if(whichline == SDA)
{
regvalue = HW_REG(GPIO_I2C_DIR);
regvalue |= SDA; <