mikrocontroller.net

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


Autor: BMA (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!!



//Pins
# define SENS_CLK_PIN    (13)         //  13=PB5 CLK
# define SENS_MISO_PIN    (12)        //  12=PB4 MISO
# define SENS_MOSI_PIN    (11)        //  11=PB3 MOSI

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


char tmp[1];


void Sens_writeSPI(uint8_t data);
uint8_t Sens_readSPI(uint8_t data);
void RESET(void);


uint8_t Sens_readSPI(uint8_t data)
{  
  PORTD ^= ( 1 << PIND1 );    // TOGGLE LED---------------------------------------------------------------
  
  SPDR = data;   //read-command
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}
    
    
void Sens_writeSPI(uint8_t data)
{  
  SPDR = data;  //write-command
  while(!(SPSR & (1<<SPIF)));
  return;
}

      
//------------ PROGRAMMABLAUF ----------
      
void loop()
{
while(1)
{
  uint8_t temp[23];
  
//  Register auslesen
  SPCR =   SPCR | (1<<CPHA);
  
  PORTD &=~  (1<<PIND0);          //CS-Sensor Enable
  
  Sens_writeSPI(0x00 | 0x80);        // Erstes Register ab dem gelesen wird.  rw-bit = 1 
  
  temp[0]    = Sens_readSPI(0x00);    // Datenregister des Sensors
  temp[1]    = Sens_readSPI(0x01);    // Datenregister des Sensors
  temp[2]    = Sens_readSPI(0x02);    // Datenregister des Sensors
  temp[3]    = Sens_readSPI(0x03);    // Datenregister des Sensors
  temp[4]    = Sens_readSPI(0x04);    // Datenregister des Sensors
  temp[5]    = Sens_readSPI(0x05);    // Datenregister des Sensors
  temp[6]    = Sens_readSPI(0x06);    // Datenregister des Sensors
  temp[7]    = Sens_readSPI(0x07);    // Datenregister des Sensors
  temp[8]    = Sens_readSPI(0x08);    // Datenregister des Sensors
  temp[9]    = Sens_readSPI(0x09);    // Datenregister des Sensors
  temp[10]  = Sens_readSPI(0x0a);    // Datenregister des Sensors
  temp[11]  = Sens_readSPI(0x0b);    // Datenregister des Sensors
  temp[12]  = Sens_readSPI(0x0c);    // Datenregister des Sensors
  temp[13]  = Sens_readSPI(0x0d);    // Datenregister des Sensors
  temp[14]  = Sens_readSPI(0x0e);    // Datenregister des Sensors
  temp[15]  = Sens_readSPI(0x0f);    // Datenregister des Sensors
  temp[16]  = Sens_readSPI(0x10);    // Datenregister des Sensors
  temp[17]  = Sens_readSPI(0x11);    // Datenregister des Sensors
  temp[18]  = Sens_readSPI(0x12);    // Datenregister des Sensors
  temp[19]  = Sens_readSPI(0x13);    // Datenregister des Sensors
  temp[20]  = Sens_readSPI(0x14);    // Datenregister des Sensors
  temp[21]  = Sens_readSPI(0x15);    // Datenregister des Sensors

  PORTD |= (1<<PIND0);      //CS-Sensor Disable
  delay(1);
  
  SPCR =   SPCR & ~(1<<CPHA);
  
  PORTD ^= ( 1 << PIND2 );    // TOGGLE LED---------------------------------------------------------------
    }
    
}


void RESET(void)
{
  PORTD &=~  (1<<PIND0);    //CS-Sensor Enable
  delay(10);
  Sens_writeSPI(0x0A | 0x2);
  delay(100);
  PORTD |= (1<<PIND0);
}
      
void setup()
{

  DDRD  |=  (1 << PIND1);        //OUTPUT FÜR LED1
  DDRD  |=  (1 << PIND2);        //OUTPUT FÜR LED2
  
  DDRD  |=  (1 << PIND0);        //CS-Sensor
        
  DDRB  |=  (1 << PINB2);        //  /SS    - OUTPUT
  DDRB  |=  (1 << PINB3);        //  MOSI  - OUTPUT
  DDRB  &=~  (1 << PINB4);        //  MISO  - INPUT
  PORTB  |=  (1 << PINB4);
  DDRB  |=  (1 << PINB5);        //  SKC    - OUTPUT
  
  // SPI Clock 16MHz/2
  SPCR = (1<<SPE) | (1<<MSTR);       //enable SPI, Master, clk=Fcpu/4
  SPSR = (1<<SPI2X);           //clk=Fcpu*2
  
  //INIT SENSOR
  PORTD &=~  (1<<PIND0);          //CS-Sensor Enable
  delay(10);
  Sens_writeSPI(0x15 & 0x7F);        // Erstes Register ab dem gelesen wird.  rw-bit = 1 
  Sens_writeSPI(0b10000000);  
  delay(100);
  PORTD |= (1<<PIND0);          //CS-Sensor Disable

}

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: BMA (Gast)
Datum:

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

hab es auch ohne PullUp versucht geht auhc nicht

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moduldaten

http://www.elv.de/output/controller.aspx?cid=74&de...

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ????? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: BMA (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: BMA (Gast)
Datum:

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

Autor: Controller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: BMA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.