static unsigned i2csw_Read(int dev, bool last) { unsigned char val = 0; int i, databit; // read data byte for(i=0; i<8; i++) { set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // set SDA as input set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // send a clock databit = read_sda(dev); val = (val << 1) | (unsigned char)databit; } set_pins(dev, 0, 1); if (last == false) { // send ACK set_pins(dev, 0, 0); delay_us(I2CSW_delay[dev]); // set SDA = 0 set_pins(dev, 1, 0); delay_us(I2CSW_delay[dev]); // send a clock set_pins(dev, 0, 0); } else { // send NACK set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // set SDA = 1 set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // send a clock set_pins(dev, 0, 1); } return (unsigned)val; }
static bool i2csw_Write(int dev, unsigned char val) { int i, databit; // send data byte for(i=0; i<8; i++) { databit = ((val & 0x80) == 0)? 0 : 1; set_pins(dev, 0, databit); delay_us(I2CSW_delay[dev]); // set data bit set_pins(dev, 1, databit); delay_us(I2CSW_delay[dev]); // send a clock set_pins(dev, 0, databit); val = val << 1; } // read ACK set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // set SDA as input set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // send a clock if (read_sda(dev) == 1) { err_SetMsg(ERROR_I2CACKERR, "receive no ACK after transmitting"); return false; } set_pins(dev, 0, 1); return true; }
//----------------------------------------------------------------------------- uint16_t AD_readRegister(uint8_t in_reg_addr) { uint8_t A2,A1,A0; A2=(in_reg_addr&0x4)>>2; A1=(in_reg_addr&0x2)>>1; A0=in_reg_addr&0x1; set_sdadir(GPIO_DIR_OUTPUT); set_scl_L(); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); set_en(1); delay(2); delay(2); set_en(0); delay(2); set_scl_L(); set_sda(1); delay(2); // read set_scl_H(); delay(2); set_scl_L(); delay(2); set_sda(A2); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); set_sda(A1); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); set_sda(A0); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2);set_sdadir(GPIO_DIR_INPUT); set_scl_H(); set_sdadir(GPIO_DIR_INPUT); delay(2); int i; uint16_t r = 0; for (i=8; i>=0; i--) { set_scl_L(); // SCL变低 delay(1); set_scl_H(); // SCL变高 r = (r <<1) | read_sda(); //从高位到低位依次准备数据进行读取 delay(1); } delay(2); set_en(1); set_scl_L(); delay(2); set_scl_H(); delay(2); set_scl_L(); delay(2); return (r); }
static bool i2csw_Start(int dev, unsigned char addr, unsigned char rwbit, bool restart) { int i, databit; if (restart == false) { // send START signal set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 1 set_pins(dev, 1, 0); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 0 set_pins(dev, 0, 0); // SCL = 0, SDA = 0 } else if (I2C_swMode[dev] == I2CSW_LEGO) { // send LEGO NXT's I2C RESTART signal set_pins(dev, 0, 0); delay_us(I2CSW_delay[dev]); // SCL = 0, SDA = 0 set_pins(dev, 1, 0); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 0 set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 1 set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // LEGO NXT special: SCL = 0, SDA = 1 set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 1 set_pins(dev, 1, 0); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 0 set_pins(dev, 0, 0); // SCL = 0, SDA = 0 } else { // send normal I2C RESTART signal set_pins(dev, 0, 0); delay_us(I2CSW_delay[dev]); // SCL = 0, SDA = 0 set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // SCL = 0, SDA = 1 set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 1 set_pins(dev, 1, 0); delay_us(I2CSW_delay[dev]); // SCL = 1, SDA = 0 set_pins(dev, 0, 0); // SCL = 0, SDA = 0 } // send data byte addr = (addr << 1) | rwbit; for(i=0; i<8; i++) { databit = ((addr & 0x80) == 0)? 0 : 1; set_pins(dev, 0, databit); delay_us(I2CSW_delay[dev]); // set data bit set_pins(dev, 1, databit); delay_us(I2CSW_delay[dev]); // send a clock set_pins(dev, 0, databit); addr = addr << 1; } // read ACK set_pins(dev, 0, 1); delay_us(I2CSW_delay[dev]); // set SDA as input set_pins(dev, 1, 1); delay_us(I2CSW_delay[dev]); // send a clock if (read_sda(dev) == 1) { err_SetMsg(ERROR_I2CACKERR, "receive no ACK after transmitting"); return false; } set_pins(dev, 0, 1); return true; }
int main(void) { int test; unsigned char byte; // PCF_ADRESS = 0; // Adresse des PCF'S printf("*** i²c-LCD Test (c) Ingo Gerlach 10/2000 *** \n"); COM = 0; // Vorbelegung Ser - Port, 0 Automatisch suchen set_port_delay(15); // Portdelay 0-255 test = init_iic(COM); // Init ii2c printf("Suche i2c-Interface..."); if (test) { printf(" gefunden an Port 0x%03xh! \n",test); } else { printf("Interface nicht gefunden.\n"); exit (0); } /* set_strobe(1); // Für den Seriellen Port nur dummy io_disable(0); */ sda_high(); scl_high(); printf("read_sda %d \n",read_sda()); printf("read_scl %d \n",read_scl()); iic_start(); byte =getchar(); iic_stop(); sda_low(); scl_low(); printf("read_sda %d \n",read_sda()); printf("read_scl %d \n",read_scl()); lcd_backlight(0); byte = getchar(); printf("deinit %d\n",deinit_iic()); return 0; }