at86rf231: handle rx tx state changes correctly
This commit is contained in:
parent
b6abdc9519
commit
c28aebf105
@ -237,7 +237,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief SPI configuration
|
* @brief SPI configuration
|
||||||
*/
|
*/
|
||||||
#define SPI_NUM_OF 1
|
#define SPI_NUMOF 1
|
||||||
#define SPI_0_EN 1
|
#define SPI_0_EN 1
|
||||||
|
|
||||||
#define SPI_0_DEV SPI1
|
#define SPI_0_DEV SPI1
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "periph/gpio.h"
|
#include "periph/gpio.h"
|
||||||
#include "spi.h"
|
#include "periph/spi.h"
|
||||||
#include "periph_conf.h"
|
#include "periph_conf.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
|
||||||
@ -28,7 +28,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
/* TODO: parse and use conf and speed parameter */
|
/* TODO: parse and use conf and speed parameter */
|
||||||
int spi_init_master(spi_t dev, spi_conf_t conf, uint32_t speed)
|
int spi_init_master(spi_t dev, spi_conf_t conf, spi_speed_t speed)
|
||||||
{
|
{
|
||||||
SPI_TypeDef *SPIx;
|
SPI_TypeDef *SPIx;
|
||||||
|
|
||||||
@ -39,7 +39,6 @@ int spi_init_master(spi_t dev, spi_conf_t conf, uint32_t speed)
|
|||||||
SPI_0_CLKEN();
|
SPI_0_CLKEN();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case SPI_UNDEFINED:
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -84,32 +83,32 @@ int spi_transfer_byte(spi_t dev, char out, char *in)
|
|||||||
SPI_dev = SPI_0_DEV;
|
SPI_dev = SPI_0_DEV;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case SPI_UNDEFINED:
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((SPI_dev->SR & SPI_SR_TXE) == RESET);
|
while ((SPI_dev->SR & SPI_SR_TXE) == RESET);
|
||||||
SPI_dev->DR = out;
|
SPI_dev->DR = out;
|
||||||
transfered += (out) ? 1 : 0;
|
transfered++;
|
||||||
|
|
||||||
while ((SPI_dev->SR & SPI_SR_RXNE) == RESET);
|
while ((SPI_dev->SR & SPI_SR_RXNE) == RESET);
|
||||||
if (in != NULL) {
|
if (in != NULL) {
|
||||||
*in = SPI_dev->DR;
|
*in = SPI_dev->DR;
|
||||||
transfered += (*in) ? 1 : 0;
|
transfered++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SPI_dev->DR;
|
SPI_dev->DR;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((SPI_dev->SR & 0x80) == 1);
|
/* SPI busy */
|
||||||
|
while ((SPI_dev->SR & 0x80));
|
||||||
|
|
||||||
DEBUG("\nout: %x in: %x transfered: %x\n", out, *in, transfered);
|
DEBUG("\nout: %x in: %x transfered: %x\n", out, *in, transfered);
|
||||||
|
|
||||||
return transfered;
|
return transfered;
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_transfer_bytes(spi_t dev, char *out, char *in, int length)
|
int spi_transfer_bytes(spi_t dev, char *out, char *in, unsigned int length)
|
||||||
{
|
{
|
||||||
int transfered = 0;
|
int transfered = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -139,19 +138,19 @@ int spi_transfer_bytes(spi_t dev, char *out, char *in, int length)
|
|||||||
return transfered;
|
return transfered;
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_transfer_reg(spi_t dev, uint8_t reg, char *out, char *in)
|
int spi_transfer_reg(spi_t dev, uint8_t reg, char out, char *in)
|
||||||
{
|
{
|
||||||
spi_transfer_byte(dev, reg, NULL);
|
spi_transfer_byte(dev, reg, NULL);
|
||||||
return spi_transfer_byte(dev, *out, in);
|
return spi_transfer_byte(dev, out, in);
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_transfer_regs(spi_t dev, uint8_t reg, char *out, char *in, int length)
|
int spi_transfer_regs(spi_t dev, uint8_t reg, char *out, char *in, unsigned int length)
|
||||||
{
|
{
|
||||||
spi_transfer_byte(dev, reg, NULL);
|
spi_transfer_byte(dev, reg, NULL);
|
||||||
return spi_transfer_bytes(dev, out, in, length);
|
return spi_transfer_bytes(dev, out, in, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_poweron(spi_t dev)
|
void spi_poweron(spi_t dev)
|
||||||
{
|
{
|
||||||
switch(dev) {
|
switch(dev) {
|
||||||
#ifdef SPI_0_EN
|
#ifdef SPI_0_EN
|
||||||
@ -160,14 +159,10 @@ int spi_poweron(spi_t dev)
|
|||||||
SPI_0_DEV->CR1 |= 0x0040; /* turn SPI peripheral on */
|
SPI_0_DEV->CR1 |= 0x0040; /* turn SPI peripheral on */
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case SPI_UNDEFINED:
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_poweroff(spi_t dev)
|
void spi_poweroff(spi_t dev)
|
||||||
{
|
{
|
||||||
switch(dev) {
|
switch(dev) {
|
||||||
#ifdef SPI_0_EN
|
#ifdef SPI_0_EN
|
||||||
@ -176,9 +171,5 @@ int spi_poweroff(spi_t dev)
|
|||||||
SPI_0_DEV->CR1 &= ~(0x0040); /* turn SPI peripheral off */
|
SPI_0_DEV->CR1 &= ~(0x0040); /* turn SPI peripheral off */
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case SPI_UNDEFINED:
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -305,7 +305,7 @@ static inline void irq_handler(uint8_t uartnum, USART_TypeDef *dev)
|
|||||||
uart0_notify_thread();
|
uart0_notify_thread();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
config[uartnum].rx_cb(data);
|
config[uartnum].rx_cb(config[uartnum].arg, data);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (dev->SR & USART_SR_ORE) {
|
else if (dev->SR & USART_SR_ORE) {
|
||||||
@ -316,7 +316,7 @@ static inline void irq_handler(uint8_t uartnum, USART_TypeDef *dev)
|
|||||||
#ifdef MODULE_UART0
|
#ifdef MODULE_UART0
|
||||||
dev->SR &= ~(USART_SR_TXE);
|
dev->SR &= ~(USART_SR_TXE);
|
||||||
#else
|
#else
|
||||||
config[uartnum].tx_cb();
|
config[uartnum].tx_cb(config[uartnum].arg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -110,6 +110,8 @@ void at86rf231_rx_irq(void)
|
|||||||
if (driver_state == AT_DRIVER_STATE_SENDING) {
|
if (driver_state == AT_DRIVER_STATE_SENDING) {
|
||||||
/* Read IRQ to clear it */
|
/* Read IRQ to clear it */
|
||||||
at86rf231_reg_read(AT86RF231_REG__IRQ_STATUS);
|
at86rf231_reg_read(AT86RF231_REG__IRQ_STATUS);
|
||||||
|
/* tx done, listen again */
|
||||||
|
at86rf231_switch_to_rx();
|
||||||
/* clear internal state */
|
/* clear internal state */
|
||||||
driver_state = AT_DRIVER_STATE_DEFAULT;
|
driver_state = AT_DRIVER_STATE_DEFAULT;
|
||||||
return;
|
return;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user