Forum: Mikrocontroller und Digitale Elektronik MSP430 Senden eines Bytes via I2C


von Michael (Gast)


Lesenswert?

Guten Abend,

ich habe nun schon einige Projekte auf dem MSP430G2553 realisiert und 
wollte mich nun mal mit I2C befassen. Dazu habe ich die Beispielcodes 
von TI ausprobiert, unter anderem den hier:

1
#include <msp430.h>
2
3
unsigned char TXData;
4
unsigned char TXByteCtr;
5
6
int main(void)
7
{
8
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
9
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
10
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
11
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
12
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
13
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
14
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
15
  UCB0BR1 = 0;
16
  UCB0I2CSA = 0x48;                         // Slave Address is 048h
17
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
18
  IE2 |= UCB0TXIE;                          // Enable TX interrupt
19
20
  TXData = 0x00;                            // Holds TX data
21
22
  while (1)
23
  {
24
    TXByteCtr = 1;                          // Load TX byte counter
25
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
26
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
27
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
28
                                            // Remain in LPM0 until all data
29
                                            // is TX'd
30
    TXData++;                               // Increment data byte
31
  }
32
}
33
34
//------------------------------------------------------------------------------
35
// The USCIAB0TX_ISR is structured such that it can be used to transmit any
36
// number of bytes by pre-loading TXByteCtr with the byte count.
37
//------------------------------------------------------------------------------
38
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
39
#pragma vector = USCIAB0TX_VECTOR
40
__interrupt void USCIAB0TX_ISR(void)
41
#elif defined(__GNUC__)
42
void __attribute__ ((interrupt(USCIAB0TX_VECTOR))) USCIAB0TX_ISR (void)
43
#else
44
#error Compiler not supported!
45
#endif
46
{
47
  if (TXByteCtr)                            // Check TX byte counter
48
  {
49
    UCB0TXBUF = TXData;                     // Load TX buffer
50
    TXByteCtr--;                            // Decrement TX byte counter
51
  }
52
  else
53
  {
54
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
55
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
56
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
57
  }
58
}


Die SDA und SCL Leitungen (P1.6 und P1.7) habe ich mir auf einem 
Oszilloskop angeguckt und festgestellt das lediglich ununterbrochen die 
Slave Addresse (0x48) gesendet wird, aber nicht das zu sendende Byte 
(0x00 ++).

Interpretiere ich da etwas falsch oder muss ich den TI Sourcecode noch 
abändern?

Beste Grüße,
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ist denn auch ein I2C-Slave angeschlossen, der etwas mit den Daten 
anfangen kann? Ohne den (bzw. dessen Antwort, ein ACK) wird nicht mehr 
als das Adressbyte gesendet.

von Michael (Gast)


Lesenswert?

Es ist ein Temperatursensor angeschlossen, der SMBus fähig ist und die 
eingestellte Addresse besitzt. Da der SMBus vom I2C-Bus abgeleitet ist, 
sollte man Ihn mit Hilfe des USCI-Moduls ansprechen können.

Aber der Hinweis ist sehr hilfreich. Gut möglich das beim Ansprechen des 
Sensors was schief geht. Danke!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welcher Sensor genau, und wie genau hast Du den angeschlossen? An 
Pullups gedacht?

von Christopher (Gast)


Lesenswert?

Guten Abend!

Hatte gestern auch das Problem bei dem gleichen Mikrocontroller eine RTC 
über I2C anzusprechen.
Daraufhin habe ich etwas gegooglet und folgende Links für C-Code (Using 
the USCI I2C Master) und entsprechender Anleitung auf der TI-Website 
gefunden:

http://www.ti.com/litv/pdf/slaa382
http://www.ti.com/litv/zip/slaa382

Es müssen nur Kleinigkeiten angepasst werden und die Kommunikation 
funktioniert einwandfrei.

Wie sieht es den Hardware-Seitig aus? Arbeitet der Slave auch mit 3.3V 
oder benutzt du einen Pegelwandler?

Hoffe, die Links können weiterhelfen! :)

von Michael (Gast)


Lesenswert?

Hallo,

erst mal danke für die konstruktiven Hinweise.

Pull-Ups sind auf meiner Platine vorhanden, auch die 3,3 V 
Versorgungsspannung.

Die beiden Links sind sehr hilfreich. Damit hat es funktioniert.

Herzlichen Dank.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein Hinweis zum von Christoper verlinkten Dokument slaa382.pdf:

Die Abbildung "Figure 2" auf Seite 2 ist exakt dieselbe wie "Figure 1" 
und beschreibt daher nicht den "Master Receiver".

Das Dokument scheint in den letzten sieben Jahren auch nicht 
überarbeitet worden zu sein:

Beitrag "Fehler in TI - Beispielprogramm für I2C -Bus (MSP430)?"

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.