Forum: Mikrocontroller und Digitale Elektronik MSP430 Kurzschluss SPI


von Hannes S. (herrhannes)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Ziehst du auch die Chip Select Leitung des ADS1298R auf Masse, wenn du 
kommunizierst? Hört sich nämlich stark nach einer auf beiden Seiten 
hochohmig geschalteten MISO-Leitung an, auf welche MOSI einkoppelt.

Gruß Oliver

von Hannes S. (herrhannes)


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?

von Hannes S. (herrhannes)


Lesenswert?

So.
Ich habe mir das noch einmal genauer angeschaut, ohne das 
ADS1298R-Board.
Es sieht (nicht nur) so aus, dass das MSP430-Board auf SOMI und MOSI
sendet.
Ist da bei meiner obigen SPI-Initialisierung etwas falsch gelaufen?

Gruß
Hannes

von Hannes S. (herrhannes)


Lesenswert?

Nachtrag: Sobald ich GPIO4 (P4.1) als Output definiere, bricht die 
Spannung ein.
Das sollte eigentlich CS auf low ziehen.

von Hannes S. (herrhannes)


Lesenswert?

Oh Mist.
Ich sehe gerade dass ich auf dem MSP430-Board einen Kurschluss zwischen 
den Pins habe.
Das war das einzige von den drei Teilen, das ich nicht nachgemessen 
hatte, weil ich es für funktionierend hielt.

von seb (Gast)


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.

von Jörg S. (joerg-s)


Lesenswert?

>Aber ich bleibe scho immer direkt bei der Abfrage des Empfangpuffers
>hängen.
Wo sendest du denn was raus? Bei SPI gilt: Ohne Senden kein empfangen!

von seb (Gast)


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?

von Benedikt D. (benedikt_d)


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.

von seb (Gast)


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

von seb (Gast)


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???

von seb (Gast)


Lesenswert?

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.

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.