示例#1
0
void lib_i2c_writereg(unsigned char address, unsigned char reg, unsigned char value)
{
    lib_i2c_start((address << 1) + I2C_WRITE);
    lib_i2c_write(reg); // Master Transmit Data ACK
    lib_i2c_write(value);
    lib_i2c_stop();
}
示例#2
0
void lib_i2c_writereg(unsigned char address, unsigned char reg, unsigned char value)
{
    lib_i2c_start((address << 1) + I2C_WRITE);
    lib_i2c_write(reg);
    lib_i2c_write(value);
    lib_i2c_stop();
}
示例#3
0
/*************************************************************************
 Send one byte to I2C device
 
 Input:    byte to be transfered
 Return:   0 write successful 
           1 write failed
*************************************************************************/
unsigned char lib_i2c_write(unsigned char data)
{
    int i = 8;
    // transmit byte
    while (i--) {
        SCL_L;
        I2C_delay();
        if (data & 0x80)
            SDA_H;
        else
            SDA_L;
        data <<= 1;
        I2C_delay();
        SCL_H;
        I2C_delay();
    }
    SCL_L;

    if (lib_i2c_waitack()) {
        lib_i2c_stop();
        return 1;
    }

    return 0;
}
示例#4
0
unsigned char lib_i2c_readreg(unsigned char address,unsigned char reg) {
    lib_i2c_start_wait((address<<1)+I2C_WRITE);
    lib_i2c_write(reg);
    lib_i2c_rep_start((address<<1)+I2C_READ);

    unsigned char returnvalue = lib_i2c_readnak();

    lib_i2c_stop();
   
    return(returnvalue);
}
示例#5
0
void lib_i2c_readdata(unsigned char address,unsigned char reg,unsigned char *data,unsigned char length) {
    lib_i2c_start_wait((address<<1)+I2C_WRITE);
    lib_i2c_write(reg);
    lib_i2c_rep_start((address<<1)+I2C_READ);

    while (--length) {
        *data++ = lib_i2c_readack();
    }
    *data = lib_i2c_readnak();

    lib_i2c_stop();
}
示例#6
0
char readgps()
   { // returns 1 if new data was read
   if (lib_timers_gettimermicroseconds(gpstimer)<50000) return(0); // 20 hz

   gpstimer=lib_timers_starttimer();
   
   unsigned char shiftedaddress=I2C_GPS_ADDRESS<<1;
   lib_i2c_start_wait(shiftedaddress+I2C_WRITE);
   if (lib_i2c_write(I2C_GPS_STATUS_00))
      return(0); 

   lib_i2c_rep_start(shiftedaddress+I2C_READ);

   unsigned char gps_status= lib_i2c_readnak();
 
   global.gps_num_satelites = (gps_status & 0xf0) >> 4;
   if (gps_status & I2C_GPS_STATUS_3DFIX) 
      { //Check is we have a good 3d fix (numsats>5)
      long longvalue;
      unsigned char *ptr=(unsigned char *)&longvalue;
      
      lib_i2c_rep_start(shiftedaddress+I2C_WRITE);
      lib_i2c_write(I2C_GPS_LOCATION); 
      lib_i2c_rep_start(shiftedaddress+I2C_READ);

      *ptr++ = lib_i2c_readack();
      *ptr++ = lib_i2c_readack();
      *ptr++ = lib_i2c_readack();
      *ptr = lib_i2c_readack();

      global.gps_current_latitude=lib_fp_multiply(longvalue,27488L); // convert from 10,000,000 m to fixedpointnum
      
      ptr=(unsigned char *)&longvalue;
      
      *ptr++ = lib_i2c_readack();
      *ptr++ = lib_i2c_readack();
      *ptr++ = lib_i2c_readack();
      *ptr = lib_i2c_readnak();
      
      global.gps_current_longitude=lib_fp_multiply(longvalue,27488L); // convert from 10,000,000 m to fixedpointnum

      int intvalue;
      ptr= (unsigned char *)&intvalue;
      
      lib_i2c_rep_start(shiftedaddress+I2C_WRITE);
      lib_i2c_write(I2C_GPS_GROUND_SPEED); 
      lib_i2c_rep_start(shiftedaddress+I2C_READ);

      *ptr++ = lib_i2c_readack();
      *ptr++ = lib_i2c_readack();
      
      global.gps_current_speed=intvalue*665L; // convert fro cm/s to fixedpointnum to m/s
      
      ptr= (unsigned char *)&intvalue;
      *ptr++ = lib_i2c_readack();
      *ptr = lib_i2c_readnak();

      global.gps_current_altitude=((fixedpointnum)intvalue)<<FIXEDPOINTSHIFT;

      lib_i2c_stop();
      return(1);
      }
   lib_i2c_stop();

   return(0);
   }