Selbstbau Shield mit WS5100 auf Arduino2560 - SS Pin

Hallo,
Es handelt sich um ein älteres Projekt das schon länger mit Ethernet Shield und Steckbrett läuft.

Habe nun ein Shield mit einem WS5100 Modul gebaut.
SPI von Pin 53..50 laut Pinmapping gelegt.

Das funktioniert aber nicht in Verbindung mit der Ethernet Lib.
Dort sollte der Chipselect SCS des WS5100 am Pin10 liegen, habe da also nicht aufgepasst.

Bleiben zwei Möglichkeiten, entweder die Leiterbahn zum Atmel SS Pin kappen, und zum Pin 10 legen.

Oder die Ethernet Lib anpassen. (SD Karte brauche ich nicht)
Ich habe mich nun etwas durch die Lib gewühlt, ist es generell möglich dies anzupassen ?

PS:
Generell könnte ich den SS des WS5100 einfach auf 0 (Masse) legen, oder ?

Bei SPI Shields ist es immer eine gute Idee, den SS per Schalter/Jumper/Lötbrücke auf einen freien Pin legen zu können. Der zugehörigen Bibliothek (Objekt) übergibt man dann die Nummer des zu benutzenden Pins im Konstruktor oder begin(). Bei der LCD Bibliothek übergibt man so praktisch alle benutzen Pinnummern, nix fest im Code verdrahtet.

Bei der Standard Ethernet Lib ist das leider hardkodiert. Nix Konstruktor oder begin(). Ist sehr unschön gemacht.

Man kann es aber ändern. In x:\Arduino\libraries\Ethernet\src\utility\w5100.h

Da steht direkt oben: #define SPI_CS 10

hi,

Generell könnte ich den SS des WS5100 einfach auf 0 (Masse) legen, oder ?

ich denke schon. versuch macht kluch...

ist das eine speichererweiterung?

gruß stefan

Eisebaer:
ist das eine speichererweiterung?

Ja eine Speichererweiterung weil mir damals das S-Ram ausging.

Wie gesagt ein altes Projekt eine Art Wetterstation mit Webinterface (und ein paar Spielereien dabei)
Website ist komplett auf dem Arduino deshalb wurde das Ram knapp.

Will das erstmal Hardmässig sauber haben, zwei Shields aufeinander oben drauf ein Steckbrett das läuft über die Jahre nicht stabil.
Zunehmende kontaktprobleme und schaut Scheiße aus.

Einen CS/SS Pin braucht auch die Arduino Hardware SPI, um daran zu erkennen, dass er Master ist. Oder eben als Slave zu horchen, ob er senden darf. Das ist nun mal 10 beim Uno, 53 beim Mega.

Sinnvollerweise nutzt man diesen Pin für eines der SPI Devices.

Natürlich ist eine Library gut beraten, dafür zu sorgen, dass das erste Example auf Anhieb richtig läuft, und schreibt also

#define SPI_CS 10

als Voreinstellung in die include - Datei.

https://www.arduino.cc/en/Reference/SPI:
Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

It is, however, possible to use any pin as the Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card, and pin 10 to control the connection to the Ethernet controller.

Das hätte man in der Ethernet Lib auch leicht anders lösen können. Über eine Methode mit einem Default Paramater

Da wird nämlich sowieso das gemacht:

void W5100Class::init(void)
{
  SPI.begin(SPI_CS);
}

int EthernetClass::begin(uint8_t *mac_address)
{
  W5100.init();
}

Also hätte man es auch so machen können, dass man bei begin() optional einen CS Pin übergibt und der wird an die init() Methode durchgereicht.

michael_x:
Einen CS/SS Pin braucht auch die Arduino Hardware SPI, um daran zu erkennen, dass er Master ist. Oder eben als Slave zu horchen, ob er senden darf. Das ist nun mal 10 beim Uno, 53 beim Mega.

Sinnvollerweise nutzt man diesen Pin für eines der SPI Devices.

Bitte zwischen Controller und Shield unterscheiden! Der Controller hat einen fest zugeordneten SS Pin, der im Slave Modus den Datentransfer regelt (Slave Select). Als Master, zur Ansteuerung von Shields, hat SS keine besondere Funktion (general I/O), und es kann jeder beliebige digitale Ausgang mit dem SS Anschluß eines Shields oder SPI Moduls verbunden werden. Der Master/Slave Modus wird im Code vorgegeben, nicht durch ein Signal am SS Pin des Controllers. Verwendet man den SS Pin des Controllers zur Ansteuerung von SPI Slave Modulen, dann verbaut man sich damit die Möglichkeit, den Controller selbst als Slave zu betreiben - der würde dann ja gleichzeitig mit dem ebenfalls dranhängenden Modul selektiert.

Auch wenn ein Shield die Pins des Controllers durchschleift, dann sitzt doch auf jedem Shield eine eigene Elektronik, die Signale über beliebige Controller-Pins austauschen kann. Diese Zuordnung nimmt der Entwickler des Shields nach eigenem Gutdünken vor, und kann sie auch (per Jumper...) dem Benutzer überlassen. Wenn mehrere gleichartige SPI Shields gleichzeitig betrieben werden sollen, dann ist eine feste Zuordnung der SS Signale garnicht möglich. Manche Shields unterbrechen sogar die Verbindungen zu den Pins, die sie selbst verwenden, so daß diese Pins von weiteren Shields garnicht mehr versehentlich verwendet werden können.

Der Master/Slave Modus wird im Code vorgegeben, nicht durch ein Signal am SS Pin des Controllers.

für den ATMega2560 gilt:
Pin 53 Output: Master Mode
Pin 53 Input: Slave Mode

Es ist egal, welchen Pin man für den SS des W5100 nutzt...
Aber Pin 53 MUSS zum Output gemacht werden.

combie:
für den ATMega2560 gilt:
Pin 53 Output: Master Mode
Pin 53 Input: Slave Mode

Es ist egal, welchen Pin man für den SS des W5100 nutzt...
Aber Pin 53 MUSS zum Output gemacht werden.

Wo hast Du denn diesen Schmarrn her? :frowning:

Im Handbuch steht nur, daß im Master Modus MOSI und SCK zu Ausgängen gemacht werden müssen, alle anderen können Eingänge bleiben. Im Slave Modus wird nur MISO zum Ausgang gemacht, falls überhaupt benötigt. Schau Dir mal die Codebeispiele im Handbuch an.

Erstens, kann ich bestätigen, dass die Ethernet Lib nicht auf dem Mega funktioniert, wenn 53 ein Input ist.

Zweitens ist die Arduino Doku da recht eindeutig:

Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

Aus: SPI - Arduino Reference

Arduino communicates with the shield using the SPI bus. This is on digital pins 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used as SS. On the Mega, the hardware SS pin, 53, is not used to select the W5100, but it must be kept as an output or the SPI interface won't work

.
Aus: https://www.arduino.cc/en/pmwiki.php?n=Reference/Ethernet


Nachtrag:
Der 53 darf ein Input sein, muss aber auf High gezogen werden.
Ist 53 Input, und Low, dann geht SPI in den Slave Mode
Ist 53 Output, dann ist egal ob Low, oder High. SPI ist und bleibt Master.
Quelle: http://www.atmel.com/images/doc2585.pdf

Es macht also überhaupt keinen Sinn, 53 als Input zu deklarieren, da er sowieso nicht als Input genutzt werden kann, da ein Low das SPI (und damit das Ethernet) zum erliegen bringt.
Default ist Input, ohne Pullup.

Es kann in der Defaulteinstellung funktionieren, das wäre dann aber eher dem Zufall/Toleranzen zu verdanken.
53 Output, stellt einen stabilen Betrieb her.

Entweder haben die Erbauer der Bibliothek etwas nicht richtig verstanden, oder sie beschreiben einen Versuch, den versehentlichen Betrieb zweier Master am selben Bus zu überstehen. Bei zwei Mastern arbeiten die SCLK und MOSI Ausgänge gegeneinander, mit unvorhersehbaren Ergebnissen. Da mag es durchaus sinnvoll sein, den bisherigen Master hardwaremäßig in einen Slave umzukonfigurieren, um Schäden zu vermeiden und eine Übertragung des neuen Masters nicht zu stören. Aber offensichtlich kann das überhaupt nur funktionieren, wenn der neue Master den alten selektiert, sonst bekommt der von der Konkurrenz auf dem Bus überhaupt nichts mit. Dann ist es aber nicht sinnvoll, diese Änderung durch einen SS als Output zu unterbinden.

Entspricht die Beschreibung überhaupt noch der aktuellen Bibliothek?

Deinem Nachtrag kann ich mich nun anschließen. Wenn die verwendete Bibliothek nur den Master-Modus unterstützt, kann SS nur als Output oder garnicht benutzt werden.

Entspricht die Beschreibung überhaupt noch der aktuellen Bibliothek?

Bei der Bibliothek die ich verwende steht das auch so drin.
Und es ist hier auch so, wenn ich den SS !=Output schalte funktioniert das Modul nicht mehr.
Muss also Output sein.

Ich denke es ist nur der Master Mode in der Ethernet Lib vorgesehen.

PS: Warum so ein rauer Ton hier ?