MSP430 Kurzschluss SPI

OP #2796741
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
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
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
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?
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
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
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???
Gast
so gelöst, Fehelr wie sooft 20cm vor dem Bildschirm.

Hatte irgendwie nen ChipSelect falsch eingestellt beim Senden enies 
Befehls, jetzt scheints alle zu gehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.