mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C-Schnittstelle in Software für MSP 430


Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe einen MSP430FG439 an den ich gerne den BMP085 Drucksensor 
anschließen möchte. Der Sensor hat nur I2C und bei dem yC ist diese 
Schnittstelle nicht in Hardware vorhanden. Somit würde ich diese gerne 
mit Hilfe der Softwarevariante "erzeugen".

http://www.mikrocontroller.net/articles/MSP430_Cod...

Habe dazu die beiden I/Os P3.5 (SCL) und P3.7 (SDA) genommen.
In einem ersten Schritt möchte ich nun den Bus-initialisieren, den 
Sensor durch senden von 0xEE (Adresse + write) ansprechen und dann 
überprüfen, ob das Acknowledgement gessetzt wird.

In der i2c.c Datei steht nun folgendes:
#define SDA       BIT7
#define SCL       BIT5 

#define I2CWAIT wait(0);

/*************************/

static void SetLowSDA()
{
   P3DIR |= SDA;
   I2CWAIT         
}
static void SetHighSDA()
{
   P3DIR &= ~SDA;         
   I2CWAIT
}

static void SetLowSCL()
{
   P3OUT &= ~SCL;
   I2CWAIT
}
static void SetHighSCL()
{
   P3OUT |= SCL;
   I2CWAIT
}
/*************************/
/* To initialize the bus */
/*************************/
void i2cInit()
{
   P3SEL &=  ~SDA;
   P3SEL &=  ~SCL; 

   P3OUT &= ~SCL;   
   P3OUT &= ~SDA;   

   P3DIR |= SCL;    
   P3DIR &= ~SDA;    

   SetHighSCL();
   SetLowSDA(); 
   SetHighSDA();
}

Bei Pegeländerung wird SCL auf high bzw. low gesetzt bleibt jedoch immer 
Output.

Soweit ist mir das alles klar. Jedoch bei SDA wechsele ich zwischen 
Input (SetHighSDA()) bzw. Output (SetLowSDA()). Ich denke, dass dies 
nötig ist um das Acknowledgement abzufragen.

Brauche ich aber nicht noch eine weitere Funktion um die drei 
SDA-Zustände
output low - output high - input
setzen zu können?

Bzw. wäre es nicht logischer in SetLowSDA() den PIN auf input zu setzen, 
da dies ja dann auch einen low Pegel auf der Leitung entspricht?

Würde mich sehr freuen, wenn jemand meine Newbie-Frage hier beantworten 
könnte. Vielen Dank schonmal.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Brauche ich aber nicht noch eine weitere Funktion um die drei
>SDA-Zustände
>output low - output high - input
>setzen zu können?
Das ist nicht nötig wenn SDA-Out immer auf low steht.

D.h. P2OUT &= ~SDA sorgt dafür das beim umschalten auf Out immer gleich 
low anliegt. Wechselst du auf In, geht der Bus immer auf high durch den 
Pull-Up.
Ein aktives High ist nicht nötig und auch gefährlich.

>Bzw. wäre es nicht logischer in SetLowSDA() den PIN auf input zu setzen,
>da dies ja dann auch einen low Pegel auf der Leitung entspricht?
Wieso low? Der Pull-Up am Bus zieht SDA/SCL bei Tri-State immer auf 
high.

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

vielen Dank für die schnelle Antwort, jetzt ist mir die Sache schon 
klarer.

Ist denn der folgende Code für mein main.c korrekt? Habe von der im 
Forum angebotenen i2c.c Version nur die PINs angepasst.
//******************************************************************************
//  MSP430FG439 Demo - Software Test for I2C-BUS
//
//  SDA (P3.7; 36); SCL (P3.5; 38)
//  EOC (P4.5; 16); XCLR (P4.3; 18)
//******************************************************************************

#include <msp430xG43x.h>
#include "i2c.h"
#include "i2c.c"
#include "help.h"
#include "help.c"

//******************************************************************************

void main(void)
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  //define red and yelow LED
  P5DIR |= BIT1;                      // P5.1 output direction yellow
  P1DIR |= BIT0;                      // P1.0 output direction red
  P1OUT &=~ BIT0;                     // P1.0 off red
  P5OUT &=~ BIT1;                     // P5.1 off yellow

  //define EOC and XCLR status
  P4DIR &=~ BIT5;                       // Set P4.5 (EOC) to input direction
  P4DIR |= BIT3;                        // Set P4.3 (XCLR) to output direction
  P4OUT &=~ BIT3;                       // XCLR Low

  //Wait > 10 ms after start-up before first communication
  P1OUT |= BIT0;                       // P1.0 on red
  wait_precise(5000);                  // wait 0,5s
  P1OUT &=~ BIT0;                      // P1.0 off red

  //define SCL and SDA status
  i2cInit();

  //Start
  i2cStart();

  //transmit 1 1 1 0 1 1 1 0 (0xEE)
  int test = 2;
  test = i2cWrite(0xEE);

  //Stop
  i2cStop();

  //Überprüfen ob Acknowledgement gesetzt wird
  if( test == 1 ){         // low SDA = acknowledged
    P5OUT |= BIT1;               // P5.1 on yellow
  }
  if( test == 0 ) {         // high SDA = not acknowledged
    P1OUT |= BIT0;               // P1.0 on red
  }

  __no_operation();              // For debugger
}

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist denn der folgende Code für mein main.c korrekt?
Sehe spontan keine Fehler.

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist, dass der Sensor trotzdem kein Acknowledgement gibt. 
Vielleicht könnt ihr mir ein paar Meinungen zu folgenden 
Fehlermöglichkeiten geben:

1) Anschlusskabel - ca. 20 cm Flachbandkabel?
Laut Spezifikation S. 42 dürfen es wohl nur max. 10 cm sein.

2) Kabel schlecht belegt?
VDD - frei - frei - frei - frei - SCL - EOC - SDA - GND - XCLR

Eigentlich sollte es wie ebenfalls auf S. 42 beschrieben folgende sein:
SDA - VDD - VSS - SCL

http://www.nxp.com/acrobat_download2/literature/93...

3) Der Sensor kann bis 3,4 MHz Takt auf SCL-Line (Beschreibung S. 15)
http://www.bosch-sensortec.com/content/language1/d...

Welche Taktrate sollte ich denn nehmen? Mir würde eigentlich 1 kHz 
reichen. Gibt es da eine Mindestgeschwindigkeit?

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis A. schrieb:
> Das Problem ist, dass der Sensor trotzdem kein Acknowledgement gibt.
> Vielleicht könnt ihr mir ein paar Meinungen zu folgenden
> Fehlermöglichkeiten geben:
>
> 1) Anschlusskabel - ca. 20 cm Flachbandkabel?
> Laut Spezifikation S. 42 dürfen es wohl nur max. 10 cm sein.
>
> 2) Kabel schlecht belegt?
> VDD - frei - frei - frei - frei - SCL - EOC - SDA - GND - XCLR
>
> Eigentlich sollte es wie ebenfalls auf S. 42 beschrieben folgende sein:
> SDA - VDD - VSS - SCL
>
> http://www.nxp.com/acrobat_download2/literature/93...
Ich würde den Fehler nicht in der Verkabelung suchen. Zumindest wenn du 
mit dem Oszi sehen kannst das am IC SDA und SCL korrekt ankommt.


> 3) Der Sensor kann bis 3,4 MHz Takt auf SCL-Line (Beschreibung S. 15)
> 
http://www.bosch-sensortec.com/content/language1/d...
>
> Welche Taktrate sollte ich denn nehmen? Mir würde eigentlich 1 kHz
> reichen. Gibt es da eine Mindestgeschwindigkeit?
Der MSP wird in Software (je nach Takt) kaum über 100-200kHz raus 
kommen. Für einen Bastelaufbau sollte man den Takt auch nicht 
überschreiten. 100kHz ist so die Standard Geschwindigkeit. Langsamer 
geht's aber immer problemlos.

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab kein Oszi, aber wenn ich die Spannung direkt am SMD-Sensor messe, 
dann kommen die Pegel korrekt und deutlich im vorgeschriebenen Bereich 
von <0,2 * VDD für low und >0,8 VDD für high an.

Weiß halt nicht ob es noch Störeinflüsse gibt, die mein digitales 
Multimeter nicht anzeigen kann. Vielleicht weil die Frequenz zu groß 
ist?

Das mit dem 100 kHz hört sich gut an - das ist mehr als ich brauche.

4) Würde es was bringen den EOC (end of conversion - ist ein input an 
den der Sensor high anlegt, wenn er fertig mit seinen Berechnungen ist) 
und den XCLR (ist ein output, der einen Reset des Sensor durchführt) 
nicht anschließen? Könnte auch ohne die beiden leben?

5) Sollte ich SDA mal an P2.0 und SCL an P2.1 anlöten? Dann müsste ich 
nichts mehr an der Software ändern. Aber eigentlich sollten ja P3.7 
(SDA) und P3.5 (SCL) auch funktionieren, da sie nach Datenblatt als 
"General-purpose digital I/O" gekennzeichnet sind. Und ich konnte sonst 
keine anderen verwendeten Funktionalitäten in der Software finden.

http://focus.ti.com/lit/ds/symlink/msp430fg439.pdf

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>4) Würde es was bringen den EOC (end of conversion - ist ein input an
>den der Sensor high anlegt, wenn er fertig mit seinen Berechnungen ist)
>und den XCLR (ist ein output, der einen Reset des Sensor durchführt)
>nicht anschließen? Könnte auch ohne die beiden leben?
Wüsste nicht was das bringen sollte.

>5) Sollte ich SDA mal an P2.0 und SCL an P2.1 anlöten? Dann müsste ich
>nichts mehr an der Software ändern.
Schaden kann es nichts das mal zu probieren.

>Aber eigentlich sollten ja P3.7 (SDA) und P3.5 (SCL) auch funktionieren,
>da sie nach Datenblatt als "General-purpose digital I/O" gekennzeichnet
>sind.
Ja.


Was für Pull-Ups hast du dran (größe)?

Autor: Dennis A. (dennis999)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab auf jeder Leitung 4,7k Widerstände und eine 100 nF 
Entkoppelkapazität.

Zur Verdeutlichung des Aufbaus sind hier der Schaltplan und ein Photo 
von der ganzen Sache.

Vielen Dank, dass du mir hilfst - komme allein einfach nicht weiter.

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt die PINS auf P2.0 und P2.1 getauscht und jetzt funktioniert 
die Sache.

Kanns's mir zwar von der Software her nicht erklären, aber vielleicht 
war es schlecht gelötet - obwohl ich es durchgemessen und mit dem 
Multimeter nichts erkennen konnte.

Werde mich jetzt mal an ein paar Messungen versuchen ;-)

Vielen Dank an alle für die schnelle und professionelle Hilfe.

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.