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:
- INPUT thiết lập một thanh ghi
reg = PORT_PINCFG_INEN
.
- INPUT_PULLUP đặt đăng ký thành
reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
- 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 ...
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).