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


von Dennis A. (dennis999)


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_Codebeispiele#I2C.2FTWI_in_Software

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:
1
#define SDA       BIT7
2
#define SCL       BIT5 
3
4
#define I2CWAIT wait(0);
5
6
/*************************/
7
8
static void SetLowSDA()
9
{
10
   P3DIR |= SDA;
11
   I2CWAIT         
12
}
13
static void SetHighSDA()
14
{
15
   P3DIR &= ~SDA;         
16
   I2CWAIT
17
}
18
19
static void SetLowSCL()
20
{
21
   P3OUT &= ~SCL;
22
   I2CWAIT
23
}
24
static void SetHighSCL()
25
{
26
   P3OUT |= SCL;
27
   I2CWAIT
28
}
29
/*************************/
30
/* To initialize the bus */
31
/*************************/
32
void i2cInit()
33
{
34
   P3SEL &=  ~SDA;
35
   P3SEL &=  ~SCL; 
36
37
   P3OUT &= ~SCL;   
38
   P3OUT &= ~SDA;   
39
40
   P3DIR |= SCL;    
41
   P3DIR &= ~SDA;    
42
43
   SetHighSCL();
44
   SetLowSDA(); 
45
   SetHighSDA();
46
}

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.

von Jörg S. (joerg-s)


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.

von Dennis A. (dennis999)


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.
1
//******************************************************************************
2
//  MSP430FG439 Demo - Software Test for I2C-BUS
3
//
4
//  SDA (P3.7; 36); SCL (P3.5; 38)
5
//  EOC (P4.5; 16); XCLR (P4.3; 18)
6
//******************************************************************************
7
8
#include <msp430xG43x.h>
9
#include "i2c.h"
10
#include "i2c.c"
11
#include "help.h"
12
#include "help.c"
13
14
//******************************************************************************
15
16
void main(void)
17
{
18
  // Stop watchdog timer to prevent time out reset
19
  WDTCTL = WDTPW + WDTHOLD;
20
21
  //define red and yelow LED
22
  P5DIR |= BIT1;                      // P5.1 output direction yellow
23
  P1DIR |= BIT0;                      // P1.0 output direction red
24
  P1OUT &=~ BIT0;                     // P1.0 off red
25
  P5OUT &=~ BIT1;                     // P5.1 off yellow
26
27
  //define EOC and XCLR status
28
  P4DIR &=~ BIT5;                       // Set P4.5 (EOC) to input direction
29
  P4DIR |= BIT3;                        // Set P4.3 (XCLR) to output direction
30
  P4OUT &=~ BIT3;                       // XCLR Low
31
32
  //Wait > 10 ms after start-up before first communication
33
  P1OUT |= BIT0;                       // P1.0 on red
34
  wait_precise(5000);                  // wait 0,5s
35
  P1OUT &=~ BIT0;                      // P1.0 off red
36
37
  //define SCL and SDA status
38
  i2cInit();
39
40
  //Start
41
  i2cStart();
42
43
  //transmit 1 1 1 0 1 1 1 0 (0xEE)
44
  int test = 2;
45
  test = i2cWrite(0xEE);
46
47
  //Stop
48
  i2cStop();
49
50
  //Überprüfen ob Acknowledgement gesetzt wird
51
  if( test == 1 ){         // low SDA = acknowledged
52
    P5OUT |= BIT1;               // P5.1 on yellow
53
  }
54
  if( test == 0 ) {         // high SDA = not acknowledged
55
    P1OUT |= BIT0;               // P1.0 on red
56
  }
57
58
  __no_operation();              // For debugger
59
}

von Jörg S. (joerg-s)


Lesenswert?

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

von Dennis A. (dennis999)


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/9398/39340011.pdf

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

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

von Jörg S. (joerg-s)


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/9398/39340011.pdf
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/downloads/BST-BMP085-DS000-05.pdf
>
> 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.

von Dennis A. (dennis999)


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

von Jörg S. (joerg-s)


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

von Dennis A. (dennis999)


Angehängte Dateien:

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.

von Dennis A. (dennis999)


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.

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.