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を受け取るときやデータを読み取るときは入力端として動作します!