hallo, hab da mal eine frage: ich verwende den msp430f169, hab (so glaube ich) den µp richtig initialisiert, und jetzt möchte ich daten auf mosi schreiben. meine frage: taktet der µp automatisch, sobald ich meine daten ins register U0TXBUF geschrieben hat (hab die CS leitung zuerst auf LOW gesetzt) diese raus, und schaltet dann den takt wieder ab? oder kann ich das steuern wie lang der takt zB. noch nachläuft? besten dank, gruß christoph
> taktet der µp automatisch, sobald ich meine daten > ins register U0TXBUF geschrieben hat (hab die CS leitung zuerst auf LOW > gesetzt) diese raus, und schaltet dann den takt wieder ab? oder kann ich > das steuern wie lang der takt zB. noch nachläuft? Es sollten exakt soviele Taktimpulse ausgegeben werden, wie Datenbits übertragen werden. Ein "Nachlaufen" darf es nicht geben.
danke! heisst das dann auch, dass wenn man z.B von einem Sensor eine Antwort über MISO bekommt, der Takt dann automatisch vom µP wieder "eingeschaltet" wird?
Nein, der Takt wird immer vom Master erzeugt, hier also dem MSP430. Das Einlesen von Daten geschieht simultan mit dem Schreiben von Daten. Lies Dir mal die Beschreibung des Protokollablaufes hier durch: http://de.wikipedia.org/wiki/Serial_Peripheral_Interface#Protokollablauf_und_Einstellm.C3.B6glichkeiten (erster Absatz)
Eine Antwort liest man ein, indem man nochmal ein Dummy-Byte raus schreibt, Schreiben und lesen erfolgt immer gleichzeitig. Um welchen SPI Slave Baustein handelt es sich denn konkret?
hab ich mir jetzt alles durchgelesen, müsste eigentlich so hinhauen ich schick zuerst ein "Command- Byte" und dann ein von dir angesprochenes "Dummy- Byte" bei mir FF hex, da es sich nicht mit einem Command überschneidet (Ok der Sensor schickt 11 Bit aber ich will nur mal schauen ob er überhaupt etwas schickt) ahm is der Sensor SCA100T - D02
Ja, also die 8 Bit Temperatur auslesen sollte so funktionieren. Command hinschicken, waren bis rausgeschoben ist (auf RX-Int-Flag warten) und dann nochmal Dummy-Byte raus, wieder auf das RX-Flag warten und dann steht in URXBUF0 dein Temperatur-Wert. Bei dem 11-Bit Wert wirds schwieriger. Wenn der Sensor nicht allzu blöd ist, kannst du ihm 3 Bytes schicken, und die restlichen 5 Bist ignoriert er, dann bekommst du den 11 Bit Wert in 2 Bytes zurück. Mit Pech klappts so nicht und du musst die SPI in Software nachbilden.
hab das mal versucht zu programmieren müsste also so aussehen, hier les ich die Temperatur ständig wieder ein.... P3OUT &= ~BIT0; //CSB für Sensor U0TXBUF = 0x08; //Commando für Temp lesen RWTR while (URXIFG0 != 1) {}; //WARTEN while(1) //somit liest er ständig die Temperatur { U0TXBUF = 0xAF; //DummyByte while(URXIFG0 != 1) {};//WARTEN } oder muss ich immer zunächst ein Command schreiben um dann die Daten zu erhalten??
1. musst du wohl immer das Kommando wieder schreiben, und nach dem Einlesen der Temperatur das CS wieder High setzen. 2. while (URXIFG0 != 1) ist auch Quatsch, du musst schon das IFG1 (denke ich, dass das da drin war) Register abfragen, ob das URXIFG0 Bit gesetzt ist.
so müssts doch funktionieren oder, den Senor anzusprechen um zumindest die Temp. auszulesen? while (1) { P3OUT &= ~BIT7; //enable Sensor TXBUF0 = 0x08; //Kommando Read Write Temp while (!(IFG1 & UTXIFG0)); //USART0-> TX frei? while (!(IFG1 & URXIFG0)); //Daten empfangen? rec_sensor = RXBUF0; TXBUF0 = 0x00; //Dummy-Byte senden while (!(IFG1 & UTXIFG0)); //USART0--> TX frei? while (!(IFG1 & URXIFG0)); //Daten empfangen? rec_sensor = RXBUF0; P3OUT |= BIT7; }; irgendwie bekomm ich da keine "richtige" Antwort vom Sensor vll hat wer eine Idee? besten Dank
Sollte passen....stimmen denn die SPI-Einstellungen? Also SPI Mode 0, 1, 2 oder 3?
ME1 |= USPIE0; // Enable USART0 SPI UCTL0 |= CHAR + SYNC + MM; // 8-bit SPI Master UTCTL0 |=SSEL0+STC;// // SMCLK, 3-pin mode UBR00 = 0x02; UBR10 = 0x00; UMCTL0 = 0x00; und dann halt noch Port3 Select, Direction und POUT....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.