Erstmal was anderes:
Rein vom logischen Programmieren her, sollte in SPI_INIT nur die
Initialisierung der SPI Schnittstelle drin stehen! Lieber eine 2. und 3.
Funktion anlegen mit z.B. PORT_INIT() und CLK_INIT(). Oder gleich alles
direkt in die MAIN-Funktion reinzimmern. Nur soviel:
1 | void spi_init()
|
2 | {
|
3 | UCTL0 &=~ SWRST; //starting USART1_init
|
4 | UCTL0 |= CHAR+SYNC+MM;
|
5 | UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3???,?SMCLK??
|
6 | UBR00 = 0x08; //1MHz @ 8MHz
|
7 | UBR10 = 0x00;
|
8 | UMCTL0 = 0x00;
|
9 | ME1 |= USPIE0;
|
10 | IE1 &=~ URXIE0;
|
11 | UCTL0 &=~ SWRST;
|
12 | }
|
Und so klappts mit dem Nachbarn:
1 | unsigned char SPI_RW_8BIT(unsigned char data)
|
2 | {
|
3 | while((IFG2 & UTXIFG1) == 0); //TX Buffer leer?
|
4 | TXBUF1 = data; //Sende Daten
|
5 |
|
6 | while((IFG2 & URXIFG1) == 0); //Byte im RX Buffer?
|
7 | return RXBUF1; //Buffer auslesen
|
8 | }
|
Um Daten von SPI auszulesen muss man immer davor senden. Hier ein
Beispiel:
1 | unsigned char ADC_READ(void)
|
2 | {
|
3 | unsigned char value;
|
4 |
|
5 | //CS setzen
|
6 |
|
7 | SPI_RW_8BIT(BEFEHL); //Befehl für ADC senden, um Messergebnis zu bekommen und Rückgabewert verwerfen
|
8 | value = SPI_RW_8BIT(0x00); //0x00 senden um Clk zu erzeugen und Messwert auslesen
|
9 |
|
10 | //CS setzen
|
11 | return value;
|
12 | }
|
Schau dir mal genau das SPI-Timing im Datenblatt von deinen AD-Wandler
an.