Forum: Mikrocontroller und Digitale Elektronik zweiter I2C beim PIC18F27J53


von Michael S. (rbs_phoenix)


Lesenswert?

Hallo zusammen. Ich hab mal eine Frage.
Ich benutze für ein Projekt den PIC18F27J53:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en548695
http://ww1.microchip.com/downloads/en/DeviceDoc/39964B.pdf

Laut angaben in der Übersicht und im Datenblatt hat er 2x MSSP (SPI 
ODER I²C). SPI1 ist Laut der Übersicht auf Seite 5 bei PIN 7,18,25,26 
und I²C1 bei PIN 25,26.

Zuerst hab ich mich gefragt, wo denn die SPI2/I²C2 PINs sind, bis ich 
gesehen hab, dass man die SDI,SDO,/SS,SCK "Anschlüsse" auf die RP-Pins 
Mappen kann. Doch ich würde gerne den I²C-Bus verwenden und die PINs bei 
dem das erste I²C Modul hinter ist sind in Benutzung.

Wenn ich in der Sektion vom MSSP Nachgucke steht dort bei SPI:
> • Serial Data Out (SDOx) –
> RC7/CCP10/RX1/DT1/SDO1/RP18 or
> SDO2/Remappable
> • Serial Data In (SDIx) –
> RB5/CCP5/KBI1/SDI1/SDA1/RP8 or
> SDI2/Remappable
> • Serial Clock (SCKx) –
> RB4/CCP4/KBI0/SCK1/SCL1/RP7 or
> SCK2/Remappable

Bei I²C:
> • Serial Clock (SCLx) –
> RB4/CCP4/PMA1/KBI0
> RD0/PMD0/SCL2
> • Serial Data (SDAx) –
> RB5/CCP5/PMA0/KBI1
> RD1/PMD1/SDA2

Doch bei dem 28pinner gibts kein PORTD und somit auch kein fixen 
SDA2/SCL2.

Jetzt meine Frage:
Soll ich jetzt davon ausgehen, dass die 28pinner zwar 2 SPI aber nur ein 
I²C Modul haben (wovon ich aber weder im DB noch in der Errata gelesen 
hab) oder ist dieser mit dem SDI2/SCK2 gemultiplext, so wie es bei den 
fix verbundenen ersten Modulen ist (wovon bei der Liste der Map-baren 
Peripherie-Pins aber auch nichts Stand)?

Zudem steht auf Seite 97 die Fußnote (1): "Nur bei 44pinnern", die aber 
lediglich bei den PMA-Registern steht, nicht aber bei SSP2ADD, das 
ausschließlich vom I²C benötigt wird.

Weiß dort jemand mehr?

Vielen Dank schonmal

von PICfan (Gast)


Lesenswert?

steht eindeutig im Datenblatt (Seite 291)

"
All members of the PIC18F47J53 family have two
MSSP modules, designated as MSSP1 and MSSP2.
The modules operate independently:
• PIC18F4XJ53 devices – Both modules can be
configured for either I2C or SPI communication
• PIC18F2XJ53 devices:
- MSSP1 can be used for either I2C or SPI
communication
- MSSP2 can be used only for SPI
communication
"

Fazit >> Du hast nur EIN I2C Schnittstelle (MSSP1)

von Peter D. (peda)


Lesenswert?

PICfan schrieb:
> Fazit >> Du hast nur EIN I2C Schnittstelle (MSSP1)

Was überhaupt kein Problem ist, wenn ein I2C nur als Master benötigt 
wird.
I2C-Master geht mit 2 beliebigen IO-Pins.


Peter

von Michael S. (rbs_phoenix)


Lesenswert?

PICfan schrieb:
> steht eindeutig im Datenblatt (Seite 291)

Hm, hab ich wohl glatt überlesen :/ Danke


Peter Dannegger schrieb:
> Was überhaupt kein Problem ist, wenn ein I2C nur als Master benötigt
> wird.
> I2C-Master geht mit 2 beliebigen IO-Pins.

Denke auch, ich werd Software-I²C mal probieren. Soll aber ein Slave 
werden.


Wenn ich ansonsten auf SPI(2) ausweichen wollte, sehe ich das mit dem 
Mapping wie folgt richtig?:

Ich würde SDI auf RP2 (PIN7) und SDO auf RP11 (PIN11) mappen wollen.
In den Registern für die Peripherie-Eingänge wird der gewünschte RP-Pin 
angegeben und bei den Registern für die Ausgänge wird der "Code" für die 
Pinfunktion eingegeben, oder? Sprich:
1
RPINR21 = 0x02; // RPINR21 -> SDI2 Register, 0x02 für RP2
2
RPOR11 = 0x0A;  // RPOR11 -> Register für RP11, 0x0A -> Code 10 -> SDO (Tabelle 10-14, S. 162)

von Peter D. (peda)


Lesenswert?

Michael Skropski schrieb:
> Denke auch, ich werd Software-I²C mal probieren. Soll aber ein Slave
> werden.

Der Slave sollte immer das HW-I2C verwenden.
Dann hat man nicht das Problem, daß andere Interrupts gerade laufen und 
dann Bits verloren gehen.


Peter

von Michael S. (rbs_phoenix)


Lesenswert?

Peter Dannegger schrieb:
> Der Slave sollte immer das HW-I2C verwenden.
> Dann hat man nicht das Problem, daß andere Interrupts gerade laufen und
> dann Bits verloren gehen.

Würde ich auch gerne. Aber ich kann die Pins leider nicht benutzen. Also 
werde ich das mal probieren und ansonsten auf SPI wechseln.

von PICfan (Gast)


Lesenswert?

Michael Skropski schrieb:
> Wenn ich ansonsten auf SPI(2) ausweichen wollte, sehe ich das mit dem
> Mapping wie folgt richtig?:

Seht soweit gut aus.

Es fehlen aber noch die Clock (SCK2) und SlaveSelect (SS) pins.

von Michael S. (rbs_phoenix)


Lesenswert?

PICfan schrieb:
> Seht soweit gut aus.
>
> Es fehlen aber noch die Clock (SCK2) und SlaveSelect (SS) pins.

Ok. Mir gings aber auch nur um das Verständnis, da hab ich dann ein 
Beispiel für einen Eingang und ein Beispiel für einen Ausgang genommen.

Was passiert eigentlich, wenn man einem Pin 2/mehrere Zuweisungen macht.
z.B.:
1
RPINR21 = 0x02; // RPINR21 -> SDI2 Register, 0x02 für RP2
2
RPOR2 = 0x0A;  // RPOR11 -> Register für RP2, 0x0A -> Code 10 -> SDO2 (Tabelle 10-14, S. 162)

oder:
1
RPINR21 = 0x02; // RPINR21 -> SDI2 Register, 0x02 für RP2
2
RPINR23 = 0x02; // RPINR23 -> /SS2 Register, 0x02 für RP2

Wäre es nicht logischer, für jeden Pin ein Register zu machen und dann 
den Code für den Ein- ODER Ausgang einzugeben? So könnte man keine 
Doppel/Mehrfachzuweisungen machen und man braucht nur eine "Art" die 
Pins zuzuweisen. Und das SDI ein Eingang und SDO ein Ausgang ist, ist ja 
klar.
Oder gibt es dafür einen speziellen bzw plausiblen Grund?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.