Hallo, Ich versuche nun schon seit 3 Tagen oben genannten Beschleunigungssensor zum Laufen zu bringen. Der Sensor wird von ELV mmit Pegelwandlern als Komplettmodul verkauft. Datenblatt Sensor: http://www.elv-downloads.de/Assets/Produkte/9/915/91521/Downloads/91521_bma020_data.pdf ELV-Link: http://www.elv.de/3-achsen-beschleunigungssensor-3d-bs-komplettbausatz.html Pinbelegung: (angeschlossen nach dem Beipackzettel als 4wire SPI) UIN = 5V ENABLE = offen UPULLUP = offen INT = offen CSBP = B0 SCK = PB7 (SCK) SDI = PB5 (MOSI) SDO = PB6 (MISO) GND = GND Laufen soll das Ganze auf einem ATMega1284P-PU mit 20MHz Quarz. An den SPI-Leitungen hängt sonst nur noch der ISP-Programmer, der hat aber sonst nie Probleme gemacht. Ich bekomme keine anständigen Werte zurück. Der einzige Wert der passt ist Register 0x15 mit 0x80. Alle anderen geben 0 zurück. Hier mein SPI-Code:
1 | void SPI_MasterInit(void) |
2 | {
|
3 | DDRB = 0xBF; |
4 | // DDRB = ((1<<PB0)|(1<<PB4)|(1<<PB5)|(1<<PB7));
|
5 | // DDRB &= ~(1<<PB6);
|
6 | PORTB |= (1<<PB6); |
7 | PORTB |=(1<<PB0); |
8 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);//|(1<<DORD);//|(1<<SPR1)|(1<<SPR0); |
9 | // SPSR = (1<<SPI2X);
|
10 | }
|
11 | void SPI_write(char cData,char adr) |
12 | {
|
13 | PORTB &= ~(1<<PB0); |
14 | SPDR = adr; |
15 | while(!(SPSR & (1<<SPIF))); |
16 | SPDR = cData; |
17 | while(!(SPSR & (1<<SPIF))); |
18 | PORTB |=(1<<PB0); |
19 | }
|
20 | |
21 | char SPI_read(char adr) |
22 | {
|
23 | PORTB &= ~(1<<PB0); |
24 | SPDR = (adr|0x80); |
25 | while(!(SPSR & (1<<SPIF))); |
26 | SPDR = 0x00; |
27 | while(!(SPSR & (1<<SPIF))); |
28 | PORTB |=(1<<PB0); |
29 | return (SPDR); |
30 | }
|
Ich hoffe ich habe keine Infos vergessen. Falls jemand Zeit hat und einen Blick drüber werfen würde würde mich das sehr freuen. Gruß Andi