SPI end of TX

Hi there,

We're using nRF52840, IAR 8.40.1, nRF5_SDK_16.0.0_98a08e2.

My question is, I need to toggle a GPIO pin right after SPI finishes the TX transaction and right before it starts the RX transaction.
Is it possible to do that?  If yes, where in the SDK can I intercept that?

For example, I notice that there's this event:
NRF_SPIM_EVENT_ENDTX

Is this the event where we just finished sending to MOSI and are about to receive from MISO?
If yes, is it possible to provide a callback when this event happens?

Thanks,
Cecylia

Parents
  • Hello Cecylia,

    NRF_SPIM_EVENT_ENDTX

    Is this the event where we just finished sending to MOSI and are about to receive from MISO?

    That depends on the application and the HW that you are connecting to. It depends on how many bytes that you expect to write, and how many bytes you expect to receive, if any. 

    If you want to do some testing, you can test the example found in SDK\examples\peripheral\spi. 

    This will give you a callback event spi_event_handler() in main.c when you receive data. 

    Best regards,

    Edvin

  • Hi Edvin,

    That depends on the application and the HW that you are connecting to. It depends on how many bytes that you expect to write, and how many bytes you expect to receive, if any. 

    Suppose we're just sending one byte and expect to receive back one byte, how would you go about intercepting the code right before we receive back the MISO?

    This will give you a callback event spi_event_handler() in main.c when you receive data. 

    But I need to intercept before MISO comes in.  The spi_event_handler() is typically called after the whole MOSI+MISO transaction is finished.

    Thank you,
    Cecylia

  • Maybe just use the DCX function available on SPIM3 to drive the pin

  •   thanks! That sounds very much like what I'm looking for.

    I'm going to find more examples on how to set the DCX pin.  But, from quick browsing on the SDK, it looks like I will have to change the nrf_drv_spi_init() in the driver? Because during this SPI init, it will call SPIM init, but I don't see any code that sets 'dcx_pin'.

    Did you have to change the driver, too?

    ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance,
                                nrf_drv_spi_config_t const * p_config,
                                nrf_drv_spi_evt_handler_t    handler,
                                void *                       p_context)
    {
    ...
    
    #ifdef SPIM_PRESENT
            nrfx_spim_config_t config_spim = NRFX_SPIM_DEFAULT_CONFIG;
            config_spim.sck_pin        = p_config->sck_pin;
            config_spim.mosi_pin       = p_config->mosi_pin;
            config_spim.miso_pin       = p_config->miso_pin;
            config_spim.ss_pin         = p_config->ss_pin;
            config_spim.irq_priority   = p_config->irq_priority;
            config_spim.orc            = p_config->orc;
            
    // Where can we set the 'dcx_pin'??? Need to modify nrf_drv_spi_init??? 
    
            config_spim.frequency      = (nrf_spim_frequency_t)p_config->frequency;
            config_spim.mode           = (nrf_spim_mode_t)p_config->mode;
            config_spim.bit_order      = (nrf_spim_bit_order_t)p_config->bit_order;
            result = nrfx_spim_init(&p_instance->u.spim,
                                    &config_spim,
                                    handler ? spim_evt_handler : NULL,
                                    (void *)inst_idx);
    #endif

Reply
  •   thanks! That sounds very much like what I'm looking for.

    I'm going to find more examples on how to set the DCX pin.  But, from quick browsing on the SDK, it looks like I will have to change the nrf_drv_spi_init() in the driver? Because during this SPI init, it will call SPIM init, but I don't see any code that sets 'dcx_pin'.

    Did you have to change the driver, too?

    ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance,
                                nrf_drv_spi_config_t const * p_config,
                                nrf_drv_spi_evt_handler_t    handler,
                                void *                       p_context)
    {
    ...
    
    #ifdef SPIM_PRESENT
            nrfx_spim_config_t config_spim = NRFX_SPIM_DEFAULT_CONFIG;
            config_spim.sck_pin        = p_config->sck_pin;
            config_spim.mosi_pin       = p_config->mosi_pin;
            config_spim.miso_pin       = p_config->miso_pin;
            config_spim.ss_pin         = p_config->ss_pin;
            config_spim.irq_priority   = p_config->irq_priority;
            config_spim.orc            = p_config->orc;
            
    // Where can we set the 'dcx_pin'??? Need to modify nrf_drv_spi_init??? 
    
            config_spim.frequency      = (nrf_spim_frequency_t)p_config->frequency;
            config_spim.mode           = (nrf_spim_mode_t)p_config->mode;
            config_spim.bit_order      = (nrf_spim_bit_order_t)p_config->bit_order;
            result = nrfx_spim_init(&p_instance->u.spim,
                                    &config_spim,
                                    handler ? spim_evt_handler : NULL,
                                    (void *)inst_idx);
    #endif

Children
Related