GPIO模拟I2C demo

#define SCK_TIME                  2

#define ACK_TIME                  3

#define START_TIME              5

 


static void i2c_start(void) 
{  
    gpio_direction_output(SDA, 1); 
    gpio_direction_output (SCL, 1);
    udelay(SCK_TIME);
    gpio_set_value(SDA, 0);

    udelay(START_TIME);  
    gpio_set_value(SCL, 0);

 

static void i2c_stop(void) 
{  
    udelay(SCK_TIME);
    gpio_direction_output(SDA, 0);
    gpio_set_value(SCL, 1);  
    udelay(SCK_TIME);  
    gpio_set_value(SDA, 1);

}  
 

static unsigned char i2c_read_ack(void) 
{  
    unsigned char r;  
    gpio_direction_input(SDA);
    udelay(ACK_TIME);  
    gpio_set_value(SCL,1);
    udelay(1);
    r = gpio_get_value(SDA);
    udelay(1);  
    gpio_set_value(SCL,0);
 
    return r; 

 

static void i2c_send_ack(void) 
{  
    udelay(SCK_TIME);
    gpio_direction_output(SDA, 1);
    gpio_set_value(SCL,1);
    udelay(SCK_TIME);  
    gpio_set_value(SCL,0);

 

static void i2c_write_byte(unsigned char b) 
{  
    int i;


    for (i=7; i>=0; i--) { 
        udelay(SCK_TIME); 
        gpio_direction_output(SDA, b & (1<<i));
        udelay(SCK_TIME - 2);
        gpio_set_value(SCL, 1);
        udelay(SCK_TIME); 
        gpio_set_value(SCL, 0);
    }  
    i2c_read_ack();


 


static unsigned char i2c_read_byte(void) 
{  
    int i;  
    unsigned char r = 0;
    gpio_direction_input(SDA);


    for (i=7; i>=0; i--) {  
        udelay(SCK_TIME * 5);  
        gpio_set_value(SCL, 1);  
        r |= (gpio_get_value(SDA) << i);
        udelay(SCK_TIME * 5);  
        gpio_set_value(SCL, 0);
    }  
    i2c_send_ack();
 
    return r; 

}


static void i2c_read(unsigned char addr, unsigned char reg, unsigned char* buf, int len) 
{  

    int i;  
    unsigned char t;  
    i2c_start();
    t = (addr << 1) | 0;
    i2c_write_byte(t); 
    i2c_write_byte(reg);
    i2c_start();
    t = (addr << 1) | 1;
    i2c_write_byte(t);
 
    for (i=0; i<len; i++)  
        buf[i] = i2c_read_byte();  
    i2c_stop();

 

static void i2c_write (unsigned char addr, unsigned char reg, unsigned char* buf, int len) 
{  
    int i;  
    unsigned char t;  
    i2c_start();
    t = (addr << 1) | 0;
    i2c_write_byte(t);
    i2c_write_byte(reg);


    for (i=0; i<len; i++)  
        i2c_write_byte(buf[i]);  
    i2c_stop();

}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值