直接上源码
#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;
}
//