Forum: Mikrocontroller und Digitale Elektronik BMA020 SPI-Probleme


von Andi (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Als erstes würde ich mal alle anderen lasten am SPI Bus abklemmen. Dann 
würde ich die Signalpegel mit einem Oszilloskop prüfen.

Am Lego Mindstorms funktionierte das Modul bei mir erst nach 
Modifikation. Die primitive Pegelwandler Schaltung hatte keine sauberen 
Low-Pegel geliefert.

Wenn Du den Mikrocontroller mit 3,3V betreibst, kannst Du die 
Pegelwandler entfernen, denn der Bosch Chip hat 3,3V tolerante I/O Pins. 
Dann musst Du dich natürlich von den 20Mhz verabschieden oder auf einen 
Xmega wechseln.

von Andi (Gast)


Lesenswert?

Hab auf die schnelle mal gemessen. Hab nur ein analoges Oszi.

hab auf dem SDO nach den Pegelwandlern nur noch 2,5 V.
Das wirds wohl sein.

Das Signal sah auch nicht besonders gut aus und das bei nur ~70kHz 
Busfrequenz.

von Andi (Gast)


Lesenswert?

Habs schon rausgefunden UPULLUP muss beschalten werden.
Werd jetzt mal testen wie schnell ich komme.
Danke Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.