使用GPIO模拟I2C,标准版

直接上源码


#include <stdio.h>
#include <stdlib.h>

#define   SCL    (1 << 0)
#define   SDA    (1 << 1)

void delay_us(unsigned int usec)   
{   
    volatile int i,j;   
   
        for(i = 0 ; i< usec * 5 ;i++)   
        {   
            for(j = 0 ; j < 50 * 6 ; j++)   
                {;}   
        }
}

static void gpio_dir_input(unsigned char gpio_i2c_func)   
{
    /*set SCL input. */
    if(gpio_i2c_func & SCL)   
    {   
    
    }  
    
    /*set SDA input. */
    if(gpio_i2c_func & SDA)   
    {  
    
    }

    return;
}

static void gpio_dir_output(unsigned char gpio_i2c_func)   
{
    /*set SCL output. */
    if(gpio_i2c_func & SCL)   
    {   
    
    }   
    /*set SDA output. */
    if(gpio_i2c_func & SDA)   
    {  
    
    }

    return;
}

static int gpio_get_value(unsigned char gpio_i2c_func)   
{
    int ret;
    
    /*get SDA value, only for input. */
    if(gpio_i2c_func & SDA)   
    {  
        //ret = ;
    }
    else
    {
        printf("unsupport.\n");
    }

    return ret;
}

static void gpio_clr(unsigned char gpio_i2c_func)   
{   
    /*clear SCL func. */
    if(gpio_i2c_func & SCL)   
    {   
    
    }   
    /*clear SDA func. */
    if(gpio_i2c_func & SDA)   
    {  
    
    }

    return;   
}   
   
static void  gpio_set(unsigned char gpio_i2c_func)   
{     
    /*set SCL func. */
    if(gpio_i2c_func & SCL)   
    {   
    
    }   
    /*set SDA func. */
    if(gpio_i2c_func & SDA)   
    {  
    
    }
    
    return;
}   
    
static unsigned char i2c_data_read(void)   
{   
    unsigned char regvalue;   
       
    gpio_dir_input(SDA);  
    delay_us(1);   

    regvalue = gpio_get_value(SDA);   
    if((regvalue&SDA) != 0)   
        return 1;   
    else   
        return 0;   
}   
   
static void i2c_start_bit(void)   
{   
    gpio_dir_output(SDA | SCL);
    
    delay_us(1);   
    gpio_set(SDA | SCL);   
    delay_us(1);   
    gpio_clr(SDA);   
    delay_us(1);
}   
   
static void i2c_stop_bit(void)   
{   
    gpio_dir_output(SDA | SCL);
    
    /* clock the ack */   
    delay_us(1);   
    gpio_set(SCL);   
    delay_us(1);    
    gpio_clr(SCL);     

    /* actual stop bit */   
    delay_us(1);   
    gpio_clr(SDA);   
    delay_us(1);   
    gpio_set(SCL);   
    delay_us(1);   
    gpio_set(SDA);   
    delay_us(1);   
}   
   
static void i2c_send_byte(unsigned char c)   
{   
    int i;   

    gpio_dir_output(SDA | SCL);

    for (i=0; i<8; i++)   
    {   
        delay_us(1);   
        gpio_clr(SCL);   
        delay_us(1);   
   
        if (c & (1<<(7-i)))   
            gpio_set(SDA);   
        else   
            gpio_clr(SDA);   
   
        delay_us(1);   
        gpio_set(SCL);   
        delay_us(1);   
        gpio_clr(SCL);   
    }
    
    delay_us(1);   
    // gpio_i2c_set(SDA);   
}   
   
static unsigned char i2c_receive_byte(void)   
{   
    int j=0;   
    int i;   
    unsigned char regvalue;   

    gpio_dir_output(SDA | SCL);

    for (i=0; i<8; i++)   
    {   
        delay_us(1);   
        gpio_clr(SCL);   
        delay_us(1);   
        gpio_set(SCL);   
           
        gpio_dir_input(SDA);
        delay_us(1);   
           
        if (i2c_data_read())   
            j+=(1<<(7-i));   
   
        delay_us(1);   
        gpio_clr(SCL);   
    }   

    delay_us(1);   
   // gpio_i2c_clr(SDA);   
   
    return j;   
}   
   
static int i2c_receive_ack(void)   
{   
    int nack;   
    unsigned char regvalue;   

    gpio_dir_output(SDA | SCL);

    delay_us(1);   

    gpio_dir_input(SDA);
       
    delay_us(1);   
    gpio_clr(SCL);   
    delay_us(1);   
    gpio_set(SCL);   
    delay_us(1);   

    nack = i2c_data_read();   
   
    delay_us(1);   
    gpio_clr(SCL);   
    delay_us(1);   
    //gpio_i2c_set(SDA);   
    //delay_us(1);   
   
    if (nack == 0)   
        return 1;    
   
    return 0;   
}   
   
   
unsigned char gpio_i2c_read(unsigned char devaddress, unsigned char address)   
{   
    int rxdata;   
   
    i2c_start_bit();   
    i2c_send_byte((unsigned char)(devaddress));   
    i2c_receive_ack();   
    i2c_send_byte(address);   
    i2c_receive_ack();      
    i2c_start_bit();   
    i2c_send_byte((unsigned char)(devaddress) | 1);   
    i2c_receive_ack();   
    rxdata = i2c_receive_byte();   
    //i2c_send_ack();   
    i2c_stop_bit();   
   
    return rxdata;   
}   

void gpio_i2c_write(unsigned char devaddress, unsigned char address, unsigned char data)   
{          
    i2c_start_bit();   
    i2c_send_byte((unsigned char)(devaddress));   
    i2c_receive_ack();   
    i2c_send_byte(address);   
    i2c_receive_ack();   
    i2c_send_byte(data);    
   // i2c_receive_ack();
    i2c_stop_bit();   
}   

int main()
{

    gpio_i2c_read(0x64, 0x01);

    gpio_i2c_write(0x64, 0x02, 0x55);

    return 0;
}
//

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值