This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

address conflict between saadc buffer and fds rec_id

The problem is a little weird and takes me a few hours to address it. But I still don't know how this happens.

Here is the problem, in my application I use saadc to measure voltage. Then I use fds to store some sensor data. I notice that even I set rec_id (e.g. 0x1111) to write sensor data to flash. The rec_id is always changed to saadc value. I suspect the buffer used for saadc is shared with rec_id. But I don't understand why. Is there any way I can change the address for storing rec_id or saadc_buffer?

here is my saadc_callback

/**
 * @brief SAADC (battery) sensor event callback.
 */

void saadc_callback(nrf_drv_saadc_evt_t const * p_saadc_event)
{
    if (p_saadc_event->type == NRF_DRV_SAADC_EVT_DONE)
    {
        ret_code_t err_code;
				char	data_arr_volt[20];

        err_code = nrf_drv_saadc_buffer_convert(p_saadc_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);
 #ifdef UART_PRINTING_ENABLED       
        NRF_LOG_INFO("saadc value= %d\r\n", p_saadc_event->data.done.p_buffer[0]);
				printf("voltage value %d on pin AIN0\r\n",p_saadc_event->data.done.p_buffer[0]);
#endif
				sprintf(data_arr_volt, "%d volt on AIN0_V\r\n", p_saadc_event->data.done.p_buffer[0]);		//get two decimal	
//			ble_nus_data_send(&m_nus, data_array, &length, conn_handle);
			uint16_t length = strlen(data_arr_volt);
			if (m_conn_handle == 0)
			{
				m_conn_handle = m_conn_handle+1;
				err_code = ble_nus_data_send(&m_nus, (uint8_t *)data_arr_volt, &length, m_conn_handle);
			}
			else if(m_conn_handle == 1)
			{
				m_conn_handle = m_conn_handle-1;
				err_code = ble_nus_data_send(&m_nus, (uint8_t *)data_arr_volt, &length, m_conn_handle);
			}			
			
			
}	
    }

}

Here is a regular fds_write()

uint32_t file_id = 0x02000;
uint32_t rec_id_write = 0x1111;
uint32_t rec_id_read = 0x1111;
uint32_t rec_id_delete = 0x1111;


/* Data to write in flash. */
struct 
{
  char string[50] ;                         //Change this size as required.
}fds_data;



fds_record_t record =
{
  .file_id           = 0x02000,
  .key               = 0x1111,
  .data.p_data       = &fds_data,
  /* The length of a record is always expressed in 4-byte units (words). */
  .data.length_words = 50,//(sizeof(fds_data_str) + 3) / 4,                  //Also change this if array size is changed.
};


void fds_write()
{

  ret_code_t rc;

strcpy( fds_data.string, "\n test_fds.\n" );

#ifdef UART_PRINTING_ENABLED
  NRF_LOG_INFO("Writing start");
	printf("Writing start");

	#endif

 fds_record_desc_t desc = {0};
  record.file_id = file_id;


//	fds_data.string = "test"; //{'a', 'b', 'c','d'};
  for(int i=0;i<1;i++)
  {  
    memset(&desc, 0x00, sizeof(fds_record_desc_t)); 
    record.key = rec_id_write;
    rc = fds_record_write(&desc, &record);
    wait_for_write();
    if(rc == FDS_SUCCESS) {
			#ifdef UART_PRINTING_ENABLED
      NRF_LOG_INFO("\nData written with id %d \n",rec_id_write);//
			printf("\nData written with id %d\n",rec_id_write);//
			#endif

    }
    else {
			#ifdef UART_PRINTING_ENABLED
      NRF_LOG_INFO("\nWrite Failed, id %d\n",rec_id_write);
			printf("\nWrite Failed, id %d\n",rec_id_write);
			#endif
    }
    rec_id_write++;
  }  

}

Thanks,

-Lei

Parents
  • Hi,

    The rec_id is always changed to saadc value. I suspect the buffer used for saadc is shared with rec_id. But I don't understand why.

    It is not supposed to be shared. It sounds more like the SAADC DMA buffer is inadvertently overwriting your record id variable. Is it possible that you may have a buffer overrun? Can you show how you are defining the buffer?

    Best regards,

    Vidar

     

Reply
  • Hi,

    The rec_id is always changed to saadc value. I suspect the buffer used for saadc is shared with rec_id. But I don't understand why.

    It is not supposed to be shared. It sounds more like the SAADC DMA buffer is inadvertently overwriting your record id variable. Is it possible that you may have a buffer overrun? Can you show how you are defining the buffer?

    Best regards,

    Vidar

     

Children
No Data
Related