Forum: Mikrocontroller und Digitale Elektronik SPI-Poblem MISO erreicht Pegel nicht


von BMA (Gast)


Angehängte Dateien:

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
}

von BMA (Gast)


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...

von BMA (Gast)


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....

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Hast Du technische Daten zu dem Modul? Aktiviere mal den PullUp am MISO 
des Controllers.

von BMA (Gast)


Lesenswert?

Pull up hab ich aktiviert (siehe Programm oben)
oder stimmt der Befehl dafür nicht?

[c]
  DDRB  &=~  (1 << PINB4);        //  MISO  - INPUT
  PORTB  |=  (1 << PINB4);
[-c]

von BMA (Gast)


Lesenswert?

Pull up hab ich aktiviert (siehe Programm oben)
oder stimmt der Befehl dafür nicht?
1
  DDRB  &=~  (1 << PINB4);        //  MISO  - INPUT
2
  PORTB  |=  (1 << PINB4);

hab es auch ohne PullUp versucht geht auhc nicht

von BMA (Gast)


Lesenswert?

Moduldaten

http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=28515&flv=1&bereich=&marke=

Hab es direkt mit 3,3V versorgt und auch mit 5V versucht.
Beides brachte keine Änderung des Ausgangs

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>  Wenn ich mit nem Oszi den MISO messe kriecht der bei 2,1V rum.
Und was misst du mit dem Oszi, wenn du das Modul von uC abklemmst und 
direkt am Modul misst?

von BMA (Gast)


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??

von BMA (Gast)


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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

BMA schrieb:
> U-MISO = 1,5V LOW und 2,1V HIGH
> (keine Signale auf Oszi erkennbar)
Hmmm...
Wie kannst du dann zwischen Low und High unterscheiden?

von BMA (Gast)


Lesenswert?

ja gut LOW und HIGH sind in bei Fall 1 und 2 die falsche Bezeichnung, 
geb ich zu.
Umin und Umax des MISO trifft es eher.... sry

von BMA (Gast)


Lesenswert?

ja gut LOW und HIGH sind bei Fall 1 und 2 die falsche Bezeichnung, geb 
ich zu.
Umin und Umax des MISO trifft es eher.... sry

von ????? (Gast)


Lesenswert?

>Fall 2:
>U Controller = 3,3V
>Uin Sensormodul = 5V

Ist der ATmega328 überhaupt 5V-tolerant bei 3,3V Versorgungspannung?
Es kenn sein das du durch 5V am MISO-Eingang diese zerstört hast.

von (prx) A. K. (prx)


Lesenswert?

????? schrieb:

> Ist der ATmega328 überhaupt 5V-tolerant bei 3,3V Versorgungspannung?

Nein.

> Es kenn sein das du durch 5V am MISO-Eingang diese zerstört hast.

Dann müsste das Modul bei offenem Controller-Pin korrekte Pegel liefert 
- dieser Fall wurde oben schon geklärt, tut es ebensowenig.

von (prx) A. K. (prx)


Lesenswert?

BMA schrieb:

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

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

Gibts irgendwo ein Schaltbild von dem Modul oder Daten der integrierten 
Pegelwandler?

von BMA (Gast)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nochmal: Hast Du zu dem Modul etwas Schriftliches in Druck- oder 
elektronischer Form?!

von BMA (Gast)


Angehängte Dateien:

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.

von BMA (Gast)


Lesenswert?

P.S.: ist eigentlich jemandem am Programm was aufgefallen oder hält das 
eurem Expertenissen stand und ist in Ordnung?

von Controller (Gast)


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 ...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wie hast Du denn den Pin "UPullup" des Moduls oder J1 auf dem Modul 
beschaltet/belötet?

von BMA (Gast)


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....

von BMA (Gast)


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....

von BMA (Gast)


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...

von BMA (Gast)


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!!!!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das lässt ja eigentlich vermuten, dass auf dem ersten Board die 
Pegelwandler einen abbekommen haben. Vielleicht würde es auch hier Sinn 
machen, mal eine Brücke über den/die FET(s) zu löten.

von Marco S. (masterof)


Lesenswert?

Ich habe es auch mit der SPI-Schnittstelle versucht und das problem 
gehabt.

Ich habe es dadurch gelöst das ich auf die I2C-Schnistelle umgestellt 
habe.

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.