// 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);
}
Пример #2
0
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);
}