Forum: Mikrocontroller und Digitale Elektronik Max1228 reagiert nicht per SPI


von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

Hallo

ich muss ein Max 1228 per SPI mit einem Atmel ansteuern.

Nach langen durchforschen der Datenblätter denke ich sollte es so 
richtig sein aber leider reagiert er nicht!

Hab mal ein Bild angehängt vom Oszi. Leider ist der Max1228 nur im SMD 
0,65mm!!! verfügbar und so weis ich auch nicht ob er das anlöten 
überlebt hat! ich habe mit 290°C und wirklich sehr kurz gelötet und ihn 
auf eine Adapterplatine gesetzt. Verbindungen wurde alle Durchgemessen 
und die Anschlüsse vom OSZI direkt an der Adapterplatine gemessen!

Habe ich Grundsätzlich was falsch gemacht?

Zum Bild:

DO: ~CS
D1: SLK
D2: MOSI
D3: MISO
D4: EOS vom AD


Sinn der Bitfolge:

1. Reset
2. Setup & unipolar (2Byte)
3. Kanal 1 lesen

EOS sollte kurz auf 0 gehen, wenn ein Abarbeitung fertig ist.... leider 
passiert weder das, noch sendet er die erwünschten 2Byte!

von Hubert (Gast)


Lesenswert?

hallo du

ich geb dir ein Tipp: SPI ist einfach nur scheiße!!!

von Jörn A. (joern_)


Lesenswert?

parallel fällt leider weg wegen der vielen Leitungen!
Hab ich Grundsätzlich was falsch gemacht bei den Bits?

von Jörn A. (joern_)


Lesenswert?

kann mir denn wirklich kein Erfahrener helfen? ich habe es mitlerweile 
geschaft, das das EOC (auf Kanal D4) nach der letzten Bitfolge 
signalisiert, das der Befehl erkannt hat. Das Bauteil scheint also zu 
leben!

Muss evtl. der CLK weiterlaufen? wenn ja wie kann ich das mit dem Atmel 
machen.wird ja vom SPI gesteuert!

noch mal zur Bitfolge:

Reset   : 00011000
Setup   : 01101010 & 00000000
Kanal 1 : 10000000

darauf hin sollten 2Byte vom AD kommen, nachdem das EOC (D4) kurz auf 
low war.

Hier meine Routinenen im Atmel:
[Code]
void SPI(void)
{
DDRB = (1<<DDB4)|(1<<DDB5)|(1<<DDB7); // SS, MOSI & SCK output
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);  // SPI on, Clock 64
}

void ResetAD(void)
{
PORTB=(0<<PORTB4);
//SPDR = 0x18;          //00011000 R mit FIFO
SPDR = 0x10;            //00010000 R
while(!(SPSR & (1<<SPIF)));
PORTB=(1<<PORTB4);
wait();
}

void SetupAD(void)
{
wait();
PORTB=(0<<PORTB4);
//SPDR = 0x6A;          //01101010 Setup,extern Ref
SPDR = 0x66;                        //01100110 Setup intern Ref
while(!(SPSR & (1<<SPIF)));
wait();
PORTB=(1<<PORTB4);
wait();
PORTB=(0<<PORTB4);
SPDR = 0x00;            //00000000 unipolar
while(!(SPSR & (1<<SPIF)));
PORTB=(1<<PORTB4);
wait();
}

void Kanal1(void)
{
PORTB=(0<<PORTB4);
SPDR = 0x80;          //10000110 Kanal 1
while(!(SPSR & (1<<SPIF)));
PORTB=(1<<PORTB4);
wait();
PORTB=(0<<PORTB4);
while (!(SPSR & (1<<SPIF)));  // Warten auf Daten
Daten1 = SPDR;
while (!(SPSR & (1<<SPIF)));  // Warten auf Daten
Daten2 = SPDR;
PORTB=(1<<PORTB4);
wait();
}

von Michael U. (Gast)


Lesenswert?

Hallo,

SPI ist nur ein Schieberegister, bei dem 8Bit im Master und 8Bit im Slve 
zum Ring geschaltet ains und das mit dem Takt des Masters geschoben 
wird.
Wenn Du also was empfangen willst, mußt Du den Takt liefern.

Üblicherweise sendet man dazu ein Dummy-Byte. Das wird dann in den Slave 
geschoben und dieser schiebt zeitgleich seine 8Bit in das 
Empfangsregister des Masters.

Gruß aus Berlin
Michael

von Jörn A. (joern_)


Lesenswert?

ok vielen Dank.

also nachdem ich den "letzten Befehl" zum Abfragen gesendet habe, sende 
ich, nachdem das EOC kam einfach noch mal 1 Byte. parallel dazu empfängt 
der Atmel über Miso das Byte vom AD und das ganze noch mal fürs 2te 
byte..

werde das ganze morge früh mal testen. vielen Dank

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.