This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS131M08: SPI short frames

Part Number: ADS131M08

Tool/software:

I'm using an STM32L4P5 Discovery kit to read the default values of the registers from the ADS131M08. When I introduce a minimum delay of 4ms between the SPI transmit and receive, I successfully get the expected default value. Without this delay, I receive an incorrect value.

For example, when reading the ID register:

  • Without delay: id = 0x0007
  • With 4ms delay: id = 0x2801

why this delay is necessary and how to potentially eliminate it?

SPI Parameter settings:

SPI mode  =  MODE 1  (CPOL = 0 , CPHA = 1)
SCK = 3MHz 



uint16_t ads131m08_rreg (uint8_t addr) {

	// 24 bits word length
    uint8_t cmd[3];
    uint8_t res[3]; // response

    uint16_t read_cmd = OPCODE_RREG | (addr << 7);

    cmd[0] = read_cmd >> 8;
    cmd[1] = (uint8_t) read_cmd & 0x00FF;
    cmd[2] = 0x00; // zero padding to match 24 bits word length

    /*chip select*/
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);

    if (HAL_SPI_Transmit_DMA(&hspi2, cmd, 3) != HAL_OK) {
        // Handle error
        HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
        return 0;
    }

    HAL_Delay(4); // Delay required to get the response 

    // Wait for the transmit to complete
    while (HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY) {
        // Do nothing, just wait
    }

    if (HAL_SPI_Receive_DMA(&hspi2, res, 3) != HAL_OK) {
        // Handle error
        HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
        return 0;
    }

    // Wait for the receive to complete
    while (HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY) {
        // Do nothing, just wait
    }

    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);

    uint16_t ret = ((uint16_t) res[0] << 8) | res[1];

    return ret;
}

 

- Srihari