Forum: Mikrocontroller und Digitale Elektronik MSP430FR5739 und I2C


von Rush .. (rush)


Lesenswert?

Hallo liebe Leut'

seit ein paar Tagen sitze ich nun an meinem Problem.
Ich besitze ein MSP-EXP430FR5739 Experimentierboard mit dem MSP430FR5739 
uC und möchte das I2C zum Laufen bekommen. Für den Anfang würde ich es 
gerne so einfach wie möglich halten. Der code soll ledigleich die 
Start-Condition gefolgt von der SlaveAdresse und einem 0xFF auf den Bus 
schreiben. Der code tut allerdings nichts! Es tut sich weder auf SDL 
noch auf SCK irgendetwas.

Momentan sieht mein Code so aus:
1
#include <msp430.h> 
2
3
#define HYT_ADR_WRITE 0x28
4
#define HYT_ADR_READ 0x29
5
6
void init_i2c(void);
7
void init_Clocks(void);
8
//void i2c_write_byte(unsigned int, unsigned char);
9
void i2c_write_byte();
10
11
void init_Clocks()
12
{
13
   // Init SMCLK = MCLk = ACLK = 1MHz
14
      CSCTL0_H = 0xA5;
15
      CSCTL1 |= DCOFSEL0 + DCOFSEL1;          // Set max. DCO setting = 8MHz
16
      CSCTL2 = SELA_3 + SELS_3 + SELM_3;      // set ACLK = MCLK = DCO
17
      CSCTL3 = DIVA_3 + DIVS_3 + DIVM_3;      // set all dividers to 1MHz
18
}
19
20
void init_i2c(void)
21
{
22
  UCB0CTL1 |= UCSWRST;  // reset status aktiveren (i2c kann nur so konfigueriert werden)
23
  UCB0CTLW0 |= UCMODE_3 + UCMST; // I2C master mode
24
  UCB0BRW = 0x0008;  // baudrate = SMCLK / 8
25
  UCB0CTLW1 = UCASTP_2;  // autom. STOP assertion
26
27
  P1SEL1 |= BIT6 + BIT7;  // configure I2C pins (device specific)
28
29
  UCB0CTL1 &=~ UCSWRST;  // resetstatus verlassen
30
31
  UCB0IE |= UCTXIE;  // enable TX-interrupt
32
  _BIS_SR(GIE);  // general interrupt enable
33
}
34
35
void i2c_write_byte()
36
{
37
  UCB0TBCNT = 0x01;  // TX 1 bytes of data
38
  UCB0I2CSA = 0x0028;  // address slave is 28hex
39
  UCB0CTLW0 |= UCTR;  // transmit state
40
41
  //UCB0TXBUF = 0xFF;
42
  UCB0CTLW0 |= UCTXSTT;  //generate Startcondition
43
44
  while ((UCB0STATW & UCBBUSY) != 0x00){}
45
  UCB0TXBUF = 0xFF;
46
}
47
48
int main(void) {
49
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
50
    P1REN |= BIT6 + BIT7;
51
    init_Clocks();
52
    init_i2c();
53
    i2c_write_byte();
54
  
55
  return 0;
56
}

Die init_i2c(void) ist aus dem Beispiel im Datenblatt übernommen.
Die i2c_write_byte(void) habe ich laut Kapitel 20.3.5.2.1 I²C Master 
Transmitter Mode und unter Zuhilfenahme des Codes aus dem Thread [[I2C 
mit MSP430FR5739 ACK wird nicht gesetzt]] selbst geschrieben.
Laut Debugger bleibt der Controller bei der while-Schleife hängen. Bis 
dahin müsste allerdings wenigstens die Startkondition rausgegangen sein, 
was allerdings nicht der Fall ist.

Mir stellt sich auch die Frage ob den externe Pullups im I2C-Mode 
zwingend erforderlich sind oder ob das USCI-Modul bei Aktivierung der 
I2C-Einheit automatisch die internen Pullups einschaltet.

Laut LogicAnalyzer ändern sich nämlich die Pegel der mit
1
P1REN |= BIT6 + BIT7;
konfigurierten Pullups nicht. Ist das so korrekt? Sie bleiben immer auf 
LOW.

Könnte eventuell jeman den Code bei sie ausprobieren und mir Feedback 
geben? Das wäre wirklich super....

Danke euch schonmal im Voraus.

MfG Konrad

von Norbert M. (Gast)


Lesenswert?

Rush ... schrieb:
> Mir stellt sich auch die Frage ob den externe Pullups im I2C-Mode
> zwingend erforderlich sind oder ob das USCI-Modul bei Aktivierung der
> I2C-Einheit automatisch die internen Pullups einschaltet.

Externe Pullups sind notwendig, weil die internen lt. Kapitel 8.2 im 
Family Guide nur dann verwendbar sind, wenn der Betriebsmodus Digital 
"I/O" ist. Wenn USCI aktiviert ist, dann ist das aber kein "Digital I/O" 
mehr, deshalb sagt 20.3 im FUG auch ganz explizit:
"Both SDA and SCL are bidirectional and must be connected to a positive 
supply voltage using a pullup resistor."
Macht auch Sinn, denn der interne Pullup hat lt. Datasheet typisch 35 
kOhm, typisch nimmt man für I2C jedoch 4k7.

> Laut LogicAnalyzer ändern sich nämlich die Pegel der mit
> P1REN |= BIT6 + BIT7 konfigurierten Pullups nicht.
> Ist das so korrekt? Sie bleiben immer auf LOW.

Vermutung: Solange das Peripheriemodul USCI aktiviert ist, ist es ihm 
egal, was Du in PxREN reinschreibst, kümmert ihn nicht, da nicht 
"Betriebsart Digital I/O".

> Könnte eventuell jeman den Code bei sie ausprobieren und mir Feedback
> geben? Das wäre wirklich super....

Mit dem Code kenne ich mich leider nicht aus, erstens verstehe ich C 
noicht wirklich großartig, zweitens bin ich generell Anfänger und 
drittens hab' ich mit dem MSP430 real noch nie was gemacht, hab' nur vor 
ein paar Wochen mal ein paar Datasheets überflogen. Und jetzt 
nachgeguckt :-)

LG, NOR

PS: Alles ohne Gewähr, hab' ich mir nur auf die schnelle 
zusammengereimt.

von Rush .. (rush)


Lesenswert?

Hi und danke für deine Antwort....

So genau hatte ich auch nicht ins Datenblatt geschaut. Aber
1. hat die Software von meinem LA rumgsponnen was die Abtastrate anging.
   Bin dann irgendwann alle möglichen Abtastfrequenzen durchgegangen und 
sieh da, es kommt was zu erwarten war, grrrrr....

und 2. Ich habe die Pullupinitialisierung vor die Aktivierung des I2C 
Moduls geschrieben und der Bus funktioniert.

Denke mal das TI reinschreibt dass es nicht funktioniert weil sie 
einfach keine Gewähr übernehmen möchten. Wenn läuft hat man Glück...

MfG Konrad

von holger (Gast)


Lesenswert?

>Denke mal das TI reinschreibt dass es nicht funktioniert weil sie
>einfach keine Gewähr übernehmen möchten. Wenn läuft hat man Glück...

Genau so ist es. Kein Mensch der I2C kennt nimmt 35k als
Pullup. Schon gar nicht bei 3.3V. Wenn man sich die Flanken
auf einem Osci ansieht weiss man auch warum. Papp dir
da auf jeden Fall mal 1k5 Pullups dran. Sonst bekommst
du Probleme wenn du auch mal mit 400kHz Takt auf dein I2C gehst.

von Rakete (Gast)


Lesenswert?

Hallo,

insbesondere für Anfänger interessant: http://energia.nu/

Das ist die Arduino-IDE für die Launchpads. Damit kann man zumindest 
ganz einfach mal prüfen, ob es an der Hard- oder an der Software liegt, 
weil die Beispiele funktionieren ganz gut.

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.