// ***************************************************************************** // example for reading device ID // address is the 7 bit address // ***************************************************************************** int main(int argc, char **argv) { uint8_t buf[64], j; struct bcm2835_i2cbb ibb; // address, sda,scl,clock_freq,timeout if(bcm2835_i2cbb_open(&ibb,0x21,17,21,300,1000000)) exit(1); // discover addresses on bus bcm8235_i2cbb_discover(&ibb, 0x10, 0xe0); // most devices have a command 0x55, this will return an incrementing // count // &ibb.address = 0x21; // change address if required // bcm8235_i2cbb_putc(&ibb, 0x55); // bcm8235_i2cbb_gets(&ibb, buf, 4); // for(j=0;j<4;j++) { // printf("read %x\n",buf[j]); // } // BV4208 & BV4218 I2C LCD display // Clear screen and print Hello // ibb.address = 0x21; // address // buf[0]=1; // lcd command // buf[1]=1; // clear screen // bcm8235_i2cbb_puts(&ibb, buf, 2); // sleep(1); // cls takes a while // strcpy(buf,"\2Hello"); // 2 is command for writing data // bcm8235_i2cbb_puts(&ibb, buf, strlen(buf)); // Relay BV4502 // ibb.address = 0x31; // address // buf[0]=1; // relay A // buf[1]=1; // on // bcm8235_i2cbb_puts(&ibb, buf, 2); // sleep(3); // buf[1]=0; // off // bcm8235_i2cbb_puts(&ibb, buf, 2); // ADC BV4205 // ibb.address = 0x31; // address // set auto scan // buf[0]=6; // autoscan command // buf[1]=1; // on // bcm8235_i2cbb_puts(&ibb, buf, 2); // buf[0] = 7; // autoscan read // buf[1] = 0; // start at 0 // get all 20 readings // bcm8235_i2cbb_puts(&ibb, buf, 2); // auto scan // bcm8235_i2cbb_gets(&ibb, buf, 20); // uint16_t v; // for(j=0;j<20;j+=2) { // v = (buf[j]*256) + buf[j]+1; // printf("\n A%d %u ",j,v); // } exit(0); }
int main(int argc, char **argv) { char msg[MAX_GPS_MSG_LEN+1]; struct bcm2835_i2cbb ibb; uint32_t speed = 250; uint32_t kbit = 100; if (argc > 1) { kbit = atoi(argv[1]); switch (kbit) { case 50: speed = 500; break; // 500 gives roughly 50Kbit/s case 100: speed = 250; break; // 250 gives roughly 100Kbit/s case 200: speed = 100; break; // 100 gives roughly 200Kbit/s case 300: speed = 50; break; // 50 gives roughly 300Kbit/s case 400: speed = 23; break; // 23 gives roughly 400Kbit/s default: printf("Bad speed '%s'=%u, should be 50,100,200,300 or 400\n", argv[1], kbit); exit(1); } } printf("Using speed ~ %u Kbit/s\n", kbit); // address, sda,scl,clock_freq,timeout if(bcm2835_i2cbb_open(&ibb,0x42,2,3,speed,1000000)) { printf("Failed to initialize bitbanged I2C. Aborting...\n"); exit(1); } while(1) { int len = gps_read_message(&ibb, msg); if (len > 0) { gps_process_message(msg, len); } gps_delay_ms(100); } exit(0); }
void startI2Cgps(void) { gpsi2c.address = GPS_ADDR; bcm2835_i2cbb_open(&gpsi2c, GPS_ADDR, 2, 3, 300, 2000000); }