/** * TMP75 is most simple I2C device in our case. It is already useful with * default settings after powerup. * You only must read 2 sequential bytes from it. */ #include #include "ch.h" #include "hal.h" #include "tmp75.h" /* input buffer */ static i2cblock_t tmp75_rx_data[TMP75_RX_DEPTH]; static i2cblock_t tmp75_tx_data[TMP75_TX_DEPTH]; /* temperature value */ static int16_t temperature = 0; /* Simple error trap */ static void i2c_tmp75_error_cb(I2CDriver *i2cp, const I2CSlaveConfig *i2cscfg){ (void)i2cscfg; int status = 0; status = i2cp->id_i2c->SR1; while(TRUE); } /* This callback raise up when transfer finished */ static void i2c_tmp75_cb(I2CDriver *i2cp, const I2CSlaveConfig *i2cscfg){ (void)*i2cp; /* store temperature value */ temperature = (i2cscfg->rxbuf[0] << 8) + i2cscfg->rxbuf[1]; } /* Fill TMP75 config. */ static const I2CSlaveConfig tmp75 = { i2c_tmp75_cb, i2c_tmp75_error_cb, tmp75_rx_data, tmp75_tx_data, }; #define tmp75_addr 0b1001000 /* This is main function. */ void request_temperature(void){ #define TXBYTES 0 /* set to zero because we need only reading */ #define RXBYTES 2 /* we need to read 2 bytes */ i2cAcquireBus(&I2CD2); i2cMasterReceive(&I2CD2, &tmp75, tmp75_addr, RXBYTES); i2cReleaseBus(&I2CD2); }