Pertimbangkan contoh minimal berikut, tempat saya mengatur pinMode
sebelum memanggil fungsi SPI:
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT);
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Sekarang ketika SPI.transfer(10,1)
dipanggil loop()
, saya selalu melihat bahwa pin slave yang dipilih turun ke 1.65V, tetapi tidak 0 seperti seharusnya! (lihat gambar di bawah)
Jika kami tidak menelepon pinMode()
, seperti ini:
#include <SPI.h>
void setup() {
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Kami mendapatkan apa yang kami harapkan saat menelepon SPI.transfer
:
Apakah itu bug atau Anda punya penjelasan untuk perilaku itu?
Terima kasih banyak sebelumnya atas waktu dan minat Anda!
arduino-due
spi
baru dan kalah
sumber
sumber
SPI.setDataMode(10, SPI_MODE1);
? Juga hanya yang kedua yang berguna, sepertibegin()
panggilan setDataMode. Melihat kode sumber sepertinya perpustakaan SPI tidak mengubah pin yang Anda tentukan (meskipun saya tidak tahu ARM).Jawaban:
Mungkin ada hubungannya dengan resistor pull up internal. Menurut lembar data SAM3X / A,
Jika Anda menggali semua file yang disertakan, Anda menemukan:
Baris 124 mendefinisikan
pinMode(uint32_t ulPin, uint32_t ulMode)
fungsi. Meneliti pernyataan switch / case untuk INPUT vs INPUT_PULLUP vs OUTPUT Anda melihat yang berikut:reg = PORT_PINCFG_INEN
.reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
reg &= ~PORT_PINCFG_INEN
.'Daftar' dalam setiap kasus adalah sama. Saya tidak bisa seumur hidup saya menemukan nilai PORT_PINCFG_INEN atau PORT_PINCFG_PULLEN apa yang didefinisikan sebagai, tetapi mereka tidak diragukan lagi hanya topeng 8-bit (mereka dilemparkan ke uint8_t ketika mereka ditugaskan ke 'register'). Dengan demikian, kita dapat mengasumsikan bahwa bit mana saja yang mengontrol input / output aktif ketika dinyatakan, seperti halnya bit pullup. Sebagai contoh:
Jika pull-up diaktifkan setelah reset, kita dapat mengatakan itu saat reset:
Poin (3) di atas sangat menyiratkan bahwa instruksi adalah:
Karena itu, jika Anda memanggil pinMode (X, OUTPUT) sebelum hal lain, Anda akan berakhir dengan resistor pullup diaktifkan. Mengatur pin ke input akan menghapus bit pullup enable, setelah itu Anda dapat mengatur pin ke output dan bit akan tetap jelas.
Namun, seluruh argumen jatuh dengan fakta sederhana bahwa jika Anda tidak memanggil pinMode () sama sekali , masalahnya tidak terjadi ...
sumber