Using nrf54l15 dppi to create latency

Hi:

I tested the 160us using a logic analysis instrument, but couldn't capture the waveform.

/* -------------------------------------------------------
 * DPPI 通道定义
 * 任务通道(Timer CC 事件发布):0~4
 * 触发通道(外部事件触发延时):5~9
 * ------------------------------------------------------- */
#define DPPI_CH_TASK_1US    0
#define DPPI_CH_TASK_20US   1
#define DPPI_CH_TASK_35US   2
#define DPPI_CH_TASK_160US  3
#define DPPI_CH_TASK_180US  4

#define DPPI_CH_TRIG_1US    5
#define DPPI_CH_TRIG_20US   6
#define DPPI_CH_TRIG_35US   7
#define DPPI_CH_TRIG_160US  8
#define DPPI_CH_TRIG_180US  9

/* 通道组定义 */
#define DPPI_GROUP_1US      NRF_DPPI_CHANNEL_GROUP0
#define DPPI_GROUP_20US     NRF_DPPI_CHANNEL_GROUP1
#define DPPI_GROUP_35US     NRF_DPPI_CHANNEL_GROUP2
#define DPPI_GROUP_160US    NRF_DPPI_CHANNEL_GROUP3
#define DPPI_GROUP_180US    NRF_DPPI_CHANNEL_GROUP4

void wait_time_dppi_init(void)
{
    nrfx_err_t err;
    gpiote_inst = get_gpiote_inst();
    //dppi_inst = get_dppi_inst();
    /* -------------------------------------------------------
     * 1. 初始化 TIMER,1MHz = 1tick/us
     * ------------------------------------------------------- */
    nrfx_timer_config_t config = NRFX_TIMER_DEFAULT_CONFIG(1000000);
    err = nrfx_timer_init(wait_timer_inst, &config, NULL);
    if (err != NRFX_SUCCESS) {
        return;
    }

    /* -------------------------------------------------------
     * 2. 配置 CC 通道(各自独立时间,非累加)
     *    每个 CC 触发后自动 STOP + CLEAR,Timer 复位
     * ------------------------------------------------------- */
    nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL0,
        nrfx_timer_us_to_ticks(wait_timer_inst, 2),
        NRF_TIMER_SHORT_COMPARE0_STOP_MASK |
        NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
        false);

    nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL1,
        nrfx_timer_us_to_ticks(wait_timer_inst, 20),
        NRF_TIMER_SHORT_COMPARE1_STOP_MASK |
        NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK,
        false);

    nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL2,
        nrfx_timer_us_to_ticks(wait_timer_inst, 35),
        NRF_TIMER_SHORT_COMPARE2_STOP_MASK |
        NRF_TIMER_SHORT_COMPARE2_CLEAR_MASK,
        false);

    nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL3,
        nrfx_timer_us_to_ticks(wait_timer_inst, 160),
        NRF_TIMER_SHORT_COMPARE3_STOP_MASK |
        NRF_TIMER_SHORT_COMPARE3_CLEAR_MASK,
        false);

    nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL4,
        nrfx_timer_us_to_ticks(wait_timer_inst, 180),
        NRF_TIMER_SHORT_COMPARE4_STOP_MASK |
        NRF_TIMER_SHORT_COMPARE4_CLEAR_MASK,
        false);

    /* -------------------------------------------------------
     * 3. TIMER COMPARE 事件发布到对应 DPPI 任务通道
     * ------------------------------------------------------- */
    nrf_timer_publish_set(NRF_TIMER22,
        NRF_TIMER_EVENT_COMPARE0, DPPI_CH_TASK_1US);
    nrf_timer_publish_set(NRF_TIMER22,
        NRF_TIMER_EVENT_COMPARE1, DPPI_CH_TASK_20US);
    nrf_timer_publish_set(NRF_TIMER22,
        NRF_TIMER_EVENT_COMPARE2, DPPI_CH_TASK_35US);
    nrf_timer_publish_set(NRF_TIMER22,
        NRF_TIMER_EVENT_COMPARE3, DPPI_CH_TASK_160US);
    nrf_timer_publish_set(NRF_TIMER22,
        NRF_TIMER_EVENT_COMPARE4, DPPI_CH_TASK_180US);

    /* -------------------------------------------------------
     * 4. 每个 DPPI 任务通道放入独立的通道组
     * ------------------------------------------------------- */
    nrf_dppi_channels_group_set(NRF_DPPIC20,
        BIT(DPPI_CH_TASK_1US),   DPPI_GROUP_1US);
    nrf_dppi_channels_group_set(NRF_DPPIC20,
        BIT(DPPI_CH_TASK_20US),  DPPI_GROUP_20US);
    nrf_dppi_channels_group_set(NRF_DPPIC20,
        BIT(DPPI_CH_TASK_35US),  DPPI_GROUP_35US);
    nrf_dppi_channels_group_set(NRF_DPPIC20,
        BIT(DPPI_CH_TASK_160US), DPPI_GROUP_160US);
    nrf_dppi_channels_group_set(NRF_DPPIC20,
        BIT(DPPI_CH_TASK_180US), DPPI_GROUP_180US);

    /* -------------------------------------------------------
     * 5. 初始状态:所有通道组禁用
     * ------------------------------------------------------- */
    nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_1US);
    nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_20US);
    nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_35US);
    nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_160US);
    nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_180US);

    /* -------------------------------------------------------
     * 6. 触发通道 → 自动启用对应通道组(EN 任务订阅)
     *    外部事件发布到 DPPI_CH_TRIG_XXX 时,
     *    对应通道组自动启用
     * ------------------------------------------------------- */
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_enable_task_get(DPPI_GROUP_1US),
        DPPI_CH_TRIG_1US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_enable_task_get(DPPI_GROUP_20US),
        DPPI_CH_TRIG_20US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_enable_task_get(DPPI_GROUP_35US),
        DPPI_CH_TRIG_35US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_enable_task_get(DPPI_GROUP_160US),
        DPPI_CH_TRIG_160US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_enable_task_get(DPPI_GROUP_180US),
        DPPI_CH_TRIG_180US);

    nrf_timer_subscribe_set(NRF_TIMER22,
                            NRF_TIMER_TASK_START,
                            DPPI_CH_TRIG_160US);
    /* -------------------------------------------------------
     * 7. CC 事件触发后 → 自动禁用对应通道组(DIS 任务订阅)
     *    Timer 计数到目标值后,对应通道组自动禁用
     * ------------------------------------------------------- */
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_disable_task_get(DPPI_GROUP_1US),
        DPPI_CH_TASK_1US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_disable_task_get(DPPI_GROUP_20US),
        DPPI_CH_TASK_20US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_disable_task_get(DPPI_GROUP_35US),
        DPPI_CH_TASK_35US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_disable_task_get(DPPI_GROUP_160US),
        DPPI_CH_TASK_160US);
    nrf_dppi_subscribe_set(NRF_DPPIC20,
        nrf_dppi_group_disable_task_get(DPPI_GROUP_180US),
        DPPI_CH_TASK_180US);

    /* -------------------------------------------------------
     * 8. 使能所有触发通道和任务通道
     * ------------------------------------------------------- */
    nrf_dppi_channels_enable(NRF_DPPIC20,
        BIT(DPPI_CH_TRIG_1US)   |
        BIT(DPPI_CH_TRIG_20US)  |
        BIT(DPPI_CH_TRIG_35US)  |
        BIT(DPPI_CH_TRIG_160US) |
        BIT(DPPI_CH_TRIG_180US) |
        BIT(DPPI_CH_TASK_1US)   |
        BIT(DPPI_CH_TASK_20US)  |
        BIT(DPPI_CH_TASK_35US)  |
        BIT(DPPI_CH_TASK_160US) |
        BIT(DPPI_CH_TASK_180US));
}

void gpio_init(void)
{
    /* 2. 分配 GPIOTE 通道 */
    int err = nrfx_gpiote_channel_alloc(gpiote_inst, &gpioe_channel_cs);
    if (err != NRFX_SUCCESS) {
        return;
    }

    /* 3. 配置 CS 引脚为 GPIOTE 输出任务模式 */
    static const nrfx_gpiote_output_config_t output_config = {
        .drive         = NRF_GPIO_PIN_S0S1,
        .input_connect = NRF_GPIO_PIN_INPUT_DISCONNECT,
        .pull          = NRF_GPIO_PIN_NOPULL,
    };

    /* CS 初始高电平(未选中),TOGGLE 模式 */
    const nrfx_gpiote_task_config_t task_config = {
        .task_ch  = gpioe_channel_cs,
        .polarity = NRF_GPIOTE_POLARITY_TOGGLE,
        .init_val = NRF_GPIOTE_INITIAL_VALUE_HIGH, /* CS 默认高 */
    };

    err = nrfx_gpiote_output_configure(gpiote_inst,
                                       CS_PIN,
                                       &output_config,
                                       &task_config);
    printf("gpiote output configure state: 0x%x\n", err);								   
    if (err != NRFX_SUCCESS) {
        return;
    }

    /* 4. 使能 GPIOTE 输出任务 */
    nrfx_gpiote_out_task_enable(gpiote_inst, CS_PIN);    

    /* GPIOTE SET 任务(CS拉低)订阅通道1 */
    nrf_gpiote_subscribe_set(gpiote_inst->p_reg,
                            nrf_gpiote_clr_task_get(gpioe_channel_cs),
                            DPPI_CH_TRIG_160US);

    nrf_gpiote_subscribe_set(gpiote_inst->p_reg,
                                nrf_gpiote_set_task_get(gpioe_channel_cs),
                                DPPI_CH_TASK_160US);
}

void publish_evt()
{
/* 1. 让 EGU 的 TRIGGERED 事件 publish 到 DPPI_CH_TRIG_160US */
nrf_egu_publish_set(NRF_EGU20, NRF_EGU_EVENT_TRIGGERED0, DPPI_CH_TRIG_160US);

/* 2. 使能该 DPPI 通道 */
//nrf_dppi_channels_enable(NRF_DPPIC20, BIT(DPPI_CH_TRIG_160US));

/* 3. 软件触发 EGU task,产生事件,发布到 DPPI_CH_TRIG_160US */
nrf_egu_task_trigger(NRF_EGU20, NRF_EGU_TASK_TRIGGER0);    

//nrfx_timer_enable(wait_timer_inst); // 或 nrf_timer_task_trigger(NRF_TIMER22, NRF_TIMER_TASK_START)
}

int main(void)
{

    wait_time_dppi_init();
    gpio_init();
    while(1)
    {
        publish_evt();
        k_sleep(K_MSEC(1000));
    }
}

Related