我用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构建。
1条答案
按热度按时间sd2nnvve1#
我明白了。digitalWrite函数检查当前配置是什么。所以要么引脚配置需要更改,要么可以直接设置引脚,如下所示:
我甚至不需要禁用spi,只需要设置引脚没有arduino调用,它的工作。