SPI-Poblem MISO erreicht Pegel nicht

Gast #1957830
Lesenswert?

Hey Leute,

mein Problem ist, dass ich einen 3D-Beschleunigungssensormodul von ELV 
mit dem Mikrocontroller auslesen will.
Eigentlich will ich damit messen, aber ich bekomme am MISO keine 
richtigen Signale. Wenn ich mit nem Oszi den MISO messe kriecht der bei 
2,1V rum.
Sobald ich dann Daten an den Sensor sende bzw empfangen will geht er auf 
1,6V runter.

Zur Hardware:
Sensor:         BMA020 von BST
Sensmodul:      ELV 3D Beschleunigungssensor mit SPI Schnittstelle
Controller:     ATMega328p (Seeduino V2.2 Board)

Software:
Programmer´s Notepad

Verdrahtung wurde mehrfach geprüft und ist definitiv richtig!! :)
Außerdem hab ich das gleiche Problem schon letzte woche gehabt, als ich 
mit dem Seeduino S65-Display Shield ne SD-Karte auslesen wollte.
MISO Pegel hat das Level nicht erreicht.

Daher meine Frage:
Hab ich den Controller irgendwie gegrillt oder stimmt mein Code nicht?
Ich bin noch nicht wirklich erfahren was die Programmierung angeht. Wäre 
daher cool, wenn jemand mal den Code anschauen könnte.

Danke schon mal im Voraus!!



1
//Pins
2
# define SENS_CLK_PIN    (13)         //  13=PB5 CLK
3
# define SENS_MISO_PIN    (12)        //  12=PB4 MISO
4
# define SENS_MOSI_PIN    (11)        //  11=PB3 MOSI
5

6
# define SENS_CS_PIN    ( 0)         
7
# define SENS_CS_ENABLE()  PORTD |=  (1<<0)  //  PB2->1
8
# define SENS_CS_DISABLE()  PORTD &= ~(1<<0)  //  PB2->0
9

10

11
char tmp[1];
12

13

14
void Sens_writeSPI(uint8_t data);
15
uint8_t Sens_readSPI(uint8_t data);
16
void RESET(void);
17

18

19
uint8_t Sens_readSPI(uint8_t data)
20
{  
21
  PORTD ^= ( 1 << PIND1 );    // TOGGLE LED---------------------------------------------------------------
22
  
23
  SPDR = data;   //read-command
24
  while(!(SPSR & (1<<SPIF)));
25
  return SPDR;
26
}
27
    
28
    
29
void Sens_writeSPI(uint8_t data)
30
{  
31
  SPDR = data;  //write-command
32
  while(!(SPSR & (1<<SPIF)));
33
  return;
34
}
35

36
      
37
//------------ PROGRAMMABLAUF ----------
38
      
39
void loop()
40
{
41
while(1)
42
{
43
  uint8_t temp[23];
44
  
45
//  Register auslesen
46
  SPCR =   SPCR | (1<<CPHA);
47
  
48
  PORTD &=~  (1<<PIND0);          //CS-Sensor Enable
49
  
50
  Sens_writeSPI(0x00 | 0x80);        // Erstes Register ab dem gelesen wird.  rw-bit = 1 
51
  
52
  temp[0]    = Sens_readSPI(0x00);    // Datenregister des Sensors
53
  temp[1]    = Sens_readSPI(0x01);    // Datenregister des Sensors
54
  temp[2]    = Sens_readSPI(0x02);    // Datenregister des Sensors
55
  temp[3]    = Sens_readSPI(0x03);    // Datenregister des Sensors
56
  temp[4]    = Sens_readSPI(0x04);    // Datenregister des Sensors
57
  temp[5]    = Sens_readSPI(0x05);    // Datenregister des Sensors
58
  temp[6]    = Sens_readSPI(0x06);    // Datenregister des Sensors
59
  temp[7]    = Sens_readSPI(0x07);    // Datenregister des Sensors
60
  temp[8]    = Sens_readSPI(0x08);    // Datenregister des Sensors
61
  temp[9]    = Sens_readSPI(0x09);    // Datenregister des Sensors
62
  temp[10]  = Sens_readSPI(0x0a);    // Datenregister des Sensors
63
  temp[11]  = Sens_readSPI(0x0b);    // Datenregister des Sensors
64
  temp[12]  = Sens_readSPI(0x0c);    // Datenregister des Sensors
65
  temp[13]  = Sens_readSPI(0x0d);    // Datenregister des Sensors
66
  temp[14]  = Sens_readSPI(0x0e);    // Datenregister des Sensors
67
  temp[15]  = Sens_readSPI(0x0f);    // Datenregister des Sensors
68
  temp[16]  = Sens_readSPI(0x10);    // Datenregister des Sensors
69
  temp[17]  = Sens_readSPI(0x11);    // Datenregister des Sensors
70
  temp[18]  = Sens_readSPI(0x12);    // Datenregister des Sensors
71
  temp[19]  = Sens_readSPI(0x13);    // Datenregister des Sensors
72
  temp[20]  = Sens_readSPI(0x14);    // Datenregister des Sensors
73
  temp[21]  = Sens_readSPI(0x15);    // Datenregister des Sensors
74

75
  PORTD |= (1<<PIND0);      //CS-Sensor Disable
76
  delay(1);
77
  
78
  SPCR =   SPCR & ~(1<<CPHA);
79
  
80
  PORTD ^= ( 1 << PIND2 );    // TOGGLE LED---------------------------------------------------------------
81
    }
82
    
83
}
84

85

86
void RESET(void)
87
{
88
  PORTD &=~  (1<<PIND0);    //CS-Sensor Enable
89
  delay(10);
90
  Sens_writeSPI(0x0A | 0x2);
91
  delay(100);
92
  PORTD |= (1<<PIND0);
93
}
94
      
95
void setup()
96
{
97

98
  DDRD  |=  (1 << PIND1);        //OUTPUT FÜR LED1
99
  DDRD  |=  (1 << PIND2);        //OUTPUT FÜR LED2
100
  
101
  DDRD  |=  (1 << PIND0);        //CS-Sensor
102
        
103
  DDRB  |=  (1 << PINB2);        //  /SS    - OUTPUT
104
  DDRB  |=  (1 << PINB3);        //  MOSI  - OUTPUT
105
  DDRB  &=~  (1 << PINB4);        //  MISO  - INPUT
106
  PORTB  |=  (1 << PINB4);
107
  DDRB  |=  (1 << PINB5);        //  SKC    - OUTPUT
108
  
109
  // SPI Clock 16MHz/2
110
  SPCR = (1<<SPE) | (1<<MSTR);       //enable SPI, Master, clk=Fcpu/4
111
  SPSR = (1<<SPI2X);           //clk=Fcpu*2
112
  
113
  //INIT SENSOR
114
  PORTD &=~  (1<<PIND0);          //CS-Sensor Enable
115
  delay(10);
116
  Sens_writeSPI(0x15 & 0x7F);        // Erstes Register ab dem gelesen wird.  rw-bit = 1 
117
  Sens_writeSPI(0b10000000);  
118
  delay(100);
119
  PORTD |= (1<<PIND0);          //CS-Sensor Disable
120

121
}
Angehängte Dateien:
Gast #1957833
Lesenswert?

Sorry verschrieben.

Das Seeduino Board ist das hier:
Seeeduino V328 mit einem ATMega 328p

Hab die Schaltung allerdings auch mit dem
Seedunio V2.12 (ATmega168) gestestet.

= gleiches Ergebnis MISO
auch ändern zwischen Hard und Software SPI hat nichts gebracht...
Gast #1957840
Lesenswert?

und nochmal was....  :-)
SPI-CLK funktioniert richtig (Level und Timing)
MOSI    Funktioniert ebenfalls richtig.

und falls sich jemancd wundert Funktion Sens_ReadSPI(`REGISTER`)
hab ich nur so aufgerufen um es für mich übersichtlicher zu halten.
aber ist ja eh wurscht was da drin steht....
Gast #1958073
Lesenswert?

Wenn ich den MISO trenne messe ich 2,1V
Wenn ich dann auch noch den MOSI und den CLK mache genau das gleiche
Uin liegt bei 5V

ok ich hab den Controller nun mit 5V betrieben und nun bekomm ich 
Signale.
Ob es die richtigen sind check ich nach dem mittag....
Aber laut Modulbeschreibung kann es doch mit 3-6 Volt betrieben 
werden....
oder hab ich das falsch verstanden??
Gast #1958170
Lesenswert?

So hab nun mal ein bischen mehr gemessen....

Das Controllerboard lässt sich zwischen 3,3V und 5V hin und her 
schalten, darauß erhalte ich 4 Fälle:

Fall 1:
U Controller = 3,3V
Uin Sensormodul = 3,3V
U-MOSI = 3,3V
U-MISO = 1,5V LOW und 2,1V HIGH (keine Signale auf Oszi erkennbar)

Fall 2:
U Controller = 3,3V
Uin Sensormodul = 5V
U-MOSI = 3,3V
U-MISO = 1,5V LOW und 2,1V HIGH (keine Signale auf Oszi erkennbar)

Fall 3:
U Controller = 5V
Uin Sensormodul = 5V
U-MOSI = 5V
U-MISO = 0V LOW und 2V HIGH (mit internen PullUp am MISO AUS)
         UND *2,5V* *"Ruhepegel"* (wenn keine Kommunikation auf dem 
SPI-Bus)

Fall 4:
U Controller = 5V
Uin Sensormodul = 5V
U-MOSI = 5V
U-MISO = 0V LOW und 2V HIGH (mit internen PullUp am MISO EIN)
         UND *3,1V* *"Ruhepegel"* (wenn keine Komunikation auf dem 
SPI-Bus)
Gast #1958271
Lesenswert?

Es kamen am MISO nie 5V an.
und ich habe Anfangs ja "nur" mit 3,3V gearbeitet und das gleiche 
Ergebnis erhalten.
Fall 1 mit dem Seeduino V328 [ATmega328p] und zwei Seeduino V2.12 
[ATmega168] gestestet.


Irgendwo "frisst" mir das sch*** Sensormodul 3 V weg....
Und ich hab keine Ahnung warum....
Das Modul ist intern mit Bidirektionalen Pegelwandlern ausgestattet.
Also kann man es mit 2,5 bis 5V betreiben. Sofern das Teil nicht von 
Anfang an defekt war, wovon ich mittlerweile ausgehe.
Gast #1958522
Lesenswert?

A. K. schrieb

>Wie verhält sich der Pin bei 10K Pullup und Pulldown? Die gemessenen
>Pegel riechen ja eher nach offenem Pin als nach einem Logikpegel.

auch schon Probiert bringt nichts....
Liegt also am Modul und nicht am Controller.


BTW die Signale, die er in Fall 3 und 4 liefert sind richtig...
nur eben der Pegel zu gering.... (2V)
never ever ELV... :-)

Zu den Daten...
Im Anhang ist alles was ich zu dem Modul hab.
Von ELV hab ich nur die paar Blatt Papier....
Datenblatt des Sensors hab ich auch mal mit rein.
Angehängte Dateien:
Gast #1958567
Lesenswert?

Hallo,

wo ist der Modul-Pin "U_pullup" bei dir angeschlossen? Dieser muss zur 
korrekten Funktion der internen Modul-Pegelwandler an der 
Versorgungsspannung des Controllers angeschlossen sein (3.3V oder 5V). 
Sonst funktionieren die Pegelwandler nicht, und es liegt nur etwa die 
interne Chip-Versorgungsspannung (2.5V - Spannung Body-Diode) an den 
Pins an ...
Gast #1959114
Lesenswert?

ähm... naja ich muss zugeben garnicht...
denn Laut der "Anleitung" Seite 4 (Siehe PDF 4 oben)
Bim 3- und 4-Draht SPI den Pin nicht anschließen....
hab mich blauäugig drauf verlassen, dass die Leute in der Anleitung 
richtige Schaltpläne drucken....
Gast #1959132
Lesenswert?

Guten Morgen alle zusammen!

Also Upullup des Moduls angeschlossen an:

1.: 3,3V (Controller auf gleicher Spannung betrieben)
Ergebnis:
>1,5V LOW und 2,1V HIGH (keine Signale auf Oszi erkennbar)
          (Fall 1 & 2)

2.: 5V  (controller auf gleicher Spannung)
Ergebnis:
>U-MISO = 0V LOW und 2V HIGH (mit internen PullUp am MISO EIN)
>UND *3,1V* *"Ruhepegel"* (wenn keine Komunikation auf dem
           (Fall 4)

ich löt mal den Jumper an und versuchs nochmal....
Gast #1959269
Lesenswert?

So das wars jetzt.... :-)
Ich nehm nen anderen.
Danke an alle für die Hilfe!

Jumper hab ich verlötet hat auch nichts gebracht (egal ob bei 3,3 oder 
5V)
gleiches Spiel bei "Upullup"
bei Uin und am ganzen SPI-Bus.....
Entweder ich bekomm am Ausgang ein undefinierbares "Zappeln" oder er 
läuft eben mit nem Ruhepegel von 2,5 oder 3 V sobald aber was gesendet 
wird (egal in welcher Richtung) bricht der MISO auf 2V ein.

Fall jemand doch ne Idee hat wäre ich dankbar...
Aber ich mach mich mal an einen anderen Sensor dran...
Gast #1959327
Lesenswert?

Um zum Abschluss zu kommen....

Verwende jetzt BMA150 (Nachfolger vom BMA020)
alles GENAU gleich* bis auf:
BMA150 auf Shuttleboard von BST und NICHT BMA020 auf ELV-Board

Auf dem BST-Board ist nichts drauf außer 2 Kondensatoren und 28 Pins... 
:-)

Sensor direkt mit VDD und VDDIO an 3,3V, SPI-4 an Controller und Oszi 
angeschlossen und es geht alles...

Achso das Shuttleboard ist eigentlich für dieses Modul:

http://www.digikey.com/pt/en/ph/Bosch/ApplicationBoard.html

Falls es einen Interesiert..

Danke nochmals!!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren