emoestudio / eEEExplore-2023

电子工程相关技术交流讨论repo-2023年限定
GNU General Public License v3.0
19 stars 1 forks source link

[MCU] RP2040芯片Side-Set无法工作,十分恼火,甚至九分恼火 #16

Closed BellssGit closed 1 year ago

BellssGit commented 1 year ago

目标

在PIO上实现一个只发送的SPI接口,发送信号给ADC和CCD驱动芯片

问题

本来应该还有另一个问题的(OUT指令可以正常清空寄存器,但是引脚没输出),不过为了排错还是一个个来

正如标题所介绍的一样,我写了个测试Side-Set功能的最小测试程序,代码如下:

main.c

int main()
{
    stdio_init_all();
    sleep_ms(2500); // wait USB connect

    PIO pio = pio0;
    uint offset;
    if (pio_can_add_program(pio,&test_program))
    {
        offset = pio_add_program(pio, &test_program);
        printf("PROGRAM LOADED, offset %hx\n", offset);
    }
    uint sm = pio_claim_unused_sm(pio, true);
    if(pio_sm_is_claimed(pio,sm) == 1)
    {
        printf("SM CLAIMED, NUMBER: %d\n", sm);
    }
    test_init(pio, offset, sm,8 /*SCK PIN NUM*/);
    while (1);
}

PIO部分

.program test
.side_set 1
.wrap_target
    nop     side 1
    nop     side 0
.wrap

% c-sdk {
static inline void test_init(PIO pio, uint sm, uint offset,uint clk_pin)
{
    pio_sm_config c = test_program_get_default_config(offset);

    pio_gpio_init(pio, clk_pin);
    sm_config_set_out_pins(&c, clk_pin, 1);
    sm_config_set_sideset_pins(&c, clk_pin);

    pio_sm_init(pio, sm, offset, &c);
    pio_sm_set_enabled(pio, sm, true);
}
%}

运行时可以输出

PROGRAM LOADED, offset 1e
SM CLAIMED, NUMBER: 0

但是用示波器捅对应引脚没有任何输出,换成其他的GPIO引脚也是一样的结果。

我的手头没有调试器,所以也不知道芯片内部到底发生了啥事情。还请各位帮忙代码捉一下虫

BellssGit commented 1 year ago

解决了,看起来是我的源代码初始化顺序有问题,不过官方为啥没问题就很奇怪了

只需要修改PIO部分的代码,从这里抄的

% c-sdk {
static inline void test_program_init(PIO pio, uint sm, uint offset) {
    pio_sm_config c = test_program_get_default_config(offset);

    sm_config_set_sideset_pins(&c, test_CLK_PIN);
    sm_config_set_out_pins(&c, test_CLK_PIN, 1);
    pio_gpio_init(pio, test_CLK_PIN);
    pio_sm_set_consecutive_pindirs(pio, sm, test_CLK_PIN, 1, true);

    pio_sm_init(pio, sm, offset, &c);
    pio_sm_set_enabled(pio, sm, true);
}
%}