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

Hx711 Communication. PPI, SPIM, PWM. How to improve?

Hi,

I have implemented a hx711 sensor readout with PPI, using SPIM and PWM peripherals. But for this is needed 4 GPIO and one external OR Gate. I wait for a LOW pulse on AL_SPIM_MISO_PIN, and Read SPI data and disable pulse detect. When SPI RX end, I put and extra pulse in ALT_SPIM_SCK_PIN (I only want Channel A with 128 Gain) and enable again pulse detect.

This is the code:

static void spi_init_hx711(void)	    
{
    nrfx_spim_xfer_desc_t xfer_desc = NRFX_SPIM_XFER_TRX(tx_buffer_spi, LS7366_SPI_BUFFER_SIZE, rx_buffer_spi, LS7366_SPI_BUFFER_SIZE);
    
    nrfx_spim_config_t spi_config = NRFX_SPIM_DEFAULT_CONFIG;
    spi_config.frequency      = NRF_SPIM_FREQ_500K;
    spi_config.ss_pin         = SPIM_SS_PIN;
    spi_config.miso_pin       = SPIM_MISO_PIN;
    spi_config.mosi_pin       = SPIM_MOSI_PIN;
    spi_config.sck_pin        = SPIM_SCK_PIN;
    ///spi_config.mode           = NRF_SPIM_MODE_1;
    spi_config.use_hw_ss      = true;
    spi_config.ss_active_high = false;

    
    ret_code_t err_code = nrfx_spim_init(&spi, &spi_config, spim_event_handler, NULL);
    APP_ERROR_CHECK(err_code);

}

void spim_event_handler(nrfx_spim_evt_t const * p_event,
                       void *                   p_context)
{

    if(p_event->type == NRFX_SPIM_EVENT_DONE)
    {
        NRF_LOG_DEBUG("TxDone\n");
        NRF_LOG_HEXDUMP_INFO(rx_buffer_spi,LS7366_SPI_BUFFER_SIZE);
        spi_tx_done = true;
    }
    else
    {
        NRF_LOG_DEBUG("Wrong Event\n");
        // Something is wrong
    }

}


static void hx711_spi_sampling_event_config()
{
    ret_code_t err_code;
 
    err_code = nrf_drv_ppi_init();
    APP_ERROR_CHECK(err_code);

    uint32_t spi_evt_addr;
    uint32_t spi_task_addr;
    uint32_t data_in_evt_addr;
    uint32_t put_clk_pulses_task_addr;
    uint32_t disable_ppi_channel_start_task_addr;
    uint32_t enable_ppi_channel_group_task_addr;

    
    err_code = nrfx_ppi_channel_alloc(&m_ppi_channel_detect_hx711_start_tx); //Detect TX Ready
    APP_ERROR_CHECK(err_code);

    err_code = nrfx_ppi_channel_alloc(&m_ppi_channel_stop_spi); 
    APP_ERROR_CHECK(err_code);

    err_code = nrfx_ppi_group_alloc(&m_ppi_group_hx711);
    APP_ERROR_CHECK(err_code);

    err_code = nrfx_ppi_channel_include_in_group(m_ppi_channel_detect_hx711_start_tx, NRF_PPI_CHANNEL_GROUP0);
    APP_ERROR_CHECK(err_code);

    data_in_evt_addr = nrfx_gpiote_in_event_addr_get(ALT_SPIM_MISO_PIN); //DATAIN going low detect
   
    static uint16_t seq_values[] ={0};
    
    nrf_pwm_sequence_t const seq =
    {
        .values.p_common = seq_values,
        .length          = NRF_PWM_VALUES_LENGTH(seq_values),
        .repeats         = 1,
        .end_delay       = 0
    };
    
    spi_task_addr = nrfx_spim_start_task_get(&spi); //SPI START task address
    put_clk_pulses_task_addr = nrfx_pwm_simple_playback(&m_pwm1, &seq, 1,
            NRFX_PWM_FLAG_STOP |
            NRFX_PWM_FLAG_START_VIA_TASK);
    disable_ppi_channel_start_task_addr = nrfx_ppi_task_addr_get(NRF_PPI_TASK_CHG0_DIS);
    
    //1ST PPI CHANNEL
    err_code = nrfx_ppi_channel_assign(m_ppi_channel_detect_hx711_start_tx,
                                       data_in_evt_addr,
                                       spi_task_addr); //Start SPI RX                                    
    APP_ERROR_CHECK(err_code);
    err_code = nrfx_ppi_channel_fork_assign(m_ppi_channel_detect_hx711_start_tx,
                                            disable_ppi_channel_start_task_addr); //Disable DIN Detect
    APP_ERROR_CHECK(err_code);

    
    //2ND PPI CHANNEL
    spi_evt_addr = nrfx_spim_end_event_get(&spi);
    enable_ppi_channel_group_task_addr = nrfx_ppi_task_addr_get(NRF_PPI_TASK_CHG0_EN);
    err_code = nrfx_ppi_channel_assign(m_ppi_channel_stop_spi,
                                      spi_evt_addr,
                                      put_clk_pulses_task_addr); //Put Extra pulses
                                       
    APP_ERROR_CHECK(err_code);
    err_code = nrfx_ppi_channel_fork_assign(m_ppi_channel_stop_spi, enable_ppi_channel_group_task_addr); //Renable MISO go down detection
    APP_ERROR_CHECK(err_code);

}

static void hx711_spi_init()
{
    
    ret_code_t err_code = nrfx_ppi_channel_enable(m_ppi_channel_detect_hx711_start_tx);
    APP_ERROR_CHECK(err_code);

    err_code = nrfx_ppi_group_enable(m_ppi_group_hx711);
    APP_ERROR_CHECK(err_code);

    err_code = nrfx_ppi_channel_enable(m_ppi_channel_stop_spi);
    APP_ERROR_CHECK(err_code);

    nrfx_gpiote_in_event_enable(ALT_SPIM_MISO_PIN, true); 

}

static void pwm_init()
{
    uint32_t err_code;
// Config the pwm to set additional pulses in SPI
    nrfx_pwm_config_t const config1 =
    {
        .output_pins =
        {
            ALT_SPIM_SCK_PIN,                                       // channel 0
            NRFX_PWM_PIN_NOT_USED,                                        // channel 1
            NRFX_PWM_PIN_NOT_USED,                                        // channel 2
            NRFX_PWM_PIN_NOT_USED,                                        // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_HIGH,
        .base_clock   = NRF_PWM_CLK_2MHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 1,
        .load_mode    = NRF_PWM_LOAD_COMMON,
        .step_mode    = NRF_PWM_STEP_AUTO
    };
    err_code = nrfx_pwm_init(&m_pwm1, &config1, NULL);

}

static void spi_prepare_transfer(void)
{
    tx_buffer_spi[0] = 0xAA; //Dont worry about this number
    memset(rx_buffer_spi,0,3);
    nrfx_spim_xfer_desc_t xfer = NRFX_SPIM_XFER_TRX(tx_buffer_spi, 1, rx_buffer_spi, 3);
    uint32_t flags = NRFX_SPIM_FLAG_HOLD_XFER | NRFX_SPIM_FLAG_REPEATED_XFER | NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER;
    nrfx_spim_xfer(&spi, &xfer, flags);

}

int main(void)
{
    (...)
    
    spi_init_hx711();
    
    pwm_init();
    
    hx711_spi_sampling_event_config();
    
    hx711_spi_init();
    
    (...)
    
    
}



How can i delete the OR Gate, or extra PINs?

Thank you.

Related