MSP430 Kurzschluss SPI

OP #2796741
Lesenswert?

Moin Leute,

ich habe folgendes Problem:
Ich versuche einen ADS1298R per MSP430 (Master) über SPI auszulesen.
Allerdings bringe ich die beiden nicht dazu, miteinander zu 
kommunizieren.
Scheinbar habe ich einen "Kurzschluss" zwischen MOSI und SOMI:
1) Auf beiden erscheint am Oszi das Gesendete von Master sowie Slave.
2) Der MSP430 schafft nur ca. 0,8 High-Pegel, der ADS1298R 2V.
Setze ich allerdings das PxDS-Register, drehen sich die Maximalpegel 
genau um.

Was habe ich da falsch gemacht?
1) Mechanisch, daher im ausgeschalteten Zustand, habe ich keinen 
Kurzschluss.
2) Massen sind miteinander verbunden
3) die entsprechenden PxSEL sind auf 1

Müssen da trotzdem die anderen Register noch gesetzt sein?
1
void usciB1SpiInit(uint32 spi_clock)
2
{  
3
  uint16 usciB1_br_divider = (SM_CLOCK/spi_clock); // 1MHz SPI-Frequenz 
4
  if (usciB1_br_divider < 1) usciB1_br_divider = 1;  // kleinster erlaubter Teiler
5

6
  //SPI Konfigruation  
7
  UCB1CTL1 = UCSWRST;                     // **Put state machine in reset**
8
  UCB1CTL0 = UCMST + UCSYNC;              // 8Bit, SPI-Mastermode, 3-Pin (general SPI setting)
9
  UCB1CTL0 |= UCMSB; //**ADC**   // MSB first, clock polarity and phase (!slave specific!)  
10
  UCB1CTL1 |= UCSSEL_2;                   // clock source: SMCLK
11
  UCB1BR0 = usciB1_br_divider & 0x00FF;   // bit rate control (LSB)
12
  UCB1BR1 = usciB1_br_divider >> 8;       // bit rate control (MSB)
13
                                          // UCB1MCTL = 0x00; -> modulation register not available for USCI_B (not used for SPI)
14
  UCB1IE = 0x00;                          // Interrupt disabled;
15
  UCB1CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
16
}

So initialisiere ich den SPI auf dem MSP430, erwünscht ist Mode 1, 
korrekt so?

Gruß
Hannes
OP #2796766
Lesenswert?

Japp. CS wird durch den MSP430 auf Masse gezogen.
Meinst du, ich habe beim entsprechenden GPIO-Pin eventuell etwas falsch 
konfiguriert?
Ich bin noch absoluter Neuling in Sachen MSP430 und SPI.

Gruß
Hannes

Edit:
Ich habe den nun mal per Jumper Wire auf Masse gezogen, ändert nichts.
Was aber interessant ist:
Wenn ich CS auf Masse habe, bekomme ich einen Puls im Takt des Blinkens 
der LED des ADS1298R-Dev-Boards auf dem SPI.
Das sollte vermutlich so nicht sein?
Gast #2812527
Lesenswert?

Hallo,

ist der Thread noch aktiv?
Habe einähnliches vorhaben:
Kommuniziere zwischen MSP430F5437A <-> AT45DB161D ( 2MB Flash)

Was ich rausschicke kann ich mit dem Oszi verifizieren, das sollte 
stimmen, nur weiss ich nich wieso der FLASH anscheinend nie etwas 
empfängt. Hast du deinen Empfangs und Sendecode eventuell da, fall du 
ihn posten magst, das würde mir vielleicht helfen. Ich hab die leichte 
Vorahnung, dass SPI nur empfängt, wenn ich gleichzeitig etwas sende.

Mein Senden geht ohne Probleme.
Empfangen wollte ich in etwa so, ohne Interrupts zu benutzen:

while(byteCtr)
{
while (!(UCB1IFG & UCRXIFG));    //Empfangspuffer bereit?
*RX_field = UCB1RXBUF;      //Steuerungsdaten senden
    RX_field++;                //Pointer auf daten incementieren
    byteCtr--;                //Bytezähler dekrementieren
  }

Aber ich bleibe scho immer direkt bei der Abfrage des Empfangpuffers 
hängen. Entweder weigert sich der Atmel Flash etwas zu senden, weil mein 
Befehl an ihn doch nicht stimmig ist, oder ich empfange einfach nicht, 
ich verstehs noch nicht so ganz.Vielen Dank und viele Grüße.
Gast #2813243
Lesenswert?

Dankeschön für den Tip.
In der Tat sende ich nicht mehr ktiv raus, das heisst also ich brauche 
zum Empfangen ebenfalls wieder dummy writes , damit der Takt weiterläuft 
und ich gleichzeitig etwas empfangen kann?
#2813262
Lesenswert?

seb schrieb:
> ich brauche
> zum Empfangen ebenfalls wieder dummy writes

Genau, bei SPI brauchst du für die Kommunikation immer einen 
Datentransfer in beide Richtung. Heißt wenn du 8Bit empfangen willst 
musst du 8Bit senden. Was du als Dummy sendest ist prinzipell egal, ich 
habe immer ein FF gesendet damit ist es auch auf dem Oszi besser 
kontrollieren kann.
Gast #2813285
Lesenswert?

Ok, habe das nun getestet und bekomme vom Flash Baustein immer 1 zurück 
für alle Speicherstellen, bzw die die ich bisher getestet habe.
Das ist natürlich erstmal korrekt, weil Flash ja immer 1 ist, wenn er 
erased oder noch nie beschrieben wurde, allerdings dachte ich ich hätte 
was rübergeschoben 0x05 um genau zu sein...

Also neuer Ansatz ich glaube meien Empfangsroutine funktioniert aber 
mein Senden klappt irgendwie nicht so korrekt.

Beim Atmel Flash muss man zuerst Daten in einen Buffer schreiben und 
anschließend mit einem neuen Befehl den Buffer ins main memory 
übertragen, hat da jemand Erfahrung, gibts da stolperstellen? Mein Code 
funktioniert auf jedenfal noch nicht.
MErci
Gast #2813339
Lesenswert?

Update:

Das Senden und Empfangen klappt bishin zum Buffer, den kann ich 
beschreiben und wieder auslesen und ich lese wirklich das aus was ich 
renigeschrieben habe.

Allerdings funktioniert das speichern vom Buffer in den Flash nicht 
wirklich, zumindest habe ich das gefühl, ich lese im Flash an allen 
geprüften Stellen nur einsen ( 1 oder high ) aus, niemals einen 
irgendwie geänderten Wert.

Das ist komplett komisch, weil Atmel ja eindeutig seine OpCodes im 
Datasheet nennt, aber irgendwie einfach nichts passiert???

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