Ich versuche gerade einen DA-Wandler über SPI anzusprechen. Bis jetzt
leider ohne Erfol.
Der DA-Wandler erwartet ein 14-bit Wort nach dem Scheme:
1 Startbit, 2 Controlbits, 3 Adressbits und 8-Datenbits.
folgendes möchte ich Übertragen:
1 0 1 0 0 0 1 1 , 1 1 1 1 1 1
Das wäre meine 14-bit Information, um das zweite Byte vollzubekommen
häng ich noch 2 0er an. Die letzten zwei Stellen sind ja eh don`t care
für den DA-Wandler(?).
Also übertrage ich 0xA3 und 0xFC mit folgendem Program:
1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/signal.h>
|
4 |
|
5 | #define SS PB0
|
6 | #define MOSI PB2
|
7 | #define SCK PB1
|
8 | #define CS PE6
|
9 |
|
10 | SIGNAL (SIG_SPI) {
|
11 | return;
|
12 | }
|
13 |
|
14 | void SPI_Master_TransmitInit(void)
|
15 | {
|
16 | /* Set MOSI, SS und SCK als Ausgang */
|
17 | DDRB |= (1<<MOSI) | (1<<SCK) | (1<<SS);
|
18 | DDRE |= (1<<CS); //Chip select als Ausgang
|
19 | PORTB |=(1<<SS); //Slave select High
|
20 | PORTE |= (1<<CS); //Chip select High
|
21 | /* Enable SPI Interrupt, Enable SPI, Master, f = FCPU/16 */
|
22 | SPCR = (1<<SPIE) | (1<<SPE) | (1<<MSTR) | (1<<SPR0);
|
23 | }
|
24 |
|
25 | void SPI_MasterTransmit(void)
|
26 | {
|
27 | PORTE &= ~(1<<CS); //Chip select Low
|
28 | PORTB &= ~(1<<SS); //Slave select Low
|
29 | SPDR = 0xA3; //Erstes Byte senden
|
30 | while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
|
31 | SPDR = 0xFC; //Zweites Byte senden
|
32 | while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
|
33 | PORTE |=(1<<CS); //Chip select High
|
34 | PORTB |=(1<<SS); //Slave select High
|
35 | }
|
36 |
|
37 | int main (void)
|
38 | {
|
39 | sei();
|
40 | SPI_Master_TransmitInit();
|
41 | SPI_MasterTransmit();
|
42 |
|
43 | while(1)
|
44 | return 0;
|
45 | }
|
Nicht wundern wegen SS und CS, CS geht an den DA-Wandler, SS ist über
Widerstand auf Masse, ist Hardwaremäßig so vorgegeben.
Weiß vielleciht jemand einen Rat was Faul sein könnte?