Hallo,
ich verzweifel gerade daran den PIC18F13K22 als I2C Slave aufzusetzen.
Ich finde den Fehler einfach nicht.
Der Master (auch ein PIC, aber nicht von mir programmiert) sendet nach
Spannung ein 2x zyklisch mehrere Adressen (Startupphase). Alle Slaves
die ihm in der Zeit antworten werden danach in der Betriebsphase auch
weiterhin zyklisch abgefragt.
--> Spektrum TM1000 Telemetriemodul (RC Fernsteuerung)
Mein Slave sieht zwar seine Adresse (PIR1bits.SSPIF gesetzt) aber
irgendwie scheint er keine gültigen Daten zu senden (er wird nicht in
die Liste der Slaves mit aufgenommen).
Testweise habe ich bei einem Adressmatch mal den SSPBUF gelesen. Dort
sollte doch eigentlich die Adresse des Slaves stehen. Aber der Vergleich
schlägt fehl.
Hat jemand einen Tipp?
(nicht wundern über den I2C code in der Hauptroutine. Durch das ganze
Testen habe ich viel hin und her kopiert. Soll eigentlich in die
Interruptroutine (von der hier nur die while Schleife)
Hier der Code:
1
voidinitI2C(void)
2
{
3
//set I2C
4
5
i2c_send_index=0;
6
SSPADD=SLAVE_POWERBOX;// set slave address
7
//SSPMSK = 0xFF; // Only respond to my address ( All bits must match)
Christian schrieb:> Der Master (auch ein PIC, aber nicht von mir programmiert)
Womit du zwei Baustellen hast. Kannst du den einen Master selbst
aufbauen (zum üben)?
Dann verstehe ich den Konzept nicht. Ein I2C Slave kann keine Daten
senden. Der Master holt sich die ab.
Noch als Tipp: Reduziere den Code auf die nötigen I2C Funktionen. Mit
einer simplen main wo nur senden und led on/off drin steht.
So als solltest du jemendem I2C in der Sprache C erklären.
Mir ist z.B nicht klar was SLAVE_POWERBOX ist oder ich habe die die
Definition übersehen.
Hi,
Der Master PIC ist keine Baustelle, da es sich um ein Produkt handelt
(nennt sich Spektrum TM1000).
es handelt sich dabei um ein Telemetriemodul welches u.a. die über I2C
empfangenen Daten an eine RC-Fernsteuerung sendet.
Der Master fragt beim einschalten einfach alle möglichen I2C Slave
Adressen ab.
Die Slaves müssen dann Antworten (den als writeData definierten
Zeichensatz übertragen. In den Bytes die mom. mit 0x00 gesetzt sind
stehen später die Nutzdaten).
SLAVE_POWERBOX steht im header (habe ich nicht hier reinkopiert). Der
ist mit 0x0a gesetzt.
Das Programm habe ich schon auf main mit while(1) reduziert. Hat leider
nicht geholfen. Ich finde einfach keinen Fehler in meinem Programm.
Was mich mom. verwirrt ist das beim start einer neuern Sequenz (Master
sendet Adresse) ja die Adresse im SSPBUF stehen müsste. Der Vergleich:
SSPBUF = 0x0a aber fehlschlägt.
So, nachdem ich mit einen Logic Analyser gekauft habe (Logic Pirate für
ca. 27 Euro ;-) )
habe ich den Fehler gefunden.
Ich hatte im Prinzip geschrieben:
1
#define SLAVE_POWERBOX 0x0a //die Adresse des Slaves
2
SSPADD=SLAVE_POWERBOX;
richtig ist aber:
1
#define SLAVE_POWERBOX 0x0a //die Adresse des Slaves
2
SSPADD=SLAVE_POWERBOX<<1;//bit0 wird nicht verwendet
(der PIC verwendet Bit1-7 vom SSPADD für die 7 bit Adressierung. Hatte
ich überlesen...)
Vieleicht hift es ja jemanden nicht den gleichen Fehler zu machen.