Nhiều thiết bị SPI


7

Tôi muốn kết nối board Ethernet (W5100 HR911105A)để Arduino Leonardovới SPI và tôi cũng muốn đọc SD kết nối. Khi tôi kiểm tra các bảng này riêng biệt mọi thứ làm việc. Nhưng khi tôi kết nối chúng trên cùng một bảng, chương trình không thành côngEthernet.begin();

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

#define SS_SD_CARD  4
#define SS_ETHERNET 10

const char CONFIG_FILE[] = "system.cfg";

byte C_MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress S_IP(192,168,0,19);
IPAddress C_IP(192, 168, 0, 177);
const uint16_t  S_PORT = 8090;

EthernetClient client;

void setup() {
  Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
    pinMode(SS_SD_CARD, OUTPUT);
    pinMode(SS_ETHERNET, OUTPUT);

    digitalWrite(SS_SD_CARD, HIGH);
    digitalWrite(SS_ETHERNET, HIGH);

    digitalWrite(SS_SD_CARD, LOW);
    SD.begin(SS_SD_CARD);
    digitalWrite(SS_SD_CARD, HIGH);

    Serial.println("Setup ethernet");
    digitalWrite(SS_ETHERNET, LOW);
    if (Ethernet.begin(C_MAC) == 0) {
      Serial.println("Failed to configure Ethernet using DHCP");
      Ethernet.begin(C_MAC, C_IP);
    }
    delay(100);
    Serial.println("connectin...");
    bool result = client.connect(S_IP, S_PORT);
    Serial.println("connected");
    digitalWrite(SS_ETHERNET, HIGH);
}

void loop() {
  Serial.println("loop...");
  delay(1000);
}

Tôi đã thử trên Leonardo và Mega 2560.


Vì vậy, bạn đang nói rằng nếu bạn chỉ có W5100 được kết nối với Leonardo thì nó hoạt động tốt nhưng một khi bạn kết nối đầu đọc SD thì nó không hoạt động? Ngoài ra, đó là SPI, không phải ISP. ISP là viết tắt của Lập trình viên trong hệ thống, một cái gì đó hoàn toàn khác.
per1234

Vâng, đây là những gì tôi đang nói. Khi tôi kết nối cả hai thiết bị với SPI, chỉ có đầu đọc thẻ hoạt động và đọc dữ liệu từ thẻ và ethernet bị lỗi tại điểm được đề cập. Nhưng nếu tôi chỉ kết nối ethernet thì nó đang hoạt động.
eszik.k

Khi bạn kiểm tra riêng lẻ như bạn mô tả, số pin SS có giống nhau không (4 và 10)?
Nick Gammon

Bạn đang sử dụng đầu đọc SD nào? Bạn có thể mô tả hệ thống dây chính xác?
Nick Gammon

Câu trả lời:


3

Một số reaaders thẻ (cũng như bảng hiển thị có ổ cắm sd tích hợp) sử dụng điện trở 10-kOhm nối tiếp với các đường CS, DIN và CLK, để thực hiện dịch thuật giá rẻ 5V đến 3,3V. Đây thực sự không phải là giải pháp tốt nhất, đặc biệt là về tốc độ (chúng tôi đã xác minh rằng điều này thường giới hạn tốc độ SPI tối đa trong khoảng 1 MHz).

Các đầu đọc thẻ khác (chẳng hạn như cái này http://modtronix.com/mod-sdcard-l5.html ), chỉ cần sử dụng điện trở 10 k-Ohm khi kéo lên đến 3,3V. Do đó, bạn đang kết nối tất cả các dòng thẻ SD với bảng Leonardo, ở mức 5V. Điều này sẽ gây ra vấn đề nghiêm trọng cho thẻ SD hoặc bảng leonardo. Nếu đầu đọc thẻ của bạn rơi vào trường hợp thứ hai này, tôi khuyên bạn nên chèn một bộ chia điện trở (1k + 1,5k) nối tiếp vào từng dòng đầu vào của thẻ SD: DIN, CLK, CS. Trong các sơ đồ sau tôi chỉ hiển thị cho dòng CLK, tất nhiên bạn phải lặp lại điều này ba lần. Một ý tưởng tốt hơn nhiều sẽ là một IC dịch cấp.

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab


2

Nếu bạn có một đầu đọc thẻ SD tương tự như bên dưới (hoặc tương tự nhưng với thẻ micro SD), thì tôi đã gặp vấn đề tương tự.

Nó hoạt động như một thiết bị duy nhất trên SPI, nhưng không hoạt động cùng với một thiết bị SPI khác.

Bạn có thể sử dụng bảng proto ghi SD hoặc sử dụng vi điều khiển có nhiều SPI.

Đột phá SD

Một ví dụ về máy ghi SD tôi đã sử dụng và làm việc với một thiết bị SPI khác trên một cổng SPI.

Nhược điểm: lớn hơn, đắt hơn Pro: có không gian RTC và proto.

Đầu ghi SD


Vâng, tôi có đầu đọc thẻ tương tự như bạn đã chỉ ra. Tôi hy vọng có một giải pháp cho vấn đề này. ebay.com/itm/ từ
eszik.k

Tôi đã sử dụng cho đến gần đây lá chắn máy ghi SD, nhưng tôi đang chuyển sang STM32 có nhiều cổng SPI, vì vậy tôi có thể không thể (không thử) một đầu đọc thẻ SD đơn giản khi bạn có một cổng và các thiết bị ngoại vi khác (như RF radio) đến SPI khác.
Michel Keijzers

2
@MichelKeijzers - Tôi chưa bao giờ sử dụng thiết bị SPI (luôn là con I2C) nhưng tôi nghĩ ý tưởng là bạn đã sử dụng đầu mối CS để kiểm soát những gì nhận được tin nhắn. Từ những gì bạn đã nói tôi cho rằng có nhiều điều hơn thế.
Mã Gorilla

4
@CodeGorilla bạn đúng, CS (Chọn chip hoặc SS: Chọn nô lệ) quyết định ai sẽ nhận được tin nhắn. Thông thường một trong các chân CS thấp và các chân khác cao. Thiết bị SPI với pin thấp CS có thể giao tiếp với chủ. Tất cả các MISO và MOSI phải được ghép nối và một số thiết bị (như đầu đọc thẻ SD giá rẻ) không hỗ trợ nó ... Tôi không biết lý do.
Michel Keijzers

0

Tôi nghi ngờ nguyên nhân là do cách thiết kế đầu vào / đầu ra, W5100 dường như là một bo mạch 3v3 với đầu vào tương thích 5V, cũng như liên kết bạn đã đăng lên đầu đọc SD, tuy nhiên tùy thuộc vào cách các đầu vào / đầu ra này được thiết kế có nghĩa là họ sẽ không "chơi đẹp" với các bảng khác trên cùng một xe buýt mặc dù SPI được thiết kế để làm điều đó.

tùy thuộc vào vấn đề nằm ở đâu, có một vài giải pháp tiềm năng, nếu (như tôi nghi ngờ) vấn đề là đầu ra từ các thiết bị trở lại arduino (tức là bạn có thể ghi vào chúng nhưng không thể đọc từ chúng) mà bạn có thể xác nhận bằng cách kết nối tất cả các dòng song song, nhưng chỉ kết nối một trong các dòng nối tiếp trở lại arduino và kiểm tra xem nó có hoạt động không, sau đó trao đổi nối tiếp với thiết bị khác và kiểm tra xem. giả sử rằng cả hai thiết bị đều hoạt động trong cấu hình này, bạn chỉ cần sửa tín hiệu trả về. cách đơn giản nhất để làm điều này là sử dụng hai bộ đệm ba trạng thái.

vì vậy tín hiệu trả về chỉ được kết nối với arduino khi thiết bị đó chọn dòng đang hoạt động. và trở kháng cao (ngắt kết nối) nếu không, lập trình ngắt kết nối một thiết bị khỏi xe buýt.

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.