drivers/cc110x: adapted to SPI API changes

This commit is contained in:
Hauke Petersen 2016-11-08 18:40:20 +01:00
parent 236f1edddd
commit 8799b3ab9e
2 changed files with 41 additions and 32 deletions

View File

@ -35,10 +35,18 @@
#include "xtimer.h" #include "xtimer.h"
#include "irq.h" #include "irq.h"
#define SPI_CLK SPI_CLK_5MHZ
#define SPI_MODE SPI_MODE_0
/********************************************************************** /**********************************************************************
* CC110x spi access * CC110x spi access
**********************************************************************/ **********************************************************************/
static inline void lock(cc110x_t *dev)
{
spi_acquire(dev->params.spi, dev->params.cs, SPI_MODE, SPI_CLK);
}
void cc110x_cs(cc110x_t *dev) void cc110x_cs(cc110x_t *dev)
{ {
volatile int retry_count = 0; volatile int retry_count = 0;
@ -68,17 +76,18 @@ void cc110x_cs(cc110x_t *dev)
} }
/* Switch MISO/GDO1 to spi mode */ /* Switch MISO/GDO1 to spi mode */
#ifndef GPIO_READS_SPI_PINS #ifndef GPIO_READS_SPI_PINS
spi_conf_pins(dev->params.spi); spi_init_pins(dev->params.spi);
#endif #endif
} }
void cc110x_writeburst_reg(cc110x_t *dev, uint8_t addr, const char *src, uint8_t count) void cc110x_writeburst_reg(cc110x_t *dev, uint8_t addr, const char *src, uint8_t count)
{ {
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_regs(dev->params.spi, addr | CC110X_WRITE_BURST, (char *)src, 0, count); spi_transfer_regs(dev->params.spi, SPI_CS_UNDEF,
(addr | CC110X_WRITE_BURST), src, NULL, count);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
@ -88,12 +97,14 @@ void cc110x_readburst_reg(cc110x_t *dev, uint8_t addr, char *buffer, uint8_t cou
{ {
int i = 0; int i = 0;
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_byte(dev->params.spi, addr | CC110X_READ_BURST, 0); spi_transfer_byte(dev->params.spi, SPI_CS_UNDEF, false,
(addr | CC110X_READ_BURST));
while (i < count) { while (i < count) {
spi_transfer_byte(dev->params.spi, CC110X_NOBYTE, &buffer[i]); buffer[i] = (char)spi_transfer_byte(dev->params.spi, SPI_CS_UNDEF,
false, CC110X_NOBYTE);
i++; i++;
} }
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
@ -104,10 +115,10 @@ void cc110x_readburst_reg(cc110x_t *dev, uint8_t addr, char *buffer, uint8_t cou
void cc110x_write_reg(cc110x_t *dev, uint8_t addr, uint8_t value) void cc110x_write_reg(cc110x_t *dev, uint8_t addr, uint8_t value)
{ {
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_reg(dev->params.spi, addr, value, 0); spi_transfer_reg(dev->params.spi, SPI_CS_UNDEF, addr, value);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
@ -115,26 +126,28 @@ void cc110x_write_reg(cc110x_t *dev, uint8_t addr, uint8_t value)
uint8_t cc110x_read_reg(cc110x_t *dev, uint8_t addr) uint8_t cc110x_read_reg(cc110x_t *dev, uint8_t addr)
{ {
char result; uint8_t result;
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_reg(dev->params.spi, addr | CC110X_READ_SINGLE, CC110X_NOBYTE, &result); result = spi_transfer_reg(dev->params.spi, SPI_CS_UNDEF,
(addr | CC110X_READ_SINGLE), CC110X_NOBYTE);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
return (uint8_t) result; return result;
} }
uint8_t cc110x_read_status(cc110x_t *dev, uint8_t addr) uint8_t cc110x_read_status(cc110x_t *dev, uint8_t addr)
{ {
char result; uint8_t result;
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_reg(dev->params.spi, addr | CC110X_READ_BURST, CC110X_NOBYTE, &result); result = spi_transfer_reg(dev->params.spi, SPI_CS_UNDEF,
(addr | CC110X_READ_BURST), CC110X_NOBYTE);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
@ -143,19 +156,21 @@ uint8_t cc110x_read_status(cc110x_t *dev, uint8_t addr)
uint8_t cc110x_get_reg_robust(cc110x_t *dev, uint8_t addr) uint8_t cc110x_get_reg_robust(cc110x_t *dev, uint8_t addr)
{ {
char result, result2; uint8_t res1, res2;
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
do { do {
spi_transfer_reg(dev->params.spi, addr | CC110X_READ_BURST, CC110X_NOBYTE, &result); res1 = spi_transfer_reg(dev->params.spi, SPI_CS_UNDEF,
spi_transfer_reg(dev->params.spi, addr | CC110X_READ_BURST, CC110X_NOBYTE, &result2); (addr | CC110X_READ_BURST), CC110X_NOBYTE);
} while (result != result2); res2 = spi_transfer_reg(dev->params.spi, SPI_CS_UNDEF,
(addr | CC110X_READ_BURST), CC110X_NOBYTE);
} while (res1 != res2);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
return (uint8_t) result; return res1;
} }
uint8_t cc110x_strobe(cc110x_t *dev, uint8_t c) uint8_t cc110x_strobe(cc110x_t *dev, uint8_t c)
@ -166,14 +181,14 @@ uint8_t cc110x_strobe(cc110x_t *dev, uint8_t c)
} }
#endif #endif
char result; uint8_t result;
unsigned int cpsr; unsigned int cpsr;
spi_acquire(dev->params.spi); lock(dev);
cpsr = irq_disable(); cpsr = irq_disable();
cc110x_cs(dev); cc110x_cs(dev);
spi_transfer_byte(dev->params.spi, c, &result); result = spi_transfer_byte(dev->params.spi, SPI_CS_UNDEF, false, c);
gpio_set(dev->params.cs); gpio_set(dev->params.cs);
irq_restore(cpsr); irq_restore(cpsr);
spi_release(dev->params.spi); spi_release(dev->params.spi);
return (uint8_t) result; return result;
} }

View File

@ -55,17 +55,11 @@ int cc110x_setup(cc110x_t *dev, const cc110x_params_t *params)
dev->params = *params; dev->params = *params;
/* Configure chip-select */ /* Configure chip-select */
gpio_init(dev->params.cs, GPIO_OUT); spi_init_cs(dev->params.spi, dev->params.cs);
gpio_set(dev->params.cs);
/* Configure GDO1 */ /* Configure GDO1 */
gpio_init(dev->params.gdo1, GPIO_IN); gpio_init(dev->params.gdo1, GPIO_IN);
/* Configure SPI */
spi_acquire(dev->params.spi);
spi_init_master(dev->params.spi, SPI_CONF_FIRST_RISING, SPI_SPEED_5MHZ);
spi_release(dev->params.spi);
#ifndef CC110X_DONT_RESET #ifndef CC110X_DONT_RESET
/* reset device*/ /* reset device*/
_power_up_reset(dev); _power_up_reset(dev);