SIO3,4 beim M16C

Gast #301456
Lesenswert?

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
Gast #301457
Lesenswert?

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
Gast #301458
Lesenswert?

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
Gast #301461
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren