Hi,
-I have a custom board using nrf 52832 and I have interfaced LIS2DH12 using an SPI interface.
-I am using SDK 15.2.0.
-I am collecting raw data using FIFO mode and send them serially.
-I have configured watermark interrupt on INT1 of Lis2dh12.
-INT1 pin of Lisdh12 is connected to pin P0_19 of nrf 52832.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Whenever Watermark interrupt occurs I have read raw data from the lis2dh12 sensor. After reading raw data from FIFO I read FIFO_SRC_REG. It has been observed that for first-time watermark interrupt occurs its value is 10 i.e un-read sample. For the next watermark interrupt its value is 28 and next its value is 29.
I have performed some calculations as follows.
SPi Freq 4000000
Time for 1 bit 0.25us
Time for 1 byte 4 us
No of byte per acc value 12us
Time to transfer to read 1 FIFO value 48 us.
AS per my understanding as I am using baud rate 4 MBPS for SPI then for the first watermark interrupt its value should be 2 then it is multiple of 2. I think there is some SPI overhead due to this I am getting a value of 10 instead of 2.AM I right? .
What is the reason for this behavior?
I have captured the SPI clock and SDI pin waveform and attached it herewith.
Clock - Yellow

SDI - Blue
A snippet of code as follows
/////////////////////////////////////////////////////////////////////
#define MAX_FIFO_SAMPLE 10
#define FIFO_INTERRUPT_PIN 19
uint8_t x_M_buf[1]={0};
uint8_t x_L_buf[1]={0};
uint8_t y_M_buf[1]={0};
uint8_t y_L_buf[1]={0};
uint8_t z_M_buf[1]={0};
uint8_t z_L_buf[1]={0};
char outfft[1024] = {0};
volatile uint8_t fifo_interrupt_status;
static uint32_t fifo_pin_status = 0;
struct
{
uint8_t x_buf[MAX_ACCEL_DATA_SIZE];
uint8_t y_buf[MAX_ACCEL_DATA_SIZE];
uint8_t z_buf[MAX_ACCEL_DATA_SIZE];
}lis2dh_get_data[MAX_FIFO_SAMPLE];
/*=============================================================================================================
SERIAL UART CONFIGURATION
===============================================================================================================*/
#define SERIAL_FIFO_TX_SIZE 250
#define SERIAL_FIFO_RX_SIZE 250
#define SERIAL_BUFF_TX_SIZE 1
#define SERIAL_BUFF_RX_SIZE 1
NRF_SERIAL_DRV_UART_CONFIG_DEF ( m_uart0_drv_config,
RX_PIN_NUM,
TX_PIN_NUM, // Rx pin = P0.03 -- Tx pin = P0.04
RTS_PIN_NUMBER , CTS_PIN_NUMBER ,
NRF_UART_HWFC_DISABLED , NRF_UART_PARITY_EXCLUDED ,
UART_BAUDRATE_BAUDRATE_Baud1M,
UART_DEFAULT_CONFIG_IRQ_PRIORITY ) ;
NRF_SERIAL_QUEUES_DEF(serial_queues, SERIAL_FIFO_TX_SIZE, SERIAL_FIFO_RX_SIZE);
NRF_SERIAL_BUFFERS_DEF(serial_buffs, SERIAL_BUFF_TX_SIZE, SERIAL_BUFF_RX_SIZE);
NRF_SERIAL_UART_DEF(serial_uart, 0);
//////////////////////////////////////////////////////////////////////////////////////////
void init_spi(void)
{
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = 17;
spi_config.miso_pin = 16;
spi_config.mosi_pin = 15;
spi_config.sck_pin = 18;
spi_config.irq_priority = APP_IRQ_PRIORITY_LOW ; // original
spi_config.frequency = NRF_SPI_FREQ_4M;
spi_config.mode = NRF_DRV_SPI_MODE_0;
spi_config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST;
//APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler));
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
}
void GetLis2dhData()
{
x_M_buf[0] = spi_read_reg(LIS2DH_OUT_X_H);
x_L_buf[0] = spi_read_reg(LIS2DH_OUT_X_L);
y_M_buf[0] = spi_read_reg(LIS2DH_OUT_Y_H);
y_L_buf[0] = spi_read_reg(LIS2DH_OUT_Y_L);
z_M_buf[0] = spi_read_reg(LIS2DH_OUT_Z_H);
z_L_buf[0] = spi_read_reg(LIS2DH_OUT_Z_L);
}
void get_raw_data_common_func(uint8_t idx)
{
GetLis2dhData();
lis2dh_get_data[idx].x_buf[X_LSB] = x_M_buf[0] ;
lis2dh_get_data[idx].y_buf[Y_LSB] = y_M_buf[0] ;
lis2dh_get_data[idx].z_buf[Z_LSB] = z_M_buf[0] ;
}
void config_acc_5376(void)
{
spi_write_reg(LIS2DH_CTRL_REG1, 0x9F); // Turn on the sensor with ODR = 5376 Hz normal mode.
spi_write_reg(LIS2DH_CTRL_REG2, 0x08 ); // High-pass filter (HPF) enabled
spi_write_reg(LIS2DH_CTRL_REG4, 0X80); // Full Scale = +/-2 g with BDU and HR bits enabled.
spi_write_reg(LIS2DH_CTRL_REG3, 0X44); / Watermark interrupt enable on INT1
spi_write_reg(LIS2DH_CTRL_REG5, 0x40); // Eneble Fifo.
spi_write_reg(LIS2DH_CTRL_REG6, 0X00); // Active Low INT1 pin
spi_write_reg(LIS2DH_FIFO_CTRL_REG, 0x00); // Reset the fifo
spi_write_reg(LIS2DH_FIFO_CTRL_REG, 0X8A); // FIFO MODE -STREAM ENABLE AND NO SAMPLE 10
}
void clock_init_setup()
{
ret_code_t err_code;
err_code = nrf_drv_clock_init();
APP_ERROR_CHECK(err_code);
nrf_drv_clock_lfclk_request(NULL);
}
int main(void)
{
ret_code_t err_code;
uint8_t idx = 0 ;
init_spi();
// INITIALIZATION OF SERIAL
err_code = nrf_serial_init(&serial_uart, &m_uart0_drv_config, &serial_config);
APP_ERROR_CHECK(err_code);
nrf_gpio_cfg_input(FIFO_INTERRUPT_PIN,NRF_GPIO_PIN_NOPULL); // Configured pin as input
while (1)
{
fifo_pin_status = nrf_gpio_pin_read(FIFO_INTERRUPT_PIN);
if ( fifo_pin_status == 1 )
{
// Clear getdata buffer
memset(lis2dh_get_data,0,sizeof(lis2dh_get_data));
for ( idx = 0 ; idx < MAX_FIFO_SAMPLE ; idx++)
{
get_raw_data_common_func(idx);
}
fifo_interrupt_status = spi_read_reg(LIS2DH_FIFO_SRC_REG) & 0x1F;
// Read Raw Data
if (enableRAW == D_START_RAW )
{
memset(outfft, 0, sizeof(outfft));
for ( idx = 0; idx < MAX_FIFO_SAMPLE;idx++)
{
sprintf(outfft,"%u,%u,%u,%u,%u,%d,%d|"
,1
,1
,lis2dh_get_data[idx].x_buf[X_MSB]
,lis2dh_get_data[idx].y_buf[Y_MSB]
,lis2dh_get_data[idx].z_buf[Z_MSB]
,fifo_interrupt_status
,1);
err_code = nrf_serial_write(&serial_uart,outfft,strlen(outfft),NULL,0);
APP_ERROR_CHECK(err_code);
while (TX_DONE == 0);
TX_DONE = 0;
memset(outfft, 0, sizeof(outfft));
}
}
}
}
}