Forum: Mikrocontroller und Digitale Elektronik MSP430F5438 I2C Problem


von El_Studente (Gast)


Lesenswert?

Hallo, ich versuche schon seit Tagen einen HMC6343 Kompass-Sensor an 
meinen MSP430F5438 per I2c anzuschließen. Leider nur mit mäßigen Erfolg. 
Hauptsächlich hab ich zwei Probleme.

1. Wenn ich Daten mit dem MSP als Master empfangen will, verstehe ich 
nicht so ganz wie ich den Puffer richtig abfragen soll.
Im Moment löse ich es so:
1
    
2
    UCB1CTL1 |= UCTR + UCTXSTT;   //I2C RX,start condition (adresse senden)
3
    __delay_cycles(100);          //Write BIT
4
    UCB1TXBUF = 0x50;          //Befehl welche Daten der Slave senden soll
5
    __delay_cycles(100);
6
    UCB1CTL1 |= UCTXSTP;       // I2C end condition
7
    __delay_cycles(2000);
8
   
9
    UCB1CTL1 &= ~UCTR;
10
            
11
    UCB1CTL1 |= UCTXSTT;   //I2C RX,start condition(adresse senden)    
12
                           //read BIT
13
    MSB = UCB1RXBUF;
14
    
15
    LSB = UCB1RXBUF;
16
 
17
    MSBp = UCB1RXBUF;
18
  
19
    LSBp = UCB1RXBUF;
20
 
21
    MSBr = UCB1RXBUF;
22
23
    UCB1CTL1 |= UCTXSTP; // I2C end condition
24
    LSBr = UCB1RXBUF;

Das schreiben von Befehlen scheint zu funktionieren. Leider weis ich 
nicht, wie ich mit dem MSP den Takt starten kann, sodass der HMC seine 
Daten übertragen kann. Bzw. ein Takt Packet wird immer automatisch 
gestartet, wessen Daten ich auch empfangen kann. Leider muss ich 6 Byte 
hintereinander empfangen.

2. Zieht der HMC ab und zu die Datenleitung auf GND, wodurch der BUS 
natürlich lahmgelegt ist. Die einzige möglichkeit den BUS neuzustarten 
ist, dann die spannungsversorgung des HMC zu treffen...

3. Muss ich unbedingt mit den interrupts arbeiten, die in den Example 
codes von TI benutzt werden, oder kann man das ganze auch ohne zum 
laufen bringen?

Ich wäre euch sehr dankbar, wenn Ihr mir helfen könntet.

Schon mal vielen Dank.
El_Studente

von Jörg S. (joerg-s)


Lesenswert?

>2. Zieht der HMC ab und zu die Datenleitung auf GND, wodurch der BUS
>natürlich lahmgelegt ist. Die einzige möglichkeit den BUS neuzustarten
>ist, dann die spannungsversorgung des HMC zu treffen...
Stop-Bedingung senden sollte eigentlich reichen um die Busteilnehmer 
wieder zu "resetten".

>3. Muss ich unbedingt mit den interrupts arbeiten, die in den Example
>codes von TI benutzt werden, oder kann man das ganze auch ohne zum
>laufen bringen?
Ich weiss nicht wie's beim 5er ist, in der Regel und bei den anderen 
MSPs ist es nicht notwendig.


Vielleicht ist hier:
Beitrag "MSP430F2370 I2C"
oder hier:
Beitrag "Fehlersuche bei I2C [MSP430]; UCBBUSY bleibt gesetzt"
noch was für dich dabei.

von Wolfgang Horn (Gast)


Lesenswert?

Hi,  El_Studente,

ähnliche Schwierigkeiten hatte ich überwunden, als mir klar wurde: Der 
HMC6343 verhält sich auf I2C etwas anders als die bisherigen Chips.
Datenblatt, Seite 11: Table 3 – HMC6343 Command to Response Delay Times: 
Das sind Pausen zwischen den Bytes von Adresse bis Kommando - und den 
Datenbytes, die gelesen oder geschrieben werden.
Der HMC6343 verlangt, dass der Master den I2C-Bus in diesen Pausen zwar 
belegt, aber eine Atempause einlegt.

Cioa
Wolfgang Horn

von el_Studente (Gast)


Lesenswert?

Hallo, was verstehst du unter belegen und atempause. Soll der µC die 
Datenleitung auf GND ziehen aber für die zeit kein Takt kommen?

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.