How to read and write to SD the iis3dwb sensor at maximum rate?
Hi,
I'm using the STEVAL-STWINKT1B development board to read the iis3dwb accellerometer and write to the sd as in the HSdatalog example.
To do this I use freertos and fatfs.
I created the project first on CubeMx where I set the parameters to read SPI, write and read from SD and activated the interrupts for the accelerometer pion.
To do this I created 2 threads and used 2 semaphores as shown in the example below.
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for myTask02 */
osThreadId_t myTask02Handle;
const osThreadAttr_t myTask02_attributes = {
.name = "myTask02",
.stack_size = 256 * 4,
.priority = (osPriority_t) osPriorityLow,
};
/* Definitions for myBinarySem01 */
osSemaphoreId_t myBinarySem01Handle;
const osSemaphoreAttr_t myBinarySem01_attributes = {
.name = "myBinarySem01"
};
/* Definitions for myBinarySem02 */
osSemaphoreId_t myBinarySem02Handle;
const osSemaphoreAttr_t myBinarySem02_attributes = {
.name = "myBinarySem02"
};
/* USER CODE BEGIN PV */
static uint8_t whoamI;
stmdev_ctx_t dev_ctx;
static uint8_t iis3dwb_mem[256 * 7];
/* USER CODE END PV */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
osSemaphoreAcquire(myBinarySem01Handle, osWaitForever);
osSemaphoreAcquire(myBinarySem02Handle, osWaitForever);
/* Initialize mems driver interface */
dev_ctx.write_reg = acc_write;
dev_ctx.read_reg = acc_read;
dev_ctx.handle = &hspi3;
/* Init test platform */
HAl_Delay(1010);
/* Check device ID */
iis3dwb_device_id_get(&dev_ctx, &whoamI);
if (whoamI != IIS3DWB_ID)
while (1){
}
iis3dwb_reset_set(&dev_ctx, 1);
iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);
/*Set fifo in continuous / stream mode*/
iis3dwb_i2c_interface_set(&dev_ctx, IIS3DWB_I2C_DISABLE);
iis3dwb_fifo_mode_set(&dev_ctx, IIS3DWB_STREAM_MODE);
/*Set watermark*/
iis3dwb_fifo_watermark_set(&dev_ctx, 256);
/* FIFO_WTM_IA routing on pin INT1 */
iis3dwb_pin_int1_route_t pin_int1_route;
pin_int1_route.boot=0;
pin_int1_route.drdy_xl=0;
pin_int1_route.fifo_bdr=0;
pin_int1_route.fifo_full=0;
pin_int1_route.fifo_ovr=0;
pin_int1_route.fifo_th=1;
pin_int1_route.sleep_change=0;
pin_int1_route.sleep_status=0;
pin_int1_route.wake_up=0;
iis3dwb_pin_int1_route_set(&dev_ctx, &pin_int1_route);
/*Enable writing to FIFO*/
iis3dwb_fifo_xl_batch_set(&dev_ctx, IIS3DWB_XL_BATCHED_AT_26k7Hz);
/* Infinite loop */
for(;;)
{
osSemaphoreAcquire(myBinarySem01Handle, osWaitForever);
uint16_t val;
iis3dwb_fifo_data_level_get(&dev_ctx, &val)
iis3dwb_read_reg(&dev_ctx, IIS3DWB_FIFO_DATA_OUT_TAG, (uint8_t *)iis3dwb_mem, val * 7);
osSemaphoreRelease(myBinarySem02Handle);
}
/* USER CODE END 5 */
}
/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
FRESULT fres;
uint32_t byteswritten, bytesread; /* File write/read counts */
fres = f_mount(&SDFatFS, (TCHAR const*)SDPath, 1);
/* Infinite loop */
for(;;)
{
osSemaphoreAcquire(myBinarySem02Handle, osWaitForever);
fres = f_open(&SDFile, "TEST.csv", FA_CREATE_ALWAYS | FA_WRITE);
fres = f_write(&SDFile, iis3dwb_mem, strlen((char *)iis3dwb_mem), (void *)&byteswritten);
fres = f_close(&SDFile);
}
/* USER CODE END StartTask02 */
}
/* USER CODE BEGIN 4 */
/**
* @brief EXTI line detection callback.
* @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
osSemaphoreRelease(myBinarySem01Handle);
}
