diff options
Diffstat (limited to 'testhal/STM32/I2C/lis3.c')
-rw-r--r-- | testhal/STM32/I2C/lis3.c | 67 |
1 files changed, 19 insertions, 48 deletions
diff --git a/testhal/STM32/I2C/lis3.c b/testhal/STM32/I2C/lis3.c index 06f6da1d0..7e7c9d221 100644 --- a/testhal/STM32/I2C/lis3.c +++ b/testhal/STM32/I2C/lis3.c @@ -30,19 +30,21 @@ static void i2c_lis3_error_cb(I2CDriver *i2cp, I2CSlaveConfig *i2cscfg){ static I2CSlaveConfig lis3 = {
NULL,
i2c_lis3_error_cb,
- accel_rx_data,
- ACCEL_RX_DEPTH,
0,
0,
+ accel_rx_data,
accel_tx_data,
- ACCEL_TX_DEPTH,
+ 0b0011101,
+ 7,
0,
0,
- 0b0011101,
- FALSE,
+ {NULL},
};
+
+
+
/**
* This treading need for convenient realize
* "read through write" process.
@@ -82,26 +84,13 @@ static msg_t I2CAccelThread(void *arg) { /* This callback raise up when transfer finished */
static void i2c_lis3_cb(I2CDriver *i2cp, I2CSlaveConfig *i2cscfg){
+ (void) i2cscfg;
- if (i2cp->id_slave_config->restart){ // is it restart flag set to TRUE
- /* reset restart flag */
- i2cp->id_slave_config->restart = FALSE;
- /* now send restart and read acceleration data.
- * Function i2cMasterReceive() send restart implicitly. */
- i2cMasterReceive(i2cp, i2cscfg);
- }
- else{
- /* If jump here than requested data have been read.
- * Stop communication, release bus and wake up processing thread */
- i2cMasterStop(i2cp);
- i2cReleaseBus(&I2CD1);
-
- // wake up heavy thread for data processing
- if (i2c_accel_tp != NULL) {
- i2c_accel_tp->p_msg = (msg_t)i2cp;
- chSchReadyI(i2c_accel_tp);
- i2c_accel_tp = NULL;
- }
+ // only wake up processing thread
+ if (i2c_accel_tp != NULL) {
+ i2c_accel_tp->p_msg = (msg_t)i2cp;
+ chSchReadyI(i2c_accel_tp);
+ i2c_accel_tp = NULL;
}
}
@@ -121,25 +110,19 @@ int init_lis3(void){ while (i2c_accel_tp == NULL)
chThdSleepMilliseconds(1);
- lis3.txbufhead = 0;
- lis3.rxbufhead = 0;
-
+ lis3.rxbytes = 0; //set to 0 because we need only transmit
- /* Write configuration data */
+ /* configure accelerometer */
lis3.txbytes = 4;
- /* fill transmit buffer. See datasheet to understand what we write */
- lis3.txbuf[0] = ACCEL_CTRL_REG1 | AUTO_INCREMENT_BIT;
+ lis3.txbuf[0] = ACCEL_CTRL_REG1 | AUTO_INCREMENT_BIT; // register address
lis3.txbuf[1] = 0b11100111;
lis3.txbuf[2] = 0b01000001;
lis3.txbuf[3] = 0b00000000;
- /* setting callback */
- lis3.id_callback = i2c_lis3_cb;
-
- i2cAcquireBus(&I2CD1);
-
/* sending */
i2cMasterTransmit(&I2CD1, &lis3);
+ chThdSleepMilliseconds(1);
+ lis3.id_callback = i2c_lis3_cb;
return 0;
}
@@ -148,23 +131,11 @@ int init_lis3(void){ *
*/
void request_acceleration_data(void){
-
- /* fill transmit buffer with address of register that we want to read */
- lis3.txbufhead = 0;
lis3.txbuf[0] = ACCEL_OUT_DATA | AUTO_INCREMENT_BIT; // register address
lis3.txbytes = 1;
-
- /* tune receive structures */
- lis3.rxbufhead = 0;
lis3.rxbytes = 6;
-
- /* Now it is most important action. We must set restart flag to TRUE.
- * And in callback function we must reset it to FALSE after sending
- * of register address. In TMP75 and MAX1236 this flag does not use. */
- lis3.restart = TRUE;
-
- /* talk to slave what we want from it */
i2cAcquireBus(&I2CD1);
i2cMasterTransmit(&I2CD1, &lis3);
+ i2cReleaseBus(&I2CD1);
}
|