split periodic function into configure and read in itg3200, adxl345 and

hmc58xx drivers
umarim and navgo imu drivers updated
This commit is contained in:
Gautier Hattenberger
2011-11-16 16:43:41 +01:00
parent ea7479aed1
commit cf10806a08
6 changed files with 110 additions and 42 deletions
+10 -1
View File
@@ -67,6 +67,8 @@
#define ADXL345_I2C_DEVICE i2c1
#endif
// Config done flag
extern bool_t adxl345_initialized;
// Data ready flag
extern volatile bool_t adxl345_data_available;
// Data vector
@@ -78,9 +80,16 @@ extern struct i2c_transaction adxl345_trans;
// Functions
extern void adxl345_init(void);
extern void adxl345_periodic(void);
extern void adxl345_configure(void);
extern void adxl345_read(void);
extern void adxl345_event(void);
// Macro for using ADXL345 in periodic function
#define Adxl345Periodic() { \
if (adxl345_initialized) adxl345_read(); \
else adxl345_configure(); \
}
#define AccelEvent(_handler) { \
adxl345_event(); \
if (adxl345_data_available) { \
+27 -13
View File
@@ -62,21 +62,25 @@ static void adxl345_send_config(void)
adxl345_i2c_trans.buf[0] = ADXL345_REG_BW_RATE;
adxl345_i2c_trans.buf[1] = ADXL345_BW_RATE;
I2CTransmit(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 2);
adxl345_init_status++;
break;
case ADXL_CONF_POWER:
adxl345_i2c_trans.buf[0] = ADXL345_REG_POWER_CTL;
adxl345_i2c_trans.buf[1] = ADXL345_POWER_CTL;
I2CTransmit(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 2);
adxl345_init_status++;
break;
case ADXL_CONF_INT:
adxl345_i2c_trans.buf[0] = ADXL345_REG_INT_ENABLE;
adxl345_i2c_trans.buf[1] = ADXL345_INT_ENABLE;
I2CTransmit(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 2);
adxl345_init_status++;
break;
case ADXL_CONF_FORMAT:
adxl345_i2c_trans.buf[0] = ADXL345_REG_DATA_FORMAT;
adxl345_i2c_trans.buf[1] = ADXL345_DATA_FORMAT;
I2CTransmit(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 2);
adxl345_init_status++;
break;
case ADXL_CONF_DONE:
adxl345_initialized = TRUE;
@@ -87,24 +91,23 @@ static void adxl345_send_config(void)
}
}
void adxl345_periodic(void)
// Configure
void adxl345_configure(void)
{
if (!adxl345_initialized) {
// Configure
if (adxl345_init_status == ADXL_CONF_UNINIT) {
adxl345_init_status++;
if (adxl345_i2c_trans.status == I2CTransSuccess || adxl345_i2c_trans.status == I2CTransDone) {
adxl345_init_status++;
adxl345_send_config();
}
if (adxl345_i2c_trans.status == I2CTransFailed) {
adxl345_send_config(); // Retry config
}
}
else {
// Normal reading
if (adxl345_i2c_trans.status == I2CTransDone){
adxl345_i2c_trans.buf[0] = ADXL345_REG_DATA_X0;
I2CTransceive(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 1, 6);
}
}
// Normal reading
void adxl345_read(void)
{
if (adxl345_initialized && adxl345_i2c_trans.status == I2CTransDone) {
adxl345_i2c_trans.buf[0] = ADXL345_REG_DATA_X0;
I2CTransceive(ADXL345_I2C_DEVICE, adxl345_i2c_trans, ADXL345_I2C_ADDR, 1, 6);
}
}
@@ -125,6 +128,17 @@ void adxl345_event(void)
adxl345_i2c_trans.status = I2CTransDone;
}
}
else if (!adxl345_initialized && adxl345_init_status != ADXL_CONF_UNINIT) { // Configuring
if (adxl345_i2c_trans.status == I2CTransSuccess || adxl345_i2c_trans.status == I2CTransDone) {
adxl345_i2c_trans.status = I2CTransDone;
adxl345_send_config();
}
if (adxl345_i2c_trans.status == I2CTransFailed) {
adxl345_init_status--;
adxl345_i2c_trans.status = I2CTransDone;
adxl345_send_config(); // Retry config (TODO max retry)
}
}
}
+26 -13
View File
@@ -61,16 +61,19 @@ static void hmc58xx_send_config(void)
hmc58xx_i2c_trans.buf[0] = HMC58XX_REG_CFGA;
hmc58xx_i2c_trans.buf[1] = HMC58XX_CRA;
I2CTransmit(HMC58XX_I2C_DEVICE, hmc58xx_i2c_trans, HMC58XX_ADDR, 2);
hmc58xx_init_status++;
break;
case HMC_CONF_CRB:
hmc58xx_i2c_trans.buf[0] = HMC58XX_REG_CFGB;
hmc58xx_i2c_trans.buf[1] = HMC58XX_CRB;
I2CTransmit(HMC58XX_I2C_DEVICE, hmc58xx_i2c_trans, HMC58XX_ADDR, 2);
hmc58xx_init_status++;
break;
case HMC_CONF_MODE:
hmc58xx_i2c_trans.buf[0] = HMC58XX_REG_MODE;
hmc58xx_i2c_trans.buf[1] = HMC58XX_MD;
I2CTransmit(HMC58XX_I2C_DEVICE, hmc58xx_i2c_trans, HMC58XX_ADDR, 2);
hmc58xx_init_status++;
break;
case HMC_CONF_DONE:
hmc58xx_initialized = TRUE;
@@ -81,24 +84,23 @@ static void hmc58xx_send_config(void)
}
}
void hmc58xx_periodic(void)
// Configure
void hmc58xx_configure(void)
{
if (!hmc58xx_initialized) {
// Configure
if (hmc58xx_init_status == HMC_CONF_UNINIT) {
hmc58xx_init_status++;
if (hmc58xx_i2c_trans.status == I2CTransSuccess || hmc58xx_i2c_trans.status == I2CTransDone) {
hmc58xx_init_status++;
hmc58xx_send_config();
}
if (hmc58xx_i2c_trans.status == I2CTransFailed) {
hmc58xx_send_config(); // Retry config
}
}
else {
// Normal reading
if (hmc58xx_i2c_trans.status == I2CTransDone){
hmc58xx_i2c_trans.buf[0] = HMC58XX_REG_DATXM;
I2CTransceive(HMC58XX_I2C_DEVICE, hmc58xx_i2c_trans, HMC58XX_ADDR, 1, 6);
}
}
// Normal reading
void hmc58xx_read(void)
{
if (hmc58xx_initialized && hmc58xx_i2c_trans.status == I2CTransDone){
hmc58xx_i2c_trans.buf[0] = HMC58XX_REG_DATXM;
I2CTransceive(HMC58XX_I2C_DEVICE, hmc58xx_i2c_trans, HMC58XX_ADDR, 1, 6);
}
}
@@ -118,5 +120,16 @@ void hmc58xx_event(void)
hmc58xx_i2c_trans.status = I2CTransDone;
}
}
else if (!hmc58xx_initialized && hmc58xx_init_status != HMC_CONF_UNINIT) { // Configuring
if (hmc58xx_i2c_trans.status == I2CTransSuccess || hmc58xx_i2c_trans.status == I2CTransDone) {
hmc58xx_i2c_trans.status = I2CTransDone;
hmc58xx_send_config();
}
if (hmc58xx_i2c_trans.status == I2CTransFailed) {
hmc58xx_init_status--;
hmc58xx_i2c_trans.status = I2CTransDone;
hmc58xx_send_config(); // Retry config (TODO max retry)
}
}
}
+10 -1
View File
@@ -70,6 +70,8 @@
#define HMC58XX_I2C_DEVICE i2c2
#endif
// Config done flag
extern bool_t hmc58xx_initialized;
// Data ready flag
extern volatile bool_t hmc58xx_data_available;
// Data vector
@@ -81,9 +83,16 @@ extern struct i2c_transaction hmc58xx_i2c_trans;
// Functions
extern void hmc58xx_init(void);
extern void hmc58xx_periodic(void);
extern void hmc58xx_configure(void);
extern void hmc58xx_read(void);
extern void hmc58xx_event(void);
// Macro for using HMC58XX in periodic function
#define Hmc58xxPeriodic() { \
if (hmc58xx_initialized) hmc58xx_read(); \
else hmc58xx_configure(); \
}
#define MagEvent(_m_handler) { \
hmc58xx_event(); \
if (hmc58xx_data_available) { \
+27 -13
View File
@@ -62,21 +62,25 @@ static void itg3200_send_config(void)
itg3200_i2c_trans.buf[0] = ITG3200_REG_SMPLRT_DIV;
itg3200_i2c_trans.buf[1] = ITG3200_SMPLRT_DIV;
I2CTransmit(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 2);
itg3200_init_status++;
break;
case ITG_CONF_DF:
itg3200_i2c_trans.buf[0] = ITG3200_REG_DLPF_FS;
itg3200_i2c_trans.buf[1] = ITG3200_DLPF_FS;
I2CTransmit(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 2);
itg3200_init_status++;
break;
case ITG_CONF_INT:
itg3200_i2c_trans.buf[0] = ITG3200_REG_INT_CFG;
itg3200_i2c_trans.buf[1] = ITG3200_INT_CFG;
I2CTransmit(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 2);
itg3200_init_status++;
break;
case ITG_CONF_PWR:
itg3200_i2c_trans.buf[0] = ITG3200_REG_PWR_MGM;
itg3200_i2c_trans.buf[1] = ITG3200_PWR_MGM;
I2CTransmit(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 2);
itg3200_init_status++;
break;
case ITG_CONF_DONE:
itg3200_initialized = TRUE;
@@ -87,24 +91,23 @@ static void itg3200_send_config(void)
}
}
void itg3200_periodic(void)
// Configure
void itg3200_configure(void)
{
if (!itg3200_initialized) {
// Configure
if (itg3200_init_status == ITG_CONF_UNINIT) {
itg3200_init_status++;
if (itg3200_i2c_trans.status == I2CTransSuccess || itg3200_i2c_trans.status == I2CTransDone) {
itg3200_init_status++;
itg3200_send_config();
}
if (itg3200_i2c_trans.status == I2CTransFailed) {
itg3200_send_config(); // Retry config
}
}
else {
// Normal reading
if (itg3200_i2c_trans.status == I2CTransDone) {
itg3200_i2c_trans.buf[0] = ITG3200_REG_INT_STATUS;
I2CTransceive(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 1, 9);
}
}
// Normal reading
void itg3200_read(void)
{
if (itg3200_initialized && itg3200_i2c_trans.status == I2CTransDone) {
itg3200_i2c_trans.buf[0] = ITG3200_REG_INT_STATUS;
I2CTransceive(ITG3200_I2C_DEVICE, itg3200_i2c_trans, ITG3200_I2C_ADDR, 1, 9);
}
}
@@ -128,5 +131,16 @@ void itg3200_event(void)
itg3200_i2c_trans.status = I2CTransDone;
}
}
else if (!itg3200_initialized && itg3200_init_status != ITG_CONF_UNINIT) { // Configuring
if (itg3200_i2c_trans.status == I2CTransSuccess || itg3200_i2c_trans.status == I2CTransDone) {
itg3200_i2c_trans.status = I2CTransDone;
itg3200_send_config();
}
if (itg3200_i2c_trans.status == I2CTransFailed) {
itg3200_init_status--;
itg3200_i2c_trans.status = I2CTransDone;
itg3200_send_config(); // Retry config (TODO max retry)
}
}
}
+10 -1
View File
@@ -64,6 +64,8 @@
#define ITG3200_I2C_DEVICE i2c1
#endif
// Config done flag
extern bool_t itg3200_initialized;
// Data ready flag
extern volatile bool_t itg3200_data_available;
// Data vector
@@ -75,9 +77,16 @@ extern struct i2c_transaction itg3200_trans;
// Functions
extern void itg3200_init(void);
extern void itg3200_periodic(void);
extern void itg3200_configure(void);
extern void itg3200_read(void);
extern void itg3200_event(void);
// Macro for using ITG3200 in periodic function
#define Itg3200Periodic() { \
if (itg3200_initialized) itg3200_read(); \
else itg3200_configure(); \
}
#define GyroEvent(_handler) { \
itg3200_event(); \
if (itg3200_data_available) { \