Hallo zusammen, in den M16C-Controllern von Renesas, bei mir speziell auf dem M16C29, gibt es zwei serielle Schnittstellen SIO3,4. Das Versenden klappt wunderbar, nur weiss ich nicht wie ich empfange. Das Versenden wird durch Schreiben in das Sende/Empfangs-Register initiiert. Wie kann ich nun empfangen wenn der Takt nur solange aktiv ist wie ich etwas in das Register schreibe? Hat schon jemand mit dieser Art von Schnittstellen Erfahrung gemacht und kann mir ein Hinweis geben? Gruß an alle
Hi, du musst ein sogenanntes Dummy-Byte rausschicken um für das empfangene Gerät Takte erzeugen, dabei etwas warten bis die Takte durch sind (Die Wartezeit ergibt sich aus der Baudrate). Ich habe mal meine Ansteurung für einen 12-Bit AD-Wandler (==> bei 8Byte Datenbreite auf 2mal holen)in Pseudocode geschrieben: (s3trr = sio3 transmit receive register), ADC_COM=Kommando Byte als define ADC_ON //Chip select für ADC low -->aktiv wait_s(15); //kurz warten bis ADC initialisiert s3trr = ADC_COM; //Kommando schicken (Kanal,conf. usw.) wait_s (15); //warten bis draußen High Byte = s3trr; //High Byte reinholen s3trr = DUMMY_BYTE; //dummy (irgendwas)f. 8 weitere Takte wait_s (15); //warten bis 8 Takte rum low Byte = s3trr; //low Byte holen ADC_OFF //Chip Select geht high --> inaktiv Ist Anfangs ein Problem die Zeiten festzulegen, ein Oszi hilft, falls vorhanden. Ich hoffe es hilft ein wenig Grüße Ralph
Hallo, Danke schon mal für die Antwort, aber es funktioniert immer noch nicht. Ich verstehe nicht, dass du nachdem du den Befehl raus schickst gleich wieder einliesst, du musst doch erst den Dummy schicken um Takte zu erzeugen? Kann es an den Einstellungen liegen? Was hattest du für Einstellungen? Bei mir geht es um ein serielles EEPROM von Microchip (25AA256). Ich hoffe ich habe einen Geistesblitz übers Wochenende. Gruß an alle
> dass du nachdem du den Befehl raus schickst gleich wieder > einliesst Macht er ja nicht, dafür ist ja wait_s() da.
hallo, mir ist schon klar das er wartet, jedoch sollte er nach dem Warten einen Dummy-Befehl senden, um Takte zu erzeugen oder liege ich da falsch?
Hi, sorry, das hat jetzt länger gedauert, ich war unterwegs. Nochmal etwas ausführlicher: s3trr = ADC_COM; //Kommandobyte wird über SIOout rausgetaktet. Wandler schickt gleichzeitig High Byte der letzten Wandlung über SIOin rein. Ansprechbar ebenfalls über s3trr (Gleicher Name für IN und OUT, CPU unterscheidet beim lesen und schreiben). wait_s (15); //warten High Byte = s3trr; //abholen bis reingetaktet (Takt ist der Schreibtakt vom Kommandobyte) //Hier fertig mit HighByte. Wandler hat aber noch 4 weitere. Also: s3trr = DUMMY_BYTE; //dummy (irgendwas)f. 8 weitere Takte //Wandler schickt mit den Schreibtakten die 4 lowBits der letzten //Wandlung wait_s (15); //warten bis 8 Takte rum low Byte = s3trr; //low Byte holen. Fertig. Drei Dinge sind vielleicht verwirrend: 1. SIO In und Out über den gleichen Namen anzusprechen. Intern sind das natürlich verschiedene Register. 2. Der Wandler hat nochmal einen eigenen Wandel-Takt, der deutlich höher ist als der Schiebetakt. 3. Man erhält immer das Ergebnis der letzten Wandlung. Da muss man sehr aufpassen. Besonders am Anfang und bei Kanalwechsel. Also: Kommunikation1 gibt das Ergebnis für Kommunikation2 vor. So ich hoffe Du bist nicht allzu verwirrt. Bei mir hats auch eine Zeit gedauert bis das alles lief. Deshalb nur Mut und ein bisschen rumspielen, Zeiten ändern usw. Oszilloskop zur Hand? Dann die Sende und Empfangsleitung abhören. Viel Erfolg und Grüße Ralph
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.