diff options
| author | Keith Packard <keithp@keithp.com> | 2016-06-28 18:40:46 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2016-06-29 19:17:45 -0700 | 
| commit | 30eb5d2fa77e036690170e7057fa9df669375ae5 (patch) | |
| tree | 7028ae4d74fe4e28772a07a3e79618fcc1eb2fc4 | |
| parent | 61ad8e5bf428246ac89cad7cb9a1edf2ef735fd5 (diff) | |
altos/drivers: Use more reliable byte interface for CC1120 reception
This replaces direct register access with function calls to allow that
code to respect the hardware requirements.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | src/drivers/ao_cc1120.c | 35 | ||||
| -rw-r--r-- | src/telemega-v1.0/ao_pins.h | 1 | 
2 files changed, 15 insertions, 21 deletions
| diff --git a/src/drivers/ao_cc1120.c b/src/drivers/ao_cc1120.c index 5b814667..eb7d872b 100644 --- a/src/drivers/ao_cc1120.c +++ b/src/drivers/ao_cc1120.c @@ -44,7 +44,10 @@ extern const uint32_t	ao_radio_cal;  #define ao_radio_try_select(task_id)	ao_spi_try_get_mask(AO_CC1120_SPI_CS_PORT,(1 << AO_CC1120_SPI_CS_PIN),AO_CC1120_SPI_BUS,AO_SPI_SPEED_4MHz, task_id)  #define ao_radio_select()	ao_spi_get_mask(AO_CC1120_SPI_CS_PORT,(1 << AO_CC1120_SPI_CS_PIN),AO_CC1120_SPI_BUS,AO_SPI_SPEED_4MHz)  #define ao_radio_deselect()	ao_spi_put_mask(AO_CC1120_SPI_CS_PORT,(1 << AO_CC1120_SPI_CS_PIN),AO_CC1120_SPI_BUS) -#define ao_radio_spi_send_sync(d,l)	ao_spi_send_sync((d), (l), AO_CC1120_SPI_BUS) +#define ao_radio_spi_start_bytes()	ao_spi_start_bytes(AO_CC1120_SPI_BUS) +#define ao_radio_spi_stop_bytes()	ao_spi_stop_bytes(AO_CC1120_SPI_BUS) +#define ao_radio_spi_send_byte(b)	ao_spi_send_byte(b, AO_CC1120_SPI_BUS) +#define ao_radio_spi_recv_byte()	ao_spi_recv_byte(AO_CC1120_SPI_BUS)  #define ao_radio_spi_send(d,l)	ao_spi_send((d), (l), AO_CC1120_SPI_BUS)  #define ao_radio_spi_send_fixed(d,l) ao_spi_send_fixed((d), (l), AO_CC1120_SPI_BUS)  #define ao_radio_spi_recv(d,l)	ao_spi_recv((d), (l), AO_CC1120_SPI_BUS) @@ -111,28 +114,23 @@ ao_radio_reg_write(uint16_t addr, uint8_t value)  static void  _ao_radio_burst_read_start (uint16_t addr)  { -	uint8_t data[2]; -	uint8_t d; +	ao_radio_spi_start_bytes();  	if (CC1120_IS_EXTENDED(addr)) { -		data[0] = ((1 << CC1120_READ)  | -			   (1 << CC1120_BURST) | -			   CC1120_EXTENDED); -		data[1] = addr; -		d = 2; +		ao_radio_spi_send_byte((1 << CC1120_READ)  | +				       (1 << CC1120_BURST) | +				       CC1120_EXTENDED);  	} else { -		data[0] = ((1 << CC1120_READ)  | -			   (1 << CC1120_BURST) | -			   addr); -		d = 1; +		addr |= ((1 << CC1120_READ)  | +			 (1 << CC1120_BURST));  	} - -	ao_radio_spi_send_sync(data, d); +	ao_radio_spi_send_byte(addr);  }  static void  ao_radio_burst_read_stop (void)  { +	ao_radio_spi_stop_bytes();  	ao_radio_deselect();  } @@ -1029,8 +1027,7 @@ ao_radio_rx_isr(void)  		rx_starting = 0;  		ao_wakeup(&ao_radio_wake);  	} -	d = AO_CC1120_SPI.dr; -	AO_CC1120_SPI.dr = 0; +	d = ao_radio_spi_recv_byte();  	if (rx_ignore == 0) {  		if (rx_data_cur < rx_data_count)  			rx_data[rx_data_cur++] = d; @@ -1099,7 +1096,7 @@ ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)  	rx_data_count = len * 8;	/* bytes to bits */  	rx_data_cur = 0;  	rx_data_consumed = 0; -	rx_ignore = 2; +	rx_ignore = 1;  	/* Must be set before changing the frequency; any abort  	 * after the frequency is set needs to terminate the read @@ -1149,9 +1146,7 @@ ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)  		ao_radio_select();  		_ao_radio_burst_read_start(CC1120_SOFT_RX_DATA_OUT);  		if (rx_ignore) { -			uint8_t ignore = AO_CC1120_SPI.dr; -			(void) ignore; -			AO_CC1120_SPI.dr = 0; +			(void) ao_radio_spi_recv_byte();  			--rx_ignore;  		}  	} diff --git a/src/telemega-v1.0/ao_pins.h b/src/telemega-v1.0/ao_pins.h index b81e59a9..58b4d61a 100644 --- a/src/telemega-v1.0/ao_pins.h +++ b/src/telemega-v1.0/ao_pins.h @@ -307,7 +307,6 @@ struct ao_adc {  #define AO_CC1120_SPI_CS_PORT	(&stm_gpioc)  #define AO_CC1120_SPI_CS_PIN	5  #define AO_CC1120_SPI_BUS	AO_SPI_2_PB13_PB14_PB15 -#define AO_CC1120_SPI		stm_spi2  #define AO_CC1120_INT_PORT		(&stm_gpioe)  #define AO_CC1120_INT_PIN		1 | 
