Probleme mit i2c beim msp430f5438 und digipoti

Gast #1320050
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
}
#1320340
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.
Gast #1320362
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.
#1320481
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren