Hallo Controllergurus, ich hab seit einigen Wochen ein und das selbe Problem: Ich versuche mit einem 328P einen Drucksensor via SPI aus zu lesen. Leider liefert dieser immer nur 0b11111111 zurück und das sollte er nicht. Vielleicht könnt ihr mir sagen ob ich im Code irgend was übersehen habe? Beste Grüße Merkus Datenblatt Sensor http://www.meas-spec.com/product/t_product.aspx?id=5035# Programm
1 | #include <avr/io.h> |
2 | #include <asf.h> |
3 | #include <math.h> |
4 | #include <stdio.h> |
5 | #include <stdlib.h> |
6 | #ifndef F_CPU
|
7 | #define F_CPU 20000000UL
|
8 | #endif
|
9 | #include <util/delay.h> |
10 | #include <avr/interrupt.h> |
11 | |
12 | |
13 | int main (void) |
14 | {
|
15 | |
16 | //PB2 SS //PB3 MOSI //PB5 SCK
|
17 | DDRB|=((1<<2)|(1<<3)|(1<<5)); |
18 | //PB4 MISO
|
19 | DDRB&=~(1<<4); |
20 | //SPI Enable // Master enable // prescaler 128
|
21 | SPCR|=((1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)); |
22 | //SCK 0 when IDLE //MSB first
|
23 | SPCR&=~((1<<CPOL)&(1<<DORD)); |
24 | //Slave select
|
25 | PORTB|=(1<<2); |
26 | |
27 | |
28 | DDRD|=(1<<1); |
29 | int data1 =0; |
30 | int data = 0; |
31 | uint16_t result = 0; |
32 | uint16_t result1 =0 ; |
33 | int L; |
34 | |
35 | while(1) |
36 | {
|
37 | |
38 | PORTD|=(1<<1); |
39 | _delay_ms(500); |
40 | PORTD&=~(1<<1); |
41 | _delay_ms(500); |
42 | |
43 | |
44 | //schicken auf erste flanke
|
45 | SPCR&=~(1<<CPHA); |
46 | //send reset
|
47 | SPDR = 0b00010101; |
48 | // Wait for transmission complete
|
49 | while(!(SPSR & (1<<SPIF))); |
50 | SPDR = 0b01010101; |
51 | while(!(SPSR & (1<<SPIF))); |
52 | SPDR = 0b01000000; |
53 | while(!(SPSR & (1<<SPIF))); |
54 | |
55 | //Send w1 sequence
|
56 | SPDR = 0b00001111; |
57 | while(!(SPSR & (1<<SPIF))); |
58 | SPDR = 0b01000000; |
59 | while(!(SPSR & (1<<SPIF))); |
60 | |
61 | //read w1
|
62 | //lesen auf zweite flanke
|
63 | SPCR|=(1<<CPHA); |
64 | SPDR = 0; |
65 | while(!(SPSR & (1<<SPIF))); |
66 | data=SPDR; |
67 | SPDR = 0; |
68 | while(!(SPSR & (1<<SPIF))); |
69 | data1=SPDR; |
70 | |
71 | //calculate w1
|
72 | result|=data; |
73 | result1|=result<<8; |
74 | result=result1|data1; |
75 | |
76 | if ((result==0)|(result==0xFFFF)) //get error LED if the bytes of the sensor are just zero or just FFFF |
77 | {
|
78 | |
79 | for(L=0;L<5;L++) |
80 | {
|
81 | |
82 | PORTD|=(1<<1); |
83 | _delay_ms(100); |
84 | PORTD&=~(1<<1); |
85 | _delay_ms(100); |
86 | }
|
87 | |
88 | }
|
89 | |
90 | |
91 | |
92 | }
|
93 | |
94 | |
95 | }
|