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(); }
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(); }
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); }
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(); }
/************************************************************************* Issues a start condition and sends address and transfer direction. return 0 = device accessible, 1= failed to access device *************************************************************************/ unsigned char lib_i2c_start(unsigned char address) { // Send start I2C_START(I2C); if (!I2C_WAIT_READY_ERROR(I2C)) return 3; // transmit address byte + direction if (lib_i2c_write(address)) // Master Transmit Address ACK return 2; return 0; } /* lib_i2c_start */
/************************************************************************* Issues a repeated start condition and sends address and transfer direction Input: address and transfer direction of I2C device Return: 0 device accessible 1 failed to access device *************************************************************************/ unsigned char lib_i2c_rep_start(unsigned char address) { /* Send data */ I2C_SET_CONTROL_REG(I2C, I2C_STA | I2C_SI); if (!I2C_WAIT_READY_ERROR(I2C)) return 4; if(I2C_GET_STATUS(I2C) != 0x10) // Master repeat start return 3; // transmit address byte + direction if (lib_i2c_write(address)) return 2; return 0; }
/************************************************************************* Issues a start condition and sends address and transfer direction. return 0 = device accessible, 1= failed to access device *************************************************************************/ unsigned char lib_i2c_start(unsigned char address) { // send START condition SDA_H; SCL_H; I2C_delay(); if (!SDA_read) return 1; SDA_L; I2C_delay(); if (SDA_read) return 1; SDA_L; I2C_delay(); // transmit address byte + direction if (lib_i2c_write(address)) return 2; return 0; } /* lib_i2c_start */
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); }