c++ 将引脚用于spi后,无法使gpio输出工作(SAMD51)

64jmpszr  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(142)

我用C++编写SAMD51G19A。
我有一个别人写的项目,我想做一些改变。在速度的利益,而不是击倒比喻叠乐塔,我想改变尽可能少的东西已经在那里,我想避免太深入到设置代码(这是一个混乱的恐怖融合)。
我想在运行时重新配置一些引脚,将其从SPI转换为GPIO。
之前的代码使用SERCOM0(引脚:PA04,PA05,PA06,PA07)的SPI。这一切都工作正常(IidoEe.我已经确认这些引脚没有硬件或布线问题,我可以在示波器上看到所有信号)。
使用下面的代码(暂时放在设置之后,没有线程运行),我尝试重新配置这些引脚,使其现在用作GPIO,并设置为高电平(我之前也尝试过切换,这对两个工作引脚有效,但对另外两个无效)。
问题是,只有PA06和PA07在工作。PA04和PA05(以前分别用于MOSI和SCLK)不工作(在示波器上,PA04看起来像是保持在低电平0V,PA05看起来像是浮动的,大约0V,有点摇晃)。

SERCOM0->SPI.CTRLA.bit.SWRST = 1;
    SERCOM0->SPI.CTRLA.bit.ENABLE = 0;

    PORT->Group[0].PINCFG[4].reg = 0;
    PORT->Group[0].PINCFG[5].reg = 0;

    pinMode(6, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT);
    digitalWrite(6, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(5, HIGH);
    while(1){};

我的问题是两个方面的。是否可以在运行时重新配置这些引脚,而不知道安装代码中到底做了什么,或者是否可能有一些已经安装的东西根本不需要安装?
第二,为什么四个引脚中只有两个在工作?我认为这与时钟设置无关,因为时钟与端口有关?是否可能为需要禁用的引脚设置了中断?或者其他什么?我还遗漏了什么?
其他注意事项:代码库使用了修改后的RTOS、Atmel启动模板代码和arduino的混合。我正在用Microchip Studio构建。

sd2nnvve

sd2nnvve1#

我明白了。digitalWrite函数检查当前配置是什么。所以要么引脚配置需要更改,要么可以直接设置引脚,如下所示:

PORT->Group[0].OUTSET.reg = (1ul << 4);

我甚至不需要禁用spi,只需要设置引脚没有arduino调用,它的工作。

PORT->Group[0].PINCFG[4].bit.PMUXEN = 0; // disable peripheral multiplexer for PA04
PORT->Group[0].DIRSET.reg = (1ul << 4); // set PA04 as an output pin
PORT->Group[0].OUTSET.reg = (1ul << 4); // Set pin PA04 high

相关问题