From 5ed6ab36cef1c0ff096fdb89af59608ba53d02aa Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 3 Mar 2015 22:42:32 +0100 Subject: implemented chip ready timeout --- lib/cc1101.c | 75 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 34 deletions(-) (limited to 'lib/cc1101.c') diff --git a/lib/cc1101.c b/lib/cc1101.c index b1ec096..3831af5 100644 --- a/lib/cc1101.c +++ b/lib/cc1101.c @@ -53,9 +53,15 @@ static uint8_t const pa_table_values_[] = { 0x00, 0x30, 0x20, 0x10, 0x01, 0x02, * internal functions */ -static inline void cc1101_spi_wait_rdy(void) +#define CC1101_CHIP_RDY_TIMEOUT 10 + +static inline uint8_t cc1101_spi_wait_rdy(void) { - while(drv.spi_read_miso()); // wait for CHP_RDY to go low, TODO: timeout... + uint16_t timeout = CC1101_CHIP_RDY_TIMEOUT; + while(drv.spi_read_miso()) + if(!(--timeout)) return 1; + + return 0; } static uint8_t cc1101_spi_strobe_command(const uint8_t cmd) @@ -63,11 +69,11 @@ static uint8_t cc1101_spi_strobe_command(const uint8_t cmd) if(cmd < CC1101_CMD_MIN || cmd > CC1101_CMD_MAX) return -1; + uint8_t status = 0x80; drv.spi_cs_enable(); - cc1101_spi_wait_rdy(); - - uint8_t status = drv.spi_transfer_byte(CC1101_HEADER_COMMAND | cmd); - + if(!cc1101_spi_wait_rdy()) { + status = drv.spi_transfer_byte(CC1101_HEADER_COMMAND | cmd); + } drv.spi_cs_disable(); return status; } @@ -83,41 +89,41 @@ static uint8_t cc1101_spi_read_register(const uint8_t addr) else hdr |= CC1101_HEADER_READ; + uint8_t data = 0xFF; drv.spi_cs_enable(); - cc1101_spi_wait_rdy(); - - drv.spi_write_byte(hdr); - uint8_t data = drv.spi_read_byte(); - + if(!cc1101_spi_wait_rdy()) { + drv.spi_write_byte(hdr); + data = drv.spi_read_byte(); + } drv.spi_cs_disable(); return data; } -static void cc1101_spi_write_register(const uint8_t addr, const uint8_t data) +static uint8_t cc1101_spi_write_register(const uint8_t addr, const uint8_t data) { + uint8_t status = 0x80; if(addr > CC1101_REG_RW_MAX && addr != CC1101_REG_PATABLE && addr != CC1101_REG_FIFO) - return; + return status; drv.spi_cs_enable(); - cc1101_spi_wait_rdy(); - - drv.spi_write_byte(CC1101_HEADER_WRITE | addr); - drv.spi_write_byte(data); - + if(!cc1101_spi_wait_rdy()) { + drv.spi_write_byte(CC1101_HEADER_WRITE | addr); + status = drv.spi_transfer_byte(data); + } drv.spi_cs_disable(); + return status; } // this is an internal-internal function - never use this outside of internal functions static uint8_t cc1101_spi_read_register_burst_raw(const uint8_t addr, uint8_t* data, const uint8_t l) { + uint8_t i = 0; drv.spi_cs_enable(); - cc1101_spi_wait_rdy(); - - drv.spi_write_byte(CC1101_HEADER_READ | CC1101_HEADER_BURST | addr); - uint8_t i; - for(i = 0; i < l; ++i) - data[i] = drv.spi_read_byte(); - + if(!cc1101_spi_wait_rdy()) { + drv.spi_write_byte(CC1101_HEADER_READ | CC1101_HEADER_BURST | addr); + for(i = 0; i < l; ++i) + data[i] = drv.spi_read_byte(); + } drv.spi_cs_disable(); return i; } @@ -143,14 +149,13 @@ static uint8_t cc1101_spi_read_register_burst(const uint8_t addr, uint8_t* data, // this is an internal-internal function - never use this outside of internal functions static uint8_t cc1101_spi_write_register_burst_raw(const uint8_t addr, const uint8_t* data, const uint8_t l) { + uint8_t i = 0; drv.spi_cs_enable(); - cc1101_spi_wait_rdy(); - - drv.spi_write_byte(CC1101_HEADER_WRITE | CC1101_HEADER_BURST | addr); - uint8_t i; - for(i = 0; i < l; ++i) - drv.spi_write_byte(data[i]); - + if(!cc1101_spi_wait_rdy()) { + drv.spi_write_byte(CC1101_HEADER_WRITE | CC1101_HEADER_BURST | addr); + for(i = 0; i < l; ++i) + drv.spi_write_byte(data[i]); + } drv.spi_cs_disable(); return i; } @@ -819,12 +824,14 @@ uint8_t cc1101_get_vco_vc_dac(void) uint8_t cc1101_get_tx_bytes(void) { - return cc1101_spi_read_register(CC1101_REG_RO_TXBYTES) & CC1101_REG_RO_TXBYTES_MASK; + uint8_t tx_bytes = cc1101_spi_read_register(CC1101_REG_RO_TXBYTES) & CC1101_REG_RO_TXBYTES_MASK; + return (tx_bytes > CC1101_FIFO_MAX_LEN) ? 0x00 : tx_bytes; } uint8_t cc1101_get_rx_bytes(void) { - return cc1101_spi_read_register(CC1101_REG_RO_RXBYTES) & CC1101_REG_RO_RXBYTES_MASK; + uint8_t rx_bytes = cc1101_spi_read_register(CC1101_REG_RO_RXBYTES) & CC1101_REG_RO_RXBYTES_MASK; + return (rx_bytes > CC1101_FIFO_MAX_LEN) ? 0x00 : rx_bytes; } uint8_t cc1101_get_rcctrl0_status(void) -- cgit v1.2.3