SPI Arduino pinMode () ile çakışma nedeniyle, hata?


9

pinModeSPI işlevlerini çağırmadan önce ayarladığım aşağıdaki asgari örneği düşünün :

#include <SPI.h>

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

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

Şimdi SPI.transfer(10,1)çağrıldığında loop(), her zaman köle seçilen pimin 1.65V'a düştüğünü görüyorum, ancak olması gerektiği gibi 0 değil! (aşağıdaki resme bakın)

SPI işlevlerini çağırmadan önce ayarlanan pin modu

Aramazsak pinMode(), şöyle:

#include <SPI.h>

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

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

Aradığımızda bekleyebileceğimiz şeyi elde ediyoruz SPI.transfer:

pin Modu ayarlanmadı

Bu bir hata mı yoksa bu davranış için bir açıklamanız mı var?

İlginiz ve zamanınız için şimdiden çok teşekkür ederiz!


Olmamalı mı SPI.setDataMode(10, SPI_MODE1);? Ayrıca begin()setDataMode çağrıları olarak sadece ikincisi kullanışlıdır . Baktığımızda kaynak kodu (Ben ARM bilmiyorum ama) sizin belirleyeceğiniz pimini değiştirmez SPI kütüphanesi gibi görünüyor.
Gerben

Ja haklısın, yanlışlıkla setDataMode () 'i iki kez çağırıyorum. Yarın SPI.setDataMode (10, SPI_MODE1) etkisini test edeceğim; Ama neden pinMode () çağrıldığında bu etki hala net değil veya? @Gerben
newandlost

@Gerben Mesajımı değiştirdim
newandlost

Yanıtlar:


1

Dahili çekme direnci ile bir ilgisi olabilir. SAM3X / A veri sayfasına göre,

G / Ç hattının konfigürasyonuna bakılmaksızın, çekme direncinin kontrolü mümkündür.

Sıfırlamadan sonra, tüm pull-up'lar etkinleştirilir.

Bulduğunuz tüm içerme dosyalarını incelerseniz:

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

124. satır pinMode(uint32_t ulPin, uint32_t ulMode)işlevi tanımlar . INPUT vs INPUT_PULLUP vs OUTPUT için anahtar / vaka bildirimini incelediğinizde aşağıdakileri görürsünüz:

  1. INPUT, bir kayıt ayarlar reg = PORT_PINCFG_INEN.
  2. INPUT_PULLUP, reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
  3. OUTPUT, bir kayıt ayarlar reg &= ~PORT_PINCFG_INEN.

Her durumda 'kayıt' aynıdır. Hayatım boyunca PORT_PINCFG_INEN veya PORT_PINCFG_PULLEN'in hangi değer olarak tanımlandığını bulamıyorum, ancak şüphesiz sadece 8 bit maskeler ('kayıt' atandıklarında uint8_t'ye yönlendiriliyorlar). Bu nedenle, çekme biti gibi giriş / çıkış hangi bit kontrolleri aktif olduğunda varsayılabilir. Örneğin:

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

Sıfırlamadan sonra pull-up'lar etkinleştirilirse, sıfırlamada şunu söyleyebiliriz:

 reg = b'xxxxxx1x';

Yukarıdaki (3) noktası, talimatın:

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

Bu nedenle, başka bir şeyden önce pinMode (X, OUTPUT) öğesini çağırırsanız , çekme direnci etkin hale gelirsiniz. Pimin bir girişe ayarlanması, çekme etkinleştirme bitini temizler, bundan sonra pimi bir çıkışa ayarlayabilirsiniz ve bit temiz kalır.

Ancak, bütün tartışma yaşanan Eğer pinMode () aramazsam basit gerçeği ile düşer hiç sorun oluşmaz ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.