diff options
| -rw-r--r-- | src/drivers/ao_hmc5883.c | 37 | ||||
| -rw-r--r-- | src/drivers/ao_hmc5883.h | 37 | 
2 files changed, 64 insertions, 10 deletions
diff --git a/src/drivers/ao_hmc5883.c b/src/drivers/ao_hmc5883.c index 9551df71..f50376c8 100644 --- a/src/drivers/ao_hmc5883.c +++ b/src/drivers/ao_hmc5883.c @@ -21,6 +21,8 @@  static uint8_t	ao_hmc5883_configured; +static uint8_t	ao_hmc5883_addr; +  static void  ao_hmc5883_reg_write(uint8_t addr, uint8_t data)  { @@ -32,17 +34,21 @@ ao_hmc5883_reg_write(uint8_t addr, uint8_t data)  	ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_WRITE);  	ao_i2c_send(d, 2, AO_HMC5883_I2C_INDEX, TRUE);  	ao_i2c_put(AO_HMC5883_I2C_INDEX); +	ao_hmc5883_addr = addr + 1;  }  static void  ao_hmc5883_read(uint8_t addr, uint8_t *data, uint8_t len)  {  	ao_i2c_get(AO_HMC5883_I2C_INDEX); -	ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_WRITE); -	ao_i2c_send(&addr, 1, AO_HMC5883_I2C_INDEX, FALSE); +	if (addr != ao_hmc5883_addr) { +		ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_WRITE); +		ao_i2c_send(&addr, 1, AO_HMC5883_I2C_INDEX, FALSE); +	}  	ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_READ);  	ao_i2c_recv(data, len, AO_HMC5883_I2C_INDEX, TRUE);  	ao_i2c_put(AO_HMC5883_I2C_INDEX); +	ao_hmc5883_addr = 0xff;  }  static uint8_t ao_hmc5883_done; @@ -51,7 +57,7 @@ static void  ao_hmc5883_isr(void)  {  	ao_exti_disable(&AO_HMC5883_INT_PORT, AO_HMC5883_INT_PIN); -	ao_hmc5883_done = 1; +	++ao_hmc5883_done;  	ao_wakeup(&ao_hmc5883_done);  } @@ -65,10 +71,14 @@ ao_hmc5883_sample(struct ao_hmc5883_sample *sample)  	ao_hmc5883_done = 0;  	ao_exti_enable(&AO_HMC5883_INT_PORT, AO_HMC5883_INT_PIN);  	ao_hmc5883_reg_write(HMC5883_MODE, HMC5883_MODE_SINGLE); +  	cli();  	while (!ao_hmc5883_done)  		ao_sleep(&ao_hmc5883_done);  	sei(); + +	printf ("done %d\n", ao_hmc5883_done); +  	ao_hmc5883_read(HMC5883_X_MSB, (uint8_t *) sample, sizeof (struct ao_hmc5883_sample));  #if __BYTE_ORDER == __LITTLE_ENDIAN  	/* byte swap */ @@ -82,21 +92,27 @@ ao_hmc5883_sample(struct ao_hmc5883_sample *sample)  static uint8_t  ao_hmc5883_setup(void)  { +	uint8_t d;  	uint8_t	present;  	if (ao_hmc5883_configured)  		return 1; -	/* Enable the EXTI interrupt for the appropriate pin */ -	ao_enable_port(AO_HMC5883_INT_PORT); -	ao_exti_setup(&AO_HMC5883_INT_PORT, AO_HMC5883_INT_PIN, -		      AO_EXTI_MODE_FALLING, ao_hmc5883_isr); -  	ao_i2c_get(AO_HMC5883_I2C_INDEX);  	present = ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_READ); -	ao_i2c_recv(NULL, 0, AO_HMC5883_I2C_INDEX, TRUE); +	ao_i2c_recv(&d, 1, AO_HMC5883_I2C_INDEX, TRUE);  	ao_i2c_put(AO_HMC5883_I2C_INDEX); +  	if (!present)  		return 0; + +	ao_hmc5883_reg_write(HMC5883_CONFIG_A, +			     (HMC5883_CONFIG_A_MA_8 << HMC5883_CONFIG_A_MA) | +			     (HMC5883_CONFIG_A_DO_15 << HMC5883_CONFIG_A_DO) | +			     (HMC5883_CONFIG_A_MS_NORMAL << HMC5883_CONFIG_A_MS)); + +	ao_hmc5883_reg_write(HMC5883_CONFIG_B, +			     (HMC5883_CONFIG_B_GN_1_3 << HMC5883_CONFIG_B_GN)); +  	ao_hmc5883_configured = 1;  	return 1;  } @@ -132,9 +148,10 @@ ao_hmc5883_init(void)  {  	ao_hmc5883_configured = 0; +	ao_enable_port(AO_HMC5883_INT_PORT);  	ao_exti_setup(&AO_HMC5883_INT_PORT,  		      AO_HMC5883_INT_PIN, -		      AO_EXTI_MODE_FALLING, +		      AO_EXTI_MODE_FALLING | AO_EXTI_MODE_PULL_UP,  		      ao_hmc5883_isr);  	ao_cmd_register(&ao_hmc5883_cmds[0]); diff --git a/src/drivers/ao_hmc5883.h b/src/drivers/ao_hmc5883.h index 2ec27dd9..55690978 100644 --- a/src/drivers/ao_hmc5883.h +++ b/src/drivers/ao_hmc5883.h @@ -22,11 +22,48 @@  #define HMC5883_ADDR_READ	0x3d  #define HMC5883_CONFIG_A	0 + +#define  HMC5883_CONFIG_A_MA		5 +#define  HMC5883_CONFIG_A_MA_1			0 +#define  HMC5883_CONFIG_A_MA_2			1 +#define  HMC5883_CONFIG_A_MA_4			2 +#define  HMC5883_CONFIG_A_MA_8			3 +#define  HMC5883_CONFIG_A_MA_MASK		3 + +#define  HMC5883_CONFIG_A_DO		2 +#define   HMC5883_CONFIG_A_DO_0_75		0 +#define   HMC5883_CONFIG_A_DO_1_5		1 +#define   HMC5883_CONFIG_A_DO_3			2 +#define   HMC5883_CONFIG_A_DO_7_5		3 +#define   HMC5883_CONFIG_A_DO_15		4 +#define   HMC5883_CONFIG_A_DO_30		5 +#define   HMC5883_CONFIG_A_DO_75		6 +#define   HMC5883_CONFIG_A_DO_MASK		7 + +#define HMC5883_CONFIG_A_MS		0 +#define  HMC5883_CONFIG_A_MS_NORMAL		0 +#define  HMC5883_CONFIG_A_MS_POSITIVE_BIAS	1 +#define  HMC5883_CONFIG_A_MS_NEGATIVE_BIAS	2 +#define  HMC5883_CONFIG_A_MS_MASK		3 +  #define HMC5883_CONFIG_B	1 + +#define HMC5883_CONFIG_B_GN		5 +#define  HMC5883_CONFIG_B_GN_0_88		0 +#define  HMC5883_CONFIG_B_GN_1_3		1 +#define  HMC5883_CONFIG_B_GN_1_9		2 +#define  HMC5883_CONFIG_B_GN_2_5		3 +#define  HMC5883_CONFIG_B_GN_4_0		4 +#define  HMC5883_CONFIG_B_GN_4_7		5 +#define  HMC5883_CONFIG_B_GN_5_6		6 +#define  HMC5883_CONFIG_B_GN_8_1		7 +#define  HMC5883_CONFIG_B_GN_MASK		7 +  #define HMC5883_MODE		2  #define  HMC5883_MODE_CONTINUOUS	0  #define  HMC5883_MODE_SINGLE		1  #define  HMC5883_MODE_IDLE		2 +  #define HMC5883_X_MSB		3  #define HMC5883_X_LSB		4  #define HMC5883_Y_MSB		5  | 
