SPI Arduino Do xung đột với pinMode (), lỗi?


9

Hãy xem xét ví dụ tối thiểu sau đây, nơi tôi đặt pinModetrước khi gọi các hàm 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);
}

Bây giờ khi SPI.transfer(10,1)được gọi vào loop(), tôi luôn thấy rằng pin được chọn nô lệ giảm xuống còn 1.65V, nhưng không phải là 0 như bình thường! (xem hình dưới đây)

chế độ pin được đặt trước khi gọi các chức năng SPI

Nếu chúng ta không gọi pinMode(), như thế này:

#include <SPI.h>

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

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

Chúng tôi nhận được những gì chúng tôi mong đợi khi gọi SPI.transfer:

Chế độ pin không được đặt

Đó có phải là một lỗi hay bạn có một lời giải thích cho hành vi đó?

Cảm ơn bạn rất nhiều trước thời gian và sự quan tâm của bạn!


Có nên không SPI.setDataMode(10, SPI_MODE1);? Ngoài ra chỉ có cái thứ hai là hữu ích, như begin()các cuộc gọi setDataMode. Nhìn vào mã nguồn, có vẻ như thư viện SPI không thay đổi mã pin bạn đã chỉ định (mặc dù tôi không biết ARM).
Gerben

Ja bạn nói đúng, tình cờ tôi đang gọi setDataMode () hai lần. Ngày mai tôi sẽ kiểm tra tác dụng của SPI.setDataMode (10, SPI_MODE1); Nhưng tại sao gọi pinMode () có hiệu ứng này vẫn không rõ ràng hay? @Gerben
newandlost

@Gerben Tôi đã sửa đổi bài đăng của mình
newandlost

Câu trả lời:


1

Nó có thể có một cái gì đó để làm với điện trở kéo lên bên trong. Theo bảng dữ liệu SAM3X / A,

Có thể điều khiển điện trở kéo lên bất kể cấu hình của dòng I / O.

Sau khi thiết lập lại, tất cả các pull-up được kích hoạt.

Nếu bạn đào qua tất cả các tệp bao gồm bạn tìm thấy:

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

Dòng 124 định nghĩa pinMode(uint32_t ulPin, uint32_t ulMode)hàm. Kiểm tra câu lệnh chuyển đổi / trường hợp cho INPUT so với INPUT_PULLUP so với OUTPUT bạn thấy như sau:

  1. INPUT thiết lập một thanh ghi reg = PORT_PINCFG_INEN.
  2. INPUT_PULLUP đặt đăng ký thành reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
  3. OUTPUT thiết lập một thanh ghi reg &= ~PORT_PINCFG_INEN.

'Đăng ký' trong mỗi trường hợp là như nhau. Cả đời tôi không thể tìm thấy giá trị nào PORT_PINCFG_INEN hoặc PORT_PINCFG_PULLEN được định nghĩa là, nhưng họ không nghi ngờ gì chỉ là mặt nạ 8 bit (chúng được gán cho uint8_t khi chúng được gán cho 'đăng ký'). Vì vậy, chúng ta có thể giả sử rằng bất kỳ bit nào điều khiển đầu vào / đầu ra đều hoạt động khi được xác nhận, cũng như bit pullup. Ví dụ:

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

Nếu pull-up được kích hoạt sau khi thiết lập lại, chúng ta có thể nói rằng khi thiết lập lại:

 reg = b'xxxxxx1x';

Điểm (3) ở trên ngụ ý mạnh mẽ rằng hướng dẫn là:

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

Do đó, nếu bạn gọi pinMode (X, OUTPUT) trước bất cứ điều gì khác, bạn sẽ kết thúc với điện trở pullup được kích hoạt. Đặt ghim thành đầu vào sẽ xóa bit kích hoạt pullup, sau đó bạn có thể đặt ghim thành đầu ra và bit sẽ vẫn rõ ràng.

Tuy nhiên, toàn bộ đối số rơi xuống với một thực tế đơn giản rằng nếu bạn không gọi pinMode () ở tất cả , vấn đề không xảy ra ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.