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;
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.
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.
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?
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.