gpioアナログi 2 cタイミングコードを使って、自分で測ってもいいです.
4483 ワード
参考:https://blog.csdn.net/huoyu_/アート/detail/53373815
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define DELAY 1
typedef unsigned char u8;
typedef unsigned short u16;
/* , */
// xms
void delay(unsigned int xms) // xms
{
unsigned int x,y;
for(x = xms; x > 0; x--)
for(y = 110; y > 0; y--);
}
/******************************start*****************************************/
static void i2c_start(void)
{
gpio_direction_output(SDA_PIN, 1);
gpio_direction_output(CLK_PIN, 1);
delay(DELAY);
gpio_set_value(SDA_PIN, 0);
delay(DELAY);
gpio_set_value(CLK_PIN, 0);
delay(DELAY);
}
/**********************************************stop****************************************/
static void i2c_stop(void)
{
gpio_set_value(CLK_PIN, 0);
gpio_set_value(SDA_PIN, 0);
delay(DELAY);
gpio_set_value(CLK_PIN, 1);
delay(DELAY);
gpio_set_value(SDA_PIN, 1);
delay(DELAY);
}
/********************************send_ack****************************************/
/* ack 1 NACK, ack 0 ACK */
static void i2c_send_ack(u8 ack)
{
if(ack)
gpio_direction_output(SDA_PIN, 1);
else
gpio_direction_output(SDA_PIN, 0);
delay(DELAY);
gpio_set_value(CLK_PIN, 1);
delay(DELAY);
gpio_set_value(CLK_PIN, 0);
delay(DELAY);
}
/********************************receive_ack*********************************/
/* 1 ACK, 0 ACK */
static u8 i2c_receive_ack(void)
{
u8 rc = 0;
gpio_direction_input(SDA_PIN);
gpio_set_value(CLK_PIN, 1);
delay(DELAY);
/* ack , , ACK */
if(gpio_get_value(SDA_PIN))
{
rc = 1;
}
gpio_set_value(CLK_PIN, 0);
gpio_direction_output(SDA_PIN, 1);
return rc;
}
/********************************send****************************************/
/* 0, ACK ,
* 1, ACK ,
*/
static u8 i2c_send_byte(u8 send_byte)
{
u8 rc = 0;
u8 out_mask = 0x80;
u8 value;
u8 count = 8;
while(count > 0)
{
value = ((send_byte & out_mask) ? 1 : 0);
if (value == 1)
{
gpio_set_value(SDA_PIN, 1);
}
else
{
gpio_set_value(SDA_PIN, 0);
}
delay(DELAY);
gpio_set_value(CLK_PIN, 1);
delay(DELAY);
gpio_set_value(CLK_PIN, 0);
delay(DELAY);
out_mask >>= 1;
count--;
}
gpio_set_value(SDA_PIN, 1);
rc = i2c_receive_ack();
return rc;
}
/**********************************************receive*************************************/
static void i2c_read_byte(u8 *buffer, u8 ack)
{
u8 count = 0x08;
u8 data = 0x00;
u8 temp = 0;
gpio_direction_input(SDA_PIN);
while(count > 0)
{
gpio_set_value(CLK_PIN, 1);
delay(DELAY);
temp = gpio_get_value(SDA_PIN);
data <<= 1;
if (temp)
data |= 0x01;
gpio_set_value(CLK_PIN, 0);
delay(DELAY);
count--;
}
i2c_send_ack(ack);//0 = ACK, 1 = NACK
*buffer = data;
}
// client ,len ???
/***********************************************write_bytes********************************/
/* 0 ACK ,
* 1 ACK ,
*/
static u8 i2c_write(u8 device_id, u8 reg_address, u8* data, u8 len)
{
u8 rc = 0;
u8 i;
i2c_start();
rc |= i2c_send_byte( (device_id << 1) | 0x00 );
if ( 0 != rc )
{
printf("i2c_send_byte failed, no ack back
");
return rc;
}
delay(10);
rc |= i2c_send_byte(reg_address);
if ( 0 != rc )
{
printf("i2c_send_byte failed, no ack back
");
return rc;
}
delay(10);
if(data==NULL ||0==len)
{
i2c_stop();
return rc;
}
delay(10);
for(i=0; i
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* gpio , value */
static void gpio_direction_output(unsigned int gpio, int value)
{
//
}
/* gpio */
static void gpio_direction_input(unsigned int gpio)
{
//
}
/* gpo value */
static void gpio_set_value(unsigned int gpio, int value)
{
//
}
// gpio
static unsigned int gpio_get_value(unsigned int gpio)
{
//
}