Weiß jemand, wie man einen Raspberry Pi 3 als I2C-Slave (in C ++) einrichtet?
Bevor jemand antwortet, dass es nicht möglich ist, ist es möglich.
Hier ist ein Link, der besagt, dass es möglich ist (Pigpio-Dokumentation)
Dies ist der Code, den ich verwenden möchte (über den obigen Link):
#include <pigpio.h>
#include <iostream>
using namespace std;
int main(){
bsc_xfer_t xfer;
gpioInitialise();
xfer.control = (0x0A<<16) | 0x305; // Set I2C slave Address to 0x0A
int status = bscXfer(&xfer);
if (status >= 0)
{
xfer.rxCnt = 0;
while(1){
if (xfer.rxCnt > 0){
cout << xfer.rxBuf;
}
}
}
return 1;
}
Meine Verbindungen sind SCL zu BCM GPIO 18 und SDA zu BCM GPIO 19. (Dies sollte umgekehrt sein: SDA ist GPIO 18, SCL ist GPIO 19)
Die restlichen Geräte am Bus sind in Ordnung (bereits getestet).
Ich habe auch den SDA1 und den SCL1 der Himbeere an diesen I2C-Bus angeschlossen, damit ich i2cdetect -y 1
I2C-Geräte im Bus auflisten kann .
Das Problem mit diesem Code ist, dass i2cdetect -y 1
ich trotz korrekter Adressierung des Raspberry Pi die Adresse 0x0A sehen kann und keine Nachricht empfangen kann.
Wenn ich in einem anderen Prozess einen Sniffer ausführe, kann ich die Nachricht korrekt abrufen.
memset( xfer.rxBuf, '\0', sizeof(char)*BSC_FIFO_SIZE );
werde es tunDa dieses Thema sehr schlecht behandelt wird und Sebastiãos Ausschnitt mir geholfen hat, dieses Problem zu lösen, möchte ich hier eine vollständige Lösung zum Einrichten eines RaspberryPi hinzufügen (getestet auf einem RPi 3 und Zero W)!
Einen funktionierenden Slave einrichten:
Vorbereitungen
Stellen Sie sicher, dass Sie diese Zeile in Ihrer Datei /boot/config.txt auskommentiert haben :
Abhängigkeiten
Als nächstes installieren Sie g ++ und pigpio mit diesem Befehl:
Stifte
Wie in der Dokumentation angegeben, sind die Pins GPIO 18 (SDA) und 19 (SCL) . Diese Seite hilft Ihnen beim Auffinden auf Ihrem RaspberryPi (das Layout sollte für RaspberryPi 2, 3, Zero und Zero W identisch sein).
Dieses Schema von der Website hilft:
Software
Erläuterung
Wie bereits erwähnt, basiert diese Lösung auf dem Code-Snippet von Sebastião . Ich habe es mit Hilfe von Joans Lösung modifiziert .
Ich habe auch versucht, den Code anhand der Dokumentation für die Funktion zu verstehen
bscXfer
.Im Quellcode werden die Daten in der
bsc_xfer_t
Struktur zum Hinzufügen oder Empfangen von Nachrichten verwendet. Diese werden jedoch nur angewendet, wennbscXfer
sie mit der Adresse der Struktur ausgeführt werden (wie Joan in seiner Lösung ausgeführt hat).Die Ganzzahl bsc_xfer_t.control hat eine ganz besondere Rolle, die mehrere Dinge wie die Slave-I²C-Adresse und verschiedene andere Zustände angibt, die in der Dokumentation gut dokumentiert sind .
Um dies besser zu verstehen, habe ich die wichtigen Teile der Dokumentation in den Quellcode kopiert und einige Dinge geändert oder in separate Funktionen ausgelagert.
Quellcode
Die Adresse kann beliebig geändert werden (sofern sie nicht über 127 liegt (auch bekannt als 7F (16) oder 1111111 (2) ).
Da ich nicht gut in C ++ bin, müssen Sie auskommentieren, was Sie wollen, was Sie nicht tun wollen. Es wird empfohlen, die
closeSlave
Funktion nach Abschluss des Tests auszuführen .Hier die Datei slaTest.cpp :
Beachten Sie, dass in einigen Fällen das erste Byte das Befehlsbyte und nicht Teil Ihrer allgemeinen Daten sein soll.
BEARBEITEN: Beachten Sie auch, dass dies zwar zu Testzwecken gut funktioniert, @crasic jedoch (erster Kommentar) darauf hinwies, dass es eine bessere (aber auch schlecht dokumentierte) Möglichkeit gibt, dies mit Ereignissen zu tun, anstatt eine Endlosschleife zu verwenden. Das sollte besser sein, wenn es mit mehreren Anwendungen verwendet wird.
Kompilieren und ausführen
Sie können dies mit kompilieren
und ausführen mit
Test mit einem Meister
Um es kurz als Master zu testen, ist die Verwendung von smbus eine beliebte Option, die viel einfacher ist und durch einfaches Suchen mit einer Suchmaschine Ihrer Wahl gefunden werden kann.
Meine gewählte Option in Kürze:
sudo apt install python3 python3-smbus
python3 -i masterI2C.py
sendData(0x03, 'Hello World of I2C!')
, um Daten zu sendenMaster-Python-Snippet:
Bild des Testens:
Ich hoffe, dass ich dieses Thema für andere Menschen klären konnte.
(Bei plötzlichen Problemen half mir normalerweise ein Neustart meines Sklaven-Himbeer-Pi.)
quelle