Forum: Mikrocontroller und Digitale Elektronik PIC18 MWIRE (MSSP) Problem


von Michael (Gast)


Lesenswert?

Ich habe mich wohl verlaufen, will aber nicht auf Anfang zurück.
Problem:
Mein Sensor (ADNS-2610) hat laut Datenbalt ein "synchronous serial 
port". In meiner Unbedachtheit habe ich bei meinem PIC18 das MSSP als 
MWIRE Interface implementiert um die beiden zusammen zu bringen. Dann 
habe ich festgestellt, dass das PIC interface eine dreidraht (SCL, SDI, 
SDO) verbindung möchte, aber der Sensor nur ein zweidraht Interface (SCL 
SDIO) hat. Kann so schlimm nicht sein - kurzerhand beim PIC die SDO und 
SDI über einen Wiederstand verbunden und schon .... geht nichts mehr!

Wenn ich schreiben oder lesen will (SSPBUF = data_out;) und dabei der 
der SDI auf low gezogen ist, bleibt der PIC stehen?!
Habe gedacht es wird wohl ein Interrupt ausgelöst und versucht die zu 
disablen.

PR2 = 6;
T2CON  = 4;
OpenMwire(MWIRE_FOSC_TMR2);
SSPCON1bits.CKP = 1;        // ensure clock state is 1 for transmission
INTCON = 0;
PIE1 &= 0xF7; // SSP interrupt (bit3) disablen
SSPBUF = data_out;          // write single byte to the Microwire1 
device
dummi = SSPBUF;

von Master S. (snowman)


Lesenswert?

hast du dir mal das datenblatt des ADNS-2610 angesehen bezüglich der 
read/write-operation? hast du gesehen, wieviele bits aufs mal da 
versendet werden? weisst du wie MSSP des PICs funktioniert oder hast mal 
den vorgeschlagenen code von Microchip zu herzen genommen? ..ich glaube, 
keiner dieser fragen kannst du mit einem 'ja' beantworten. komme dem 
erstmal nach. danke.

von Michael (Gast)


Lesenswert?

Hallo snowman.

Das es prinzipiell mit dem MSSP geht kannst du hier sehen:
http://forum.htsoft.com/all/showflat.php?Cat=0&Number=30719

Kannst Du auch eine Antwort auf die eigentliche Frage geben? Ansonsten 
alles ja.

von Master S. (snowman)


Lesenswert?

dass es mit dem MSSP machbar ist, glaube ich auch. den verlinkten code 
habe ich nicht durchgesehen: wenn er funktioniert, dann nimm ihn doch 
einfach. beim groben durchscrollen des links habe ich keinen schaltplan 
gesehen, vielleicht werden die datenleitungen SDO/SDI auf GND oder +5V 
gezogen und sie sind opendrain definiert oder was weiss ich.
ps: ich habe so geantwortet, weil es nach einem ratespiel ausgsehen hat 
(in der letzten zeit häufen sich solche, bei denen zuerst geraten werden 
muss, was der threadsteller schon weiss (meist nichts), und ich 
zumindest bin echt nicht spitz auf solche ratespiele). nun denn, wenn es 
im besagten link funktioniert, dann frag doch dort nach der 
HW-beschaltung.
..ähm, was macht eigentlich die zeile "device" in deinem code?

von Michael (Gast)


Lesenswert?

Hallo,

"device" habe ich nur hier geschrieben (aber nicht im sorce) stehen. 
(Mein Fehler -> Zeilenumbruch beim kopieren.)

PR2 = 6;
T2CON  = 4;
OpenMwire(MWIRE_FOSC_TMR2);
SSPCON1bits.CKP = 1;        // ensure clock state is 1 for transmission
INTCON = 0;
PIE1 &= 0xF7; // SSP interrupt (bit3) disablen
SSPBUF = data_out;          // write single byte to the Microwire1 
device
dummi = SSPBUF;

Der Link mit dem mssp ist leider schon alt. Glaube da antwortet keiner 
mehr.
Laut Microchip Beispielen geht das mit Mssp und Mwire tatsächlich anders 
- hab ich auch gelesen. Aber so wie in den Beispiele umgesetzt hatte ich 
das selbe Problem. Deshalb habe ich nach und nach alles was nicht nötig 
ist weggelassen. Der PIC ist übrigens ein PIC18F2455 für den es ein 
Errata gibt. Dort wird die Methode aus den Beispielen mit testen auf BF 
als fehlerträchtig beschrieben.

von Master S. (snowman)


Lesenswert?

interessant finde ich im link:
1
unsigned int recv_SPI(unsigned int addr)
2
{
3
  SSPBUF = addr & 0x7F;
4
  while(!BF);
5
  TRISC= TRISC & 0x20; //high-z state for PORTC? 
6
  return SSPBUF;
7
}
wahrscheinlich sind SDI und SDO wirklich mit je einem widerstand auf die 
datenleitung gekoppelt und jenachdem, ob empfangen wird oder gesendet, 
wird der entsprechende pin auf "high-z" geschaltet...

von Michael (Gast)


Lesenswert?

Problem gelöst.
Der SDI benötigt einen pullup Wiederstand. Ist dieser nicht vorhanden 
"wartet" die Hardware auf eine art "Acknoledge" wie bei I2C.
Man kann tatsächlich ein "SDIO" erzeugen indem man SDI und SDO mit einem 
Wiederstand verbindet. Wie erwähnt, muss aber der SDI zusätzlich einen 
Pullup kriegen. Die Vermutung kamm mir, als ich die Doku zum I2C gelesen 
habe und hier noch einige andere Threads zum Thema MSSP gelesen habe.
Der Code den snowman zitiert muss ebenfalls so ähnlich implementiert 
werden und "jenachdem, ob empfangen wird oder gesendet,
wird der entsprechende pin auf "high-z" geschaltet..."
Nur mit dem "while(!BF);" muss man bei einigen PICs vorsichtig sein -> 
siehe Errata für die jeweiligen Pics.

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.