Skip to content
Snippets Groups Projects
Commit 72e4d64d authored by Georg von Zengen's avatar Georg von Zengen
Browse files

further work on dw1000 driver

parent f4f64e01
No related branches found
No related tags found
No related merge requests found
#ifndef __dw1000_hal_H
#define __dw1000_hal_H
#include "FreeRTOS.h"
#include "task.h"
extern TaskHandle_t xHandleDW1000HAL;
#define DW1000HAL_SPI_TIMEOUT 10
......@@ -17,6 +20,5 @@ int dw1000Hal_readDmaRegister(uint8_t regID, uint8_t *dest, uint16_t len, void (
int dw1000Hal_writeDmaRegister(uint8_t regID, uint8_t *src, uint16_t len, void (*callback)(int state, void *data, uint16_t len));
void vTaskDW1000HAL(void *pvParameters);
void dw1000Hal_extiCallback(void);
#endif /*__ dw1000_hal_H */
......@@ -4,8 +4,10 @@
#include "deca_regs.h"
// sends a frame and blocks until finished
int dw1000_sendFrame(uint8_t *payload, uint16_t len) {
int dw1000_sendFrame(uint8_t *payload, uint16_t len)
{
uint64_t event_clear = 0;
// write tx data to data buffer
// this buffer only contains the payload, PHR is generated by the chip
// the chip automatically appends two FCS (CRC) bytes to this payload
......@@ -69,3 +71,11 @@ int dw1000_sendFrame(uint8_t *payload, uint16_t len) {
return 0;
}
int dw1000_setPanAddr(uint16_t addr)
{
return dw1000Hal_writeSubRegister(PANADR_ID, PANADR_SHORT_ADDR_OFFSET,(uint8_t*)&addr,PANADR_SHORT_ADDR_LEN);
}
int dw1000_setPanId(uint16_t addr)
{
return dw1000Hal_writeSubRegister(PANADR_ID, PANADR_PAN_ID_OFFSET,(uint8_t*)&addr,PANADR_PAN_ID_LEN);
}
......@@ -9,12 +9,15 @@
#include "spi.h"
#include "test_app.h"
SPI_HandleTypeDef *hspi;
uint8_t read3[7];
static void (*spiCallback)(int state, void *data, uint16_t len);
static void *spiCallbackData;
static SemaphoreHandle_t spiSema = NULL; //semaphore for SPI access
TaskHandle_t xHandleDW1000HAL = NULL;
void dw1000Hal_reset(void)
{
......@@ -127,7 +130,7 @@ int dw1000Hal_readRegister(uint8_t regID, uint8_t *dest, uint16_t len)
xSemaphoreGive(spiSema);
} else {
ret = HAL_LOCKED;
trace_printf("nb");
//trace_printf("nb");
}
portEXIT_CRITICAL();
return ret;
......@@ -150,7 +153,7 @@ int dw1000Hal_readRegisterFromIsr(uint8_t regID, uint8_t *dest, uint16_t len)
xSemaphoreGiveFromISR(spiSema,pdFALSE);
} else {
ret = HAL_LOCKED;
trace_printf("ib");
//trace_printf("ib");
}
return ret;
}
......@@ -173,7 +176,7 @@ int dw1000Hal_writeRegister(uint8_t regID, uint8_t *src, uint16_t len)
xSemaphoreGive(spiSema);
} else {
ret = HAL_LOCKED;
trace_printf("na");
//trace_printf("na");
}
portEXIT_CRITICAL();
return ret;
......@@ -196,7 +199,7 @@ int dw1000Hal_writeRegisterFromIsr(uint8_t regID, uint8_t *src, uint16_t len)
xSemaphoreGiveFromISR(spiSema,pdFALSE);
} else {
ret = HAL_LOCKED;
trace_printf("ia");
//trace_printf("ia");
}
return ret;
}
......@@ -251,8 +254,6 @@ void vTaskDW1000HAL(void *pvParameters)
hspi = &hspi1;
spiSema = xSemaphoreCreateMutex(); //creating semaphore for SPI access
TickType_t xNextWakeTime;
xNextWakeTime = xTaskGetTickCount();
//Configure the dw1000
dw1000Hal_reset();
......@@ -262,21 +263,34 @@ void vTaskDW1000HAL(void *pvParameters)
//trace_printf("sys_mask %x\n",sys_mask);
dw1000Hal_writeRegister(SYS_MASK_ID,&sys_mask,SYS_MASK_LEN);
//set TX LED
uint32_t gpio = 0x00001000UL;
uint32_t gpio = 0x5540;
dw1000Hal_writeSubRegister(GPIO_CTRL_ID,GPIO_MODE_OFFSET,(uint8_t*)&gpio,GPIO_MODE_LEN);
uint32_t led = 0;
dw1000Hal_readSubRegister(PMSC_ID,PMSC_CTRL0_OFFSET,(uint8_t*)&led,PMSC_CTRL0_LEN);
led |= (1<<18) | (1<<23); // Preparing LEDs for blink mode
dw1000Hal_writeSubRegister(PMSC_ID,PMSC_CTRL0_OFFSET,(uint8_t*)&led,PMSC_CTRL0_LEN);
dw1000Hal_readSubRegister(PMSC_ID,PMSC_LEDC_OFFSET,(uint8_t*)&led,PMSC_LEDC_LEN);
led |= PMSC_LEDC_BLNKEN;
led |= PMSC_LEDC_BLNKEN; // enable blink mode
//led |= 0xF0000; // force leds to blink once
dw1000Hal_writeSubRegister(PMSC_ID,PMSC_LEDC_OFFSET,(uint8_t*)&led,PMSC_LEDC_LEN);
//led &= ~0xF0000; // reset froce blink bits. needed to make the leds blinking
//dw1000Hal_writeSubRegister(PMSC_ID,PMSC_LEDC_OFFSET,(uint8_t*)&led,PMSC_LEDC_LEN);
//uint8_t event_clear[SYS_STATUS_LEN];
//memset(event_clear, 0xff, SYS_STATUS_LEN);
//dw1000Hal_writeRegister(SYS_STATUS_ID, &event_clear, SYS_STATUS_LEN);
uint32_t sys_ctrl = 0;
dw1000Hal_readRegisterFromIsr(SYS_CTRL_ID, (uint8_t*)&sys_ctrl, SYS_CTRL_LEN); // switch to rx mode
sys_ctrl |= SYS_CTRL_RXENAB;
dw1000Hal_writeRegisterFromIsr(SYS_CTRL_ID, (uint8_t*)&sys_ctrl, SYS_CTRL_LEN);
uint8_t led_values = 0;
TickType_t xNextWakeTime;
xNextWakeTime = xTaskGetTickCount();
while(1){
vTaskDelayUntil(&xNextWakeTime, 1000/portTICK_PERIOD_MS);
osDelay(1000);
}
vTaskDelete( NULL );
}
......@@ -323,14 +337,23 @@ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
void dw1000Hal_extiCallback(void)
{
BaseType_t xHigherPriorityTaskWoken;
uint64_t event = 0;
uint64_t event_clear = 0;
dw1000Hal_readRegisterFromIsr(SYS_STATUS_ID, (uint8_t*)&event, SYS_STATUS_LEN);
if (event & SYS_STATUS_TXFRS){ // Frame sent
event_clear |= SYS_STATUS_TXFRS ; //clear interrupt
//trace_printf("sent\n");
uint32_t sys_ctrl = 0;
dw1000Hal_readRegisterFromIsr(SYS_CTRL_ID, (uint8_t*)&sys_ctrl, SYS_CTRL_LEN); // switch to rx mode
sys_ctrl |= SYS_CTRL_RXENAB;
dw1000Hal_writeRegisterFromIsr(SYS_CTRL_ID, (uint8_t*)&sys_ctrl, SYS_CTRL_LEN);
xHigherPriorityTaskWoken = pdFALSE;
xTaskNotifyFromISR( xHandleTestApp, 0x50, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
}
if (event & SYS_STATUS_RXDFR){ // Frame sent
if (event & SYS_STATUS_RXDFR){ // Frame received
event_clear |= SYS_STATUS_RXDFR; //clear interrupt
//trace_printf("received\n");
uint32_t sys_ctrl = 0;
dw1000Hal_readRegisterFromIsr(SYS_CTRL_ID, (uint8_t*)&sys_ctrl, SYS_CTRL_LEN); // switch to rx mode
sys_ctrl |= SYS_CTRL_RXENAB;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment