// Adapted from send_8bit_serial_data() void send_616bit_serial_data(struct uint640_t * data_full) { unsigned char data; // data byte // p_data points to the most significant byte in data_full unsigned char * p_data = (unsigned char *) data_full; p_data += (sizeof(struct uint640_t) - 1); int i; int delay; // ? output_low(SR_OUT); // select device output_high(SR_EN); // send bits 640..(640-616) for (i=0; i<616; i++) { // Move to next byte after 8 bits if ((i & 0x07) == 0) { // faster equivalence of (i % 8 == 0) data = *p_data; --p_data; printf("Write byte: 0x%02x (0b%s).\n", data, byte_to_binary(data)); } // consider leftmost bit // set line high if bit is 1, low if bit is 0 if (data & 0x80) output_high(SR_IN); else output_low(SR_IN); // pulse clock to indicate that bit value should be read output_low(SR_CK); printf("-- write to register: 0x%02x (0b%s)\n", dest_register[0], byte_to_binary(dest_register[0])); write_to_register(); for (delay = 0; delay < LED_DELAY; delay++); // pulse clock to indicate that bit value should be read output_high(SR_CK); printf("-- write to register: 0x%02x (0b%s)\n", dest_register[0], byte_to_binary(dest_register[0])); write_to_register(); for (delay = 0; delay < LED_DELAY; delay++); // shift byte left so next bit will be leftmost data <<= 1; } // deselect device output_low(SR_EN); }
void imu_init() { lock = 0; i2c_open(&imuConn, PIN_IMU_SCL, PIN_IMU_SDA, 0); // Gyro initialization. // 22 -> 11011 Set internal clock and scale. // 21 -> 9 Set sample rate. // 23 -> 101 Trigger interrupt when new data is ready (extra int pins). // 62 -> 1 Set clock source. write_to_register(&imuConn, GYRO_ADDR, 0x16, 0x1A); write_to_register(&imuConn, GYRO_ADDR, 0x15, 0x09); write_to_register(&imuConn, GYRO_ADDR, 0x17, 0x05); write_to_register(&imuConn, GYRO_ADDR, 0x3E, 1); // Accel initialization. // 45 -> 1000, 100 Wake it from sleep, keep it awake. // 49 -> 01 Set the data range. 00->2, 01->4, 10->8, 11->16 (+- g). write_to_register(&imuConn, ACCL_ADDR, 0x2D, 16); write_to_register(&imuConn, ACCL_ADDR, 0x2D, 8); write_to_register(&imuConn, ACCL_ADDR, 0x31, 0); // Might need to change this later. //writeToRegister(&imuConn, ACCL_ADDR, 0x1E, -25/-4); -25 // Tuning values. //writeToRegister(&imuConn, ACCL_ADDR, 0x1F, 12/-4); 12 //writeToRegister(&imuConn, ACCL_ADDR, 0x20, 249/4); 249 }
// Transmit byte serially, MSB first // from: https://en.wikipedia.org/wiki/Bit_banging void send_8bit_serial_data(unsigned char data) { int i; int delay; // ? output_low(SR_OUT); // select device output_high(SR_EN); // send bits 7..0 for (i=0; i<8; i++) { // consider leftmost bit // set line high if bit is 1, low if bit is 0 if (data & 0x80) output_high(SR_IN); else output_low(SR_IN); // pulse clock to indicate that bit value should be read output_low(SR_CK); printf("-- write to register: 0x%02x (0b%s)\n", dest_register[0], byte_to_binary(dest_register[0])); write_to_register(); for (delay = 0; delay < LED_DELAY; delay++); // pulse clock to indicate that bit value should be read output_high(SR_CK); printf("-- write to register: 0x%02x (0b%s)\n", dest_register[0], byte_to_binary(dest_register[0])); write_to_register(); for (delay = 0; delay < LED_DELAY; delay++); // shift byte left so next bit will be leftmost data <<= 1; } // deselect device output_low(SR_EN); }