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)
{
    //         

}