Moin,
ich versuche gerade mit einem ATMEGA328PB mittels SPI mit dem LTC2306 zu
kommunizieren. Leider gelingt dies nicht, ich erhalte keine Antwort,
wenn ich eine Anfrage sende. Hier mal mein Code, vielleicht fällt
jemanden etwas auf, was ich übersehen habe:
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 | #include <stdlib.h>
|
7 | #include "avr.h"
|
8 | #include "ADC.h"
|
9 | #include "LTC230x.h"
|
10 | #include "UART.h"
|
11 | #include "SPI.h"
|
12 |
|
13 | uint8_t counter_isr = 0;
|
14 | uint8_t counter_isr2 = 0;
|
15 | uint16_t adc_value = 0;
|
16 | uint16_t vbat = 0;
|
17 | double adc_result = 0;
|
18 | char Buffer[10];
|
19 | char Buffer_Bat[10];
|
20 |
|
21 |
|
22 | ISR (TIMER0_COMPA_vect)
|
23 | {
|
24 | counter_isr++;
|
25 | if (counter_isr == 50)
|
26 | {
|
27 | PORTD ^= (1<<PD3);
|
28 | counter_isr = 0;
|
29 | }
|
30 | }
|
31 |
|
32 | ISR(ADC_vect)
|
33 | {
|
34 | adc_value = (uint16_t) (ADCL + (ADCH<<8));
|
35 |
|
36 | adc_result = calculate_adc(adc_value);
|
37 |
|
38 | calculate_temp(adc_result);
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 | int main(void)
|
44 | {
|
45 |
|
46 | avr_init();
|
47 | SPI_MasterInit();
|
48 | UART_Init();
|
49 |
|
50 | if (!(PIND & (1<<PIND5)))
|
51 | {
|
52 | LED_VBAT(1);
|
53 | LED_SER(0);
|
54 | }
|
55 |
|
56 |
|
57 | uart_puts("Welcome");
|
58 | uart_puts("Booting...");
|
59 | _delay_ms(250);
|
60 |
|
61 | while (1)
|
62 | {
|
63 | uart_puts("Temperatur: ");
|
64 | start_converting();
|
65 | _delay_ms(500);
|
66 | if (!(PIND & (1<<PIND5)))
|
67 | {
|
68 | //SPI_MasterTransit(0x88);
|
69 | D9_low();
|
70 | _delay_us(10);
|
71 | select_D9();
|
72 | _delay_us(10);
|
73 | D9_high();
|
74 | SPI_MasterTransit(0b10001000);
|
75 | //vbat = SPDR0;
|
76 | _delay_ms(1);
|
77 | itoa(vbat, Buffer_Bat, 10);
|
78 | Send_UART_Char(Buffer_Bat);
|
79 | }
|
80 |
|
81 |
|
82 | }
|
83 | }
|
Die SPI_MasterInit():
1 | void SPI_MasterInit (void) //Deklaration der Funktion 'SPI_MasterInit' als Funktion ohne Rückgabewert
|
2 | {
|
3 | DDRB = (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB5);
|
4 | DDRB &= ~(1<<DDB4);
|
5 |
|
6 | //Deklarieren von Pin PB0, PB1, PB3 und PB5 von Port B als Ausgang
|
7 |
|
8 | PORTB |= (1<<PB1); //Setzen des Ausgangs PB1 auf high
|
9 | PORTB |= (1<<PB2); //Setzen des Ausgangs PB2 auf high
|
10 |
|
11 | /*Alle Deklarationen von Port B als Ausgänge müssen in der 'SPI_MasterInit' erfolgen, damit sie global gültig sind.
|
12 | Dannach können die Pins auch in der Main-Funktion benutzt werden.*/
|
13 |
|
14 | /*Der Pin PB4 von Port B muss als Ausgang definiert oder bei einem Eingang per Pull-Up auf high gezogen werden. Sonst ist es
|
15 | möglich, dass der µC im Slave-Modus arbeitet und so keinen Takt an PB7 (Port B) generiert*/
|
16 |
|
17 |
|
18 | SPCR0 |= (1<<SPE0) | (1<<MSTR0) | (1<< SPR00);// | (1<<CPOL0);
|
19 | //Setzen der Bits SPE, MSTR, SPR0 & CPOL im Register SPCR (SPI Status Register)
|
20 | //SPE = enable SPI
|
21 | //MSTR = µC als SPI-Master definieren
|
22 | //SPR0 = den CPU-Takt/16 als SPI-Clock
|
23 | //CPOL = Taktbeginn auf fallende Flanke setzen
|
24 | }
|
Ich hoffe jemand kann mir weiter helfen.
Gruß