From 08296d249c3b0dffa4a0abe5ee1d55e0d576c14a Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sun, 3 Apr 2011 19:25:00 +0200 Subject: Reading ITG-3200 to USB. --- main.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 3 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 18c2ab6..88d8693 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ #include #include #include +#include class LEDThread : public BaseThread { public: @@ -90,10 +91,116 @@ static PWMConfig pwmcfg = { USBSerial usbs; +I2CConfig i2cconfig = { + opmodeI2C, + 100000, /*!< Specifies the clock frequency. Must be set to a value lower than 400kHz */ + stdDutyCycle, /*!< Specifies the I2C fast mode duty cycle */ + 0, /*!< Specifies the first device 7-bit own address. */ + 0 /*!< Specifies the second part of device own address in 10-bit mode. Set to NULL if not used. */ +}; + +void cba(I2CDriver* i2cp, I2CSlaveConfig* i2cscfg) { + if(i2cp->id_slave_config->restart) { + i2cp->id_slave_config->restart = FALSE; + i2cMasterReceive(i2cp, i2cscfg); + //palSetPad(GPIOA, 5); + } else { + i2cMasterStop(i2cp); + } +} + +void cbe(I2CDriver* i2cp, I2CSlaveConfig* i2cscfg) { + //palClearPad(GPIOA, 5); + //while(1); +} + +i2cblock_t rxdata[6]; +i2cblock_t txdata[2] = {0x1d}; + +I2CSlaveConfig i2c_gyro = { + cba, + + cbe, + + rxdata, + 6, + 6, + 0, + + txdata, + 2, + 1, + 0, + + 0x68, + FALSE +}; + +uint8_t strbuf[64]; + +#include "foo.h" + +class I2CThread : public BaseThread { + public: + int16_t x, y, z; + + noreturn_t thread_main() { + i2cStart(&I2CD2, &i2cconfig); + while(I2CD2.id_state != I2C_READY) { + chThdSleepMilliseconds(1); + } + + palSetPadMode(GPIOB, 10, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); + palSetPadMode(GPIOB, 11, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); + + i2c_gyro.txbytes = 2; + i2c_gyro.txbuf[0] = 0x3e; + i2c_gyro.txbuf[1] = 0x03; + i2cMasterTransmit(&I2CD2, &i2c_gyro); + chThdSleepMilliseconds(2); + + i2c_gyro.txbytes = 2; + i2c_gyro.txbuf[0] = 0x16; + i2c_gyro.txbuf[1] = 0x18; + i2cMasterTransmit(&I2CD2, &i2c_gyro); + chThdSleepMilliseconds(2); + + while (1) { + I2CD2.id_state = I2C_READY; + i2c_gyro.txbufhead = 0; + i2c_gyro.txbuf[0] = 0x1d; + i2c_gyro.txbytes = 1; + i2c_gyro.rxbufhead = 0; + i2c_gyro.rxbytes = 6; + i2c_gyro.restart = TRUE; + + i2cMasterTransmit(&I2CD2, &i2c_gyro); + chThdSleepMilliseconds(2); + + x = rxdata[0] << 8 | rxdata[1]; + y = rxdata[2] << 8 | rxdata[3]; + z = rxdata[4] << 8 | rxdata[5]; + + usbprintf(usbs, "%6d, %6d, %6d\r\n", x, y, z); + + chThdSleepMilliseconds(100); + } + } +}; + +I2CThread i2c_thread; + int main(void) { halInit(); chSysInit(); + led_thread.start(); + + usbs.init(); + + i2c_thread.start(); + + /* pwmStart(&PWMD2, &pwmcfg); palSetPadMode(GPIOA, 0, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(GPIOA, 1, PAL_MODE_STM32_ALTERNATE_PUSHPULL); @@ -105,11 +212,9 @@ int main(void) { pwmEnableChannel(&PWMD2, 2, 1000); pwmEnableChannel(&PWMD2, 3, 1000); - led_thread.start(); - - usbs.init(); usb_thread.usbs = &usbs; usb_thread.start(); + */ while (1) { chThdSleepMilliseconds(1000); -- cgit v1.2.3