Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
//-----------------------------------------------------------------------------
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);
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}