Hallo, ich habe Beispiele gefunden in denen einzelne Bytes über SPI gesendet und empfangen werden. Kann ich auch eine Gruppe von z.B. drei Bytes unmittelbar nacheinander senden? Besten Dank im voraus für eine Antwort. Moritz
Ja, sicher. Einfach warten, bis das worherige draussen ist. Entweder mit pollen oder mit dem interrupt.
Z.B. 3 Bytes an den AD DAC schicken:
1 | unsigned char SetExtDAC(unsigned char num, unsigned int data) |
2 | {
|
3 | |
4 | //AD5663 Command Byte zusammen bauen:
|
5 | |
6 | if(num == 0)Byte2 = AD5663_Command3 + AD5663_Address0; |
7 | if(num == 1)Byte2 = AD5663_Command3 + AD5663_Address1; |
8 | if(num > 1)return STATUS_ERROR; |
9 | |
10 | |
11 | Byte1 = ((data >> 8) & 0xFF); //High-Byte |
12 | Byte0 = (data & 0xFF); //LOw-Byte |
13 | |
14 | |
15 | SPI1WaitForComplete(); //Senden bereit? |
16 | |
17 | ResetDevCSA; //Chip-Select |
18 | TXBUF1 = Byte2; //Command-Byte absetzen |
19 | SPI1WaitForComplete(); |
20 | asm("nop"); |
21 | asm("nop"); |
22 | |
23 | TXBUF1 = Byte1; //Highbyte senden |
24 | SPI1WaitForComplete(); |
25 | asm("nop"); |
26 | asm("nop"); |
27 | |
28 | TXBUF1 = Byte0; |
29 | SPI1WaitForComplete(); |
30 | asm("nop"); |
31 | asm("nop"); |
32 | SetDevCSA; |
33 | |
34 | return STATUS_SUCCESS; |
35 | }
|
36 | |
37 | void SPI1WaitForComplete(void) |
38 | {
|
39 | while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready? |
40 | do
|
41 | {
|
42 | IFG2 &= ~URXIFG1; |
43 | }
|
44 | while (URXIFG1 & IFG2); |
45 | }
|
Hallo, vielen Dank für die Antwort. Gibt es Erfahrungen ob man die Datenbytes auf diese Weise unmittelbar aneinander hängen kann, das nach dem letzten Bit vom ersten DatenByte unmittelbar mit dem nächsten Clock-Signal das erste Bit des zweiten DatenBytes gesendet wird? Moritz
Naja, das geht nur bei hinreichend langsamem Takt, denn du musst ja erst schauen, ob das letzte Byte raus ist, und dann erst die Daten in den TX Buffer kopieren, das dauert ja ein paar Prozessortakte. Direkt nacheinander und ohne Jitter wird´s mit dem MSP430 nicht gehn....ist ja auch fast nirgends notwendig.
Hallo Christian, vielen Dank für deine ausführliche Antwort. Nachdem ich das Datenblatt von meinem EEPROM AT25010A gelesen hatte, glaubte ich, die Bytes müssten unmittelbar aufeinander folgen. Aber vielleicht ist das gar nicht nötig. Ausprobieren kann ich es leider erst später, da ich im Moment programmiere ohne Hardware zum testen. Moritz
Ist eigentlich bei SPI in den seltensten Fällen erforderlich. Da ja eh nur zur SCLK Flanke was passiert.
zum einen is es nich nötig, zum anderen hat der msp aber den netten TX-Interrupt, der ausgelöst wird, wenn der TX-Buffer leer ist. Du kannst also das nächste Byte laden, während das alte noch übertragen wird
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.