Forum: Mikrocontroller und Digitale Elektronik Probleme mit i2c beim msp430f5438 und digipoti


von bingo (Gast)


Lesenswert?

Hallo, ich versuche ein digitales POti ad5241 per i2c von einem 
msp430f5438 anszusteuern. Ich nutze dazu einen beispielcode von ti.
Es schein als kommt kein ack. Wenn ich am Pin den takt Oszillografieren 
moechte, dann geht diese bei einer Start Condition auf low und sonst 
nix. Also ich kann da dann keinen takt erkennen. Die SDA bleibt auf 
high. jemand ne idee?
1
P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0
2
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
3
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
4
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
5
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
6
  UCB0BR1 = 0;
7
  UCB0I2CSA = 88;                         // Slave Address is 088
8
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
9
  UCB0IE |= UCTXIE;                         // Enable TX interrupt
10
11
  TXByteCtr = sizeof TxData;              // Load TX byte counter
12
13
  while (1)
14
  {
15
    __delay_cycles(50);                     // Delay required between transaction
16
    PTxData = (unsigned char *)TxData;      // TX array start address
17
                                            // Place breakpoint here to see each
18
                                            // transmit operation.
19
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
20
21
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0, enable interrupts
22
    __no_operation();                       // Remain in LPM0 until all data
23
                                            // is TX'd
24
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
25
26
27
#pragma vector = USCI_B0_VECTOR
28
__interrupt void USCI_B0_ISR(void)
29
{
30
  switch(__even_in_range(UCB0IV,12))
31
  {
32
  case  0: break;                           // Vector  0: No interrupts
33
  case  2: break;                           // Vector  2: ALIFG
34
  case  4: break;                           // Vector  4: NACKIFG
35
  case  6: break;                           // Vector  6: STTIFG
36
  case  8: break;                           // Vector  8: STPIFG
37
  case 10: break;                           // Vector 10: RXIFG
38
  case 12:                                  // Vector 12: TXIFG
39
    if (TXByteCtr)                          // Check TX byte counter
40
    {
41
      UCB0TXBUF = *PTxData++;               // Load TX buffer
42
      TXByteCtr--;                          // Decrement TX byte counter
43
    }
44
    else
45
    {
46
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
47
      UCB0IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag
48
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
49
    }
50
  default: break;
51
  }
52
}

von Jörg S. (joerg-s)


Lesenswert?

Was macht denn die Software? Bleibt er im Interrupt hängen? Oder wird 
der Interrupt erst gar nicht aufgerufen? Was sagt das Statusregister im 
Fehlerfall?

>Es schein als kommt kein ack.
So wie du es schreibst, kommt noch nicht mal die Startbedingung korrekt 
raus. SDA müsste VOR SCL auf low gehen.

von bingo (Gast)


Lesenswert?

Es funktioniert jetzt, allerdings mit dem Phaenomen, dass ich die Slave 
Adresse um 1 Bit nach rechts schiften muss. Habs einfach mal 
ausprobiert, wieso weiss ich gar nicht ;). Verrechnet hab ich mich auch 
nicht bei der darstellung der Adresse eine 01011000 duerfte eine 0x58 
bzw. eine 88 sein.
Hatte jemand schonmal das selbe? Vielleicht hab ich nur vergessen ein 
Bit zu setzen? Ich find aber nix, hab schon alles dreimal durchgesehen.

von Johnny (Gast)


Lesenswert?

Manchmal wird das unterste Adressbit als Read/Write-Bit verwendet, 
vielleicht hat es mit dem zu tun.

von bingo (Gast)


Lesenswert?

Wird es hier auch aber es ist dann ja immer noch das erste Byte, also 
die Slave-Adresse, die auch enthaelt ob gelesen oder geschrieben werden 
soll

von Jörg S. (joerg-s)


Lesenswert?

>Hatte jemand schonmal das selbe? Vielleicht hab ich nur vergessen ein
>Bit zu setzen? Ich find aber nix, hab schon alles dreimal durchgesehen.
Das ist Normal. Bei Hardware I2C wie bei dem MSP ist es i.d.R. immer so 
das man die Slave Adresse komplett OHNE R/W Bit angibt.
Aus der 01011000 (0x58) wird dann also 00101100 (0x2C).

von bingo (Gast)


Lesenswert?

Aha, das wusste ich nicht, danke

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.