Moin, ich versuche gerade einen MS5803-14BA Drucksensor mit SPI anzusteuern. Mein SPI - Code sieht wie folgt aus:
1 | #include "spi.h" |
2 | #include <avr/io.h> |
3 | #include <stdio.h> |
4 | #include "uart.h" |
5 | |
6 | #define SPI_PORT PORTB
|
7 | #define SPI_DDR DDRB
|
8 | |
9 | #define SPI_CS 2 //SS, CSB
|
10 | #define SPI_MOSI 3 //DO,MOSI
|
11 | #define SPI_MISO 4 //DI,MISO
|
12 | #define SPI_SCK 5 //Clock
|
13 | |
14 | #define SPI_ENABLE() SPI_PORT &= ~(1<<SPI_CS);
|
15 | #define SPI_DISABLE() SPI_PORT |= (1<<SPI_CS);
|
16 | #define SPI_WAIT() while(!(SPSR & (1<<SPIF)));
|
17 | |
18 | void spi_init(uint8_t mode, bool interrupt) { |
19 | |
20 | SPI_DDR &= ~(1 << SPI_MISO); |
21 | SPI_DDR |= (1 << SPI_SCK); |
22 | SPI_DDR |= (1 << SPI_MOSI); |
23 | SPI_DDR |= (1 << SPI_CS); |
24 | |
25 | SPCR = ((interrupt ? 1 : 0) << SPIE) | (1 << SPE) | (1 << MSTR) |
26 | | (((mode & 0x02) == 2) << CPOL) //Clock Polarity |
27 | | (((mode & 0x01) == 1) << CPHA); //Clock Phase |
28 | |
29 | //SPSR = (1<<SPI2X); //Double the SPI Speed.
|
30 | |
31 | |
32 | }
|
33 | |
34 | void spi_writeByte(uint8_t Byte) { |
35 | SPDR = Byte; |
36 | SPI_WAIT(); |
37 | }
|
38 | |
39 | uint8_t spi_rcvByte() { |
40 | uint8_t Byte = 0; |
41 | SPDR = 0x00; |
42 | SPI_WAIT() ; |
43 | Byte = SPDR; |
44 | |
45 | //debug
|
46 | uart_putc(Byte); |
47 | uart_puts("\n"); |
48 | //
|
49 | return Byte; |
50 | }
|
51 | |
52 | uint16_t spi_rcvWord() { |
53 | uint16_t Word = 0; |
54 | Word |= (uint16_t) spi_rcvByte() << 8; |
55 | Word |= spi_rcvByte(); |
56 | return Word; |
57 | }
|
58 | |
59 | uint32_t spi_rcvDWord() { |
60 | uint32_t DWord = 0; |
61 | DWord |= (uint32_t) spi_rcvByte() << 24; |
62 | DWord |= (uint32_t) spi_rcvByte() << 16; |
63 | DWord |= (uint16_t) spi_rcvByte() << 8; |
64 | DWord |= spi_rcvByte(); |
65 | return DWord; |
66 | }
|
Ich bekomme aber immer nur 0xFF zurück, wenn ich versuche etwas per SPI zu lesen und dann (erstmal zum Testen) per UART weiter an den PC zu senden. Ist mein Code falsch ? Ich nutze einen Atmega168V@3V3,8MHz und für UART die Library von Peter Fleury.