SPI Arduino pinMode ()와의 충돌로 인한 버그입니까?


9

pinModeSPI 함수를 호출하기 전에 설정 한 다음 최소 예제를 고려하십시오 .

#include <SPI.h>

void setup() {
  pinMode(10, OUTPUT);
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

이제 SPI.transfer(10,1)에서 호출 되면 loop()항상 슬레이브 선택 핀이 1.65V로 내려가지만 0이 아니라는 것을 알 수 있습니다! (아래 이미지 참조)

SPI 기능을 호출하기 전에 핀 모드 설정

다음 pinMode()과 같이 전화하지 않으면 :

#include <SPI.h>

void setup() {
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

우리는 전화를 걸 때 기대하는 것을 얻습니다 SPI.transfer.

핀 모드가 설정되지 않았습니다

그게 버그입니까, 아니면 그 행동에 대한 설명이 있습니까?

시간과 관심에 감사드립니다!


그렇지 SPI.setDataMode(10, SPI_MODE1);않습니까? 또한 begin()setDataMode 를 호출 할 때 두 번째 것만 유용합니다 . 상기 찾고 소스 코드 (I는 ARM 몰라하지만) 당신이 지정된 핀을 변경하지 않는 SPI 라이브러리처럼 보인다.
Gerben

Ja 맞아, 우연히 setDataMode ()를 두 번 호출하고 있습니다. 내일 나는 SPI.setDataMode (10, SPI_MODE1)의 효과를 테스트 할 것이다; 그러나 pinMode () 호출이 왜 이런 효과가 여전히 명확하지 않습니까? @Gerben
newandlost

@Gerben 나는 게시물을 수정했다
newandlost

답변:


1

내부 풀업 저항과 관련이있을 수 있습니다. SAM3X / A 데이터 시트에 따르면

풀업 저항의 제어는 I / O 라인의 구성에 관계없이 가능합니다.

재설정 후 모든 풀업이 활성화됩니다.

찾은 모든 포함 파일을 파헤치는 경우 :

../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c

124 행은 pinMode(uint32_t ulPin, uint32_t ulMode)기능을 정의합니다 . INPUT vs INPUT_PULLUP vs OUTPUT에 대한 switch / case 문을 검토하면 다음과 같습니다.

  1. INPUT은 레지스터를로 설정합니다 reg = PORT_PINCFG_INEN.
  2. INPUT_PULLUP은 레지스터를 reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
  3. OUTPUT은 레지스터를로 설정합니다 reg &= ~PORT_PINCFG_INEN.

각각의 경우 '등록'은 동일합니다. 나는 내 인생에서 PORT_PINCFG_INEN 또는 PORT_PINCFG_PULLEN이 어떤 값으로 정의되어 있는지 찾을 수 없지만 의심 할 여지없이 8 비트 마스크 ( 'register'에 할당 될 때 uint8_t로 캐스팅됩니다). 따라서 풀업 비트와 마찬가지로 어설 션 될 때 입력 / 출력을 제어하는 ​​비트 컨트롤이 있다고 가정 할 수 있습니다. 예를 들면 다음과 같습니다.

 PORT_PINCFG_INEN   = b'00000001';
 PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN   = b'11111110';

재설정 후 풀업이 활성화 된 경우 재설정시 다음과 같이 말할 수 있습니다.

 reg = b'xxxxxx1x';

위의 포인트 (3)은 명령이 다음과 같은 것을 의미합니다.

 reg = b'xxxxxx1x' & 'b11111110';
   so
 reg = b'xxxxxx10'; // pull-up is enabled!

따라서 다른 것보다 먼저 pinMode (X, OUTPUT)를 호출 하면 풀업 저항이 활성화됩니다. 핀을 입력으로 설정하면 풀업 활성화 비트가 지워지고, 그 후에 핀을 출력으로 설정할 수 있으며 비트는 계속 유지됩니다.

그러나 pinMode () 를 전혀 호출 하지 않으면 문제가 발생하지 않는다는 단순한 사실로 전체 논쟁이 무너집니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.