GPIOポートアナログIIC通信

2744 ワード

#define SDA 254                         //  SDA    GPIO      
#define SCL 255                         //  SCL    GPIO      
#define OUTP 1                          //  GPIO         
#define INP 0                           //  GPIO         
/* I2C     */  
int i2c_start()  
{  
//   GPIO   
set_gpio_direction(SDA, OUTP);          //  SDA       
set_gpio_direction (SCL, OUTP);         //  SCL       
         set_gpio_value(SDA, 1);                //  SDA      
set_gpio_value(SCL, 1);                 //  SCL      
delay();                            //    
//      
set_gpio_value(SDA, 0);                 //SCL     ,SDA      
delay();  
}  
/* I2C     */  
void i2c_stop()  
{  
set_gpio_value(SCL, 1);  
set_gpio_direction(SDA, OUTP);  
set_gpio_value(SDA, 0);  
delay();  
set_gpio_value(SDA, 1);             //SCL    ,SDA      
}  
/*   
I2C  ACK  (      )  
    :0  ACK    ; 0  ACK      
*/  
unsigned char i2c_read_ack()  
{  
unsigned char r;  
set_gpio_direction(SDA, INP);           //  SDA       
set_gpio_value(SCL,0);              // SCL    
r = get_gpio_value(SDA);                //  ACK    
delay();  
set_gpio_value(SCL,1);              // SCL    
delay();  
return r;  
}  
/* I2C  ACK  (      ) */  
int i2c_send_ack()  
{  
set_gpio_direction(SDA, OUTP);          //  SDA       
set_gpio_value(SCL,0);              // SCL    
set_gpio_value(SDA, 0);             //  ACK    
delay();  
set_gpio_value(SCL,1);              // SCL    
delay();  
}  
/* I2C    */  
void i2c_write_byte(unsigned char b)  
{  
int i;  
set_gpio_direction(SDA, OUTP);          //  SDA       
for (i=7; i>=0; i--) {  
set_gpio_value(SCL, 0);             // SCL    
delay();  
set_gpio_value(SDA, b & (1<=0; i--) {  
set_gpio_value(SCL, 0);         // SCL    
delay();  
r = (r <<1) | get_gpio_value(SDA);      //                  
set_gpio_value(SCL, 1);         // SCL    
delay();  
}  
i2c_send_ack();                 //       ACK    
return r;  
}  
/*  
I2C     
addr:        
buf:      
len:         
*/  
void i2c_read(unsigned char addr, unsigned char* buf, int len)  
{  
int i;  
unsigned char t;  
i2c_start();                        //    ,        
//             
t = (addr << 1) | 1;                    //   1,       
i2c_write_byte(t);  
//      
for (i=0; i

GPIOポートアナログIIC通信のときはSDA線が入力ポートとして、出力ポートとして、バイト送信のときはSDAが出力ポートとして、ACKを受け取るときやデータを読み取るときは入力端として動作します!