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

Using SPI transaction manager for flash in scheduled mode

I am using version 15.2 of the SDK.  I am trying to use the SPI transaction manager for reading/writing a SPI flash using the scheduled mode.  I am getting callbacks, but the rx_buffer is not getting updated.  Using the blocking "perform" mode of the transaction manager actually works.  It is only the schedule mode that I am having issues with.  Thanks!

Parents
  • Can you post your code? I'm using the spi_mngr and it works fine.

  • #define OPCODE_READ             0x03

    static uint8_t rx_buf[256];
    static uint8_t const tx_buf[] = { OPCODE_READ, 0, 0, 0};
    static nrf_spi_mngr_transfer_t const transfers_cmd[] = {
        NRF_SPI_MNGR_TRANSFER(tx_buf, 4, rx_buf, 6)
    };


    static void read_block_begin_cb(void *p_user_data)
    {
    NRF_LOG_DEBUG("Start SPI flash read block.");
    }


    static void read_block_end_cb(ret_code_t result, void *p_user_data)
    {
    bool *x = p_user_data;
    *x = true;
    NRF_LOG_DEBUG("End SPI flash read block.");
    }


    bool Read_Block(uint32_t StartAddress, uint8_t *DataPointer, uint32_t DataLength)
    {
    ret_code_t err_code;
    static bool done;

    static nrf_spi_mngr_transaction_t const transaction_cmd =
    {
    .begin_callback = read_block_begin_cb,
    .end_callback = read_block_end_cb,
    .p_user_data = &done,
    .p_transfers = &transfers_cmd,
    .number_of_transfers = 1,
    .p_required_spi_cfg = NULL
    };

    err_code = nrf_spi_mngr_schedule(&m_nrf_spi_mngr, &transaction_cmd);
    if (err_code != 0) return true;
    while(done == false);

    return false;
    }

Reply
  • #define OPCODE_READ             0x03

    static uint8_t rx_buf[256];
    static uint8_t const tx_buf[] = { OPCODE_READ, 0, 0, 0};
    static nrf_spi_mngr_transfer_t const transfers_cmd[] = {
        NRF_SPI_MNGR_TRANSFER(tx_buf, 4, rx_buf, 6)
    };


    static void read_block_begin_cb(void *p_user_data)
    {
    NRF_LOG_DEBUG("Start SPI flash read block.");
    }


    static void read_block_end_cb(ret_code_t result, void *p_user_data)
    {
    bool *x = p_user_data;
    *x = true;
    NRF_LOG_DEBUG("End SPI flash read block.");
    }


    bool Read_Block(uint32_t StartAddress, uint8_t *DataPointer, uint32_t DataLength)
    {
    ret_code_t err_code;
    static bool done;

    static nrf_spi_mngr_transaction_t const transaction_cmd =
    {
    .begin_callback = read_block_begin_cb,
    .end_callback = read_block_end_cb,
    .p_user_data = &done,
    .p_transfers = &transfers_cmd,
    .number_of_transfers = 1,
    .p_required_spi_cfg = NULL
    };

    err_code = nrf_spi_mngr_schedule(&m_nrf_spi_mngr, &transaction_cmd);
    if (err_code != 0) return true;
    while(done == false);

    return false;
    }

Children
Related