diff --git a/drivers/at86rf2xx/at86rf2xx.c b/drivers/at86rf2xx/at86rf2xx.c index 8f28b4f712..ebeab759d8 100644 --- a/drivers/at86rf2xx/at86rf2xx.c +++ b/drivers/at86rf2xx/at86rf2xx.c @@ -46,8 +46,6 @@ void at86rf2xx_setup(at86rf2xx_t *dev, const at86rf2xx_params_t *params) dev->idle_state = AT86RF2XX_STATE_TRX_OFF; dev->state = AT86RF2XX_STATE_SLEEP; dev->pending_tx = 0; - /* initialise SPI */ - spi_init_master(dev->params.spi, SPI_CONF_FIRST_RISING, params->spi_speed); } void at86rf2xx_reset(at86rf2xx_t *dev) diff --git a/drivers/at86rf2xx/at86rf2xx_internal.c b/drivers/at86rf2xx/at86rf2xx_internal.c index 2c5a436aa5..0265ef6f54 100644 --- a/drivers/at86rf2xx/at86rf2xx_internal.c +++ b/drivers/at86rf2xx/at86rf2xx_internal.c @@ -28,32 +28,35 @@ #include "at86rf2xx_internal.h" #include "at86rf2xx_registers.h" +#define SPIDEV (dev->params.spi) +#define CSPIN (dev->params.cs_pin) + +static inline void getbus(const at86rf2xx_t *dev) +{ + spi_acquire(SPIDEV, CSPIN, SPI_MODE_0, dev->params.spi_clk); +} + void at86rf2xx_reg_write(const at86rf2xx_t *dev, const uint8_t addr, const uint8_t value) { - spi_acquire(dev->params.spi); - gpio_clear(dev->params.cs_pin); - spi_transfer_reg(dev->params.spi, - AT86RF2XX_ACCESS_REG | AT86RF2XX_ACCESS_WRITE | addr, - value, 0); - gpio_set(dev->params.cs_pin); - spi_release(dev->params.spi); + uint8_t reg = (AT86RF2XX_ACCESS_REG | AT86RF2XX_ACCESS_WRITE | addr); + + getbus(dev); + spi_transfer_reg(SPIDEV, CSPIN, reg, value); + spi_release(SPIDEV); } uint8_t at86rf2xx_reg_read(const at86rf2xx_t *dev, const uint8_t addr) { - char value; + uint8_t reg = (AT86RF2XX_ACCESS_REG | AT86RF2XX_ACCESS_READ | addr); + uint8_t value; - spi_acquire(dev->params.spi); - gpio_clear(dev->params.cs_pin); - spi_transfer_reg(dev->params.spi, - AT86RF2XX_ACCESS_REG | AT86RF2XX_ACCESS_READ | addr, - 0, &value); - gpio_set(dev->params.cs_pin); - spi_release(dev->params.spi); + getbus(dev); + value = spi_transfer_reg(SPIDEV, CSPIN, reg, 0); + spi_release(SPIDEV); - return (uint8_t)value; + return value; } void at86rf2xx_sram_read(const at86rf2xx_t *dev, @@ -61,14 +64,13 @@ void at86rf2xx_sram_read(const at86rf2xx_t *dev, uint8_t *data, const size_t len) { - spi_acquire(dev->params.spi); - gpio_clear(dev->params.cs_pin); - spi_transfer_reg(dev->params.spi, - AT86RF2XX_ACCESS_SRAM | AT86RF2XX_ACCESS_READ, - (char)offset, NULL); - spi_transfer_bytes(dev->params.spi, NULL, (char *)data, len); - gpio_set(dev->params.cs_pin); - spi_release(dev->params.spi); + uint8_t reg = (AT86RF2XX_ACCESS_SRAM | AT86RF2XX_ACCESS_READ); + + getbus(dev); + spi_transfer_byte(SPIDEV, CSPIN, true, reg); + spi_transfer_byte(SPIDEV, CSPIN, true, offset); + spi_transfer_bytes(SPIDEV, CSPIN, false, NULL, data, len); + spi_release(SPIDEV); } void at86rf2xx_sram_write(const at86rf2xx_t *dev, @@ -76,36 +78,35 @@ void at86rf2xx_sram_write(const at86rf2xx_t *dev, const uint8_t *data, const size_t len) { - spi_acquire(dev->params.spi); - gpio_clear(dev->params.cs_pin); - spi_transfer_reg(dev->params.spi, - AT86RF2XX_ACCESS_SRAM | AT86RF2XX_ACCESS_WRITE, - (char)offset, NULL); - spi_transfer_bytes(dev->params.spi, (char *)data, NULL, len); - gpio_set(dev->params.cs_pin); - spi_release(dev->params.spi); + uint8_t reg = (AT86RF2XX_ACCESS_SRAM | AT86RF2XX_ACCESS_WRITE); + + getbus(dev); + spi_transfer_byte(SPIDEV, CSPIN, true, reg); + spi_transfer_byte(SPIDEV, CSPIN, true, offset); + spi_transfer_bytes(SPIDEV, CSPIN, false, data, NULL, len); + spi_release(SPIDEV); } void at86rf2xx_fb_start(const at86rf2xx_t *dev) { - spi_acquire(dev->params.spi); - gpio_clear(dev->params.cs_pin); - spi_transfer_byte(dev->params.spi, - AT86RF2XX_ACCESS_FB | AT86RF2XX_ACCESS_READ, - NULL); + uint8_t reg = AT86RF2XX_ACCESS_FB | AT86RF2XX_ACCESS_READ; + + getbus(dev); + spi_transfer_byte(SPIDEV, CSPIN, true, reg); } void at86rf2xx_fb_read(const at86rf2xx_t *dev, uint8_t *data, const size_t len) { - spi_transfer_bytes(dev->params.spi, NULL, (char *)data, len); + spi_transfer_bytes(SPIDEV, CSPIN, true, NULL, data, len); } void at86rf2xx_fb_stop(const at86rf2xx_t *dev) { - gpio_set(dev->params.cs_pin); - spi_release(dev->params.spi); + /* transfer one byte (which we ignore) to release the chip select */ + spi_transfer_byte(SPIDEV, CSPIN, false, 1); + spi_release(SPIDEV); } uint8_t at86rf2xx_get_status(const at86rf2xx_t *dev) diff --git a/drivers/at86rf2xx/at86rf2xx_netdev.c b/drivers/at86rf2xx/at86rf2xx_netdev.c index 56c6d9376c..4476ea4891 100644 --- a/drivers/at86rf2xx/at86rf2xx_netdev.c +++ b/drivers/at86rf2xx/at86rf2xx_netdev.c @@ -70,8 +70,7 @@ static int _init(netdev2_t *netdev) at86rf2xx_t *dev = (at86rf2xx_t *)netdev; /* initialise GPIOs */ - gpio_init(dev->params.cs_pin, GPIO_OUT); - gpio_set(dev->params.cs_pin); + spi_init_cs(dev->params.spi, dev->params.cs_pin); gpio_init(dev->params.sleep_pin, GPIO_OUT); gpio_clear(dev->params.sleep_pin); gpio_init(dev->params.reset_pin, GPIO_OUT); diff --git a/drivers/at86rf2xx/include/at86rf2xx_params.h b/drivers/at86rf2xx/include/at86rf2xx_params.h index 8dd9a31568..fad6a8e3b5 100644 --- a/drivers/at86rf2xx/include/at86rf2xx_params.h +++ b/drivers/at86rf2xx/include/at86rf2xx_params.h @@ -32,10 +32,10 @@ extern "C" { * @{ */ #ifndef AT86RF2XX_PARAM_SPI -#define AT86RF2XX_PARAM_SPI (SPI_0) +#define AT86RF2XX_PARAM_SPI (SPI_DEV(0)) #endif -#ifndef AT86RF2XX_PARAM_SPI_SPEED -#define AT86RF2XX_PARAM_SPI_SPEED (SPI_SPEED_5MHZ) +#ifndef AT86RF2XX_PARAM_SPI_CLK +#define AT86RF2XX_PARAM_SPI_CLK (SPI_CLK_5MHZ) #endif #ifndef AT86RF2XX_PARAM_CS #define AT86RF2XX_PARAM_CS (GPIO_PIN(0, 0)) @@ -51,7 +51,7 @@ extern "C" { #endif #define AT86RF2XX_PARAMS_DEFAULT {.spi = AT86RF2XX_PARAM_SPI, \ - .spi_speed = AT86RF2XX_PARAM_SPI_SPEED, \ + .spi_clk = AT86RF2XX_PARAM_SPI_CLK, \ .cs_pin = AT86RF2XX_PARAM_CS, \ .int_pin = AT86RF2XX_PARAM_INT, \ .sleep_pin = AT86RF2XX_PARAM_SLEEP, \ diff --git a/drivers/include/at86rf2xx.h b/drivers/include/at86rf2xx.h index 74a9630836..a2e49b9e1d 100644 --- a/drivers/include/at86rf2xx.h +++ b/drivers/include/at86rf2xx.h @@ -137,8 +137,8 @@ extern "C" { */ typedef struct at86rf2xx_params { spi_t spi; /**< SPI bus the device is connected to */ - spi_speed_t spi_speed; /**< SPI speed to use */ - gpio_t cs_pin; /**< GPIO pin connected to chip select */ + spi_clk_t spi_clk; /**< SPI clock speed to use */ + spi_cs_t cs_pin; /**< GPIO pin connected to chip select */ gpio_t int_pin; /**< GPIO pin connected to the interrupt pin */ gpio_t sleep_pin; /**< GPIO pin connected to the sleep pin */ gpio_t reset_pin; /**< GPIO pin connected to the reset pin */