summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2015-03-03 22:42:32 +0100
committerChristian Pointner <equinox@spreadspace.org>2015-03-03 22:42:32 +0100
commit5ed6ab36cef1c0ff096fdb89af59608ba53d02aa (patch)
tree48083cbcde718508975bf5bcc7d57e1c7c5c5c6a
parentfixed address check for burst read and write (diff)
implemented chip ready timeout
-rw-r--r--lib/cc1101.c75
1 files changed, 41 insertions, 34 deletions
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)