Forum: Mikrocontroller und Digitale Elektronik I2C-Hardware Modul MSP430-Lib


von mgiaco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich Versuche eine I2C-Treiber für das Hardware Modul des
MSP430F16x zu schreiben. Es funktioniert auch schon etwas. Das Problem
ist, wenn ich zum Beispiel folgendes schreiben, das ich immer nur das
HighByte von einem LM75 bekomme.

i2c_start(SLAVE1);

temp0 = i2c_readAck();
lcd_puts_int(temp0,0,1);

temp1 = i2c_readAck();
lcd_puts_int(temp1,0,2);

Als o hier zum Bsp.:

23
23

und nicht

23
128 oder so was!

Das Problem liegt mit sicherheit bei der Libary, vielleich kann mir
jemand mal weiterhelfen. ==> ich habe schon einige zeit gebraucht bis
ich überhaupt das bekommen habe.

Das Ziel ist es, eine Lib zu schreiben die wie die vom AVR(Lib von
Peter Fleury) funktioniert.

Dadurch kann ich dan meine alten c und h files von diversen Sensoren
auch auf dem MSP verwenden.

Besten Dank im Voraus

mfg mathias

von mgiaco (Gast)


Lesenswert?

Hat den noch niemand von hier das Hardware I2C Modul des msp430f1611
verwendet?

mathais

von supergrobi (Gast)


Lesenswert?

Bei TI gibts ein Beispiel zur Ansteuerung eines EEProms mit dem Hardware
I²C und F169 vielleicht hilft das weiter ?

such mal nach slaa208

gruß
Thomas

von mgiaco (Gast)


Lesenswert?

Danke, Das kenne ich schon, aber ich möchte es ohne Innterrupts
realisieren. Ich hoffe ich bekomms hin.

mfg mathias

von Martin Schneider (Gast)


Angehängte Dateien:

Lesenswert?

Ich benutze am F1611 die nachfolgenden Routinen, klappt bei mir
sehr gut (IIC-Inteface für EEPROM und CMOS-Kamera)
(main ist ein bißchen gekürzt)

von mgiaco (Gast)


Lesenswert?

Danke, aber ich suche eine Lösung mit dem Hardware I2C ->Module welches
die F15x und F16x Serie hat.

mfg mathias

von Martin Schneider (Gast)


Lesenswert?

Sorry, hatte ich überlesen.
Ich muß leider kompatibel zum F149/F169 bleiben,
daher die SW-Lösung.

von mgiaco (Gast)


Lesenswert?

Hallo, ich komme nicht weiter mit dem I2C Bus. Die Beispiele von TI
kenne ich, aber die lesen zum Beispiel bei dem DAC alle 3Bytes in einer
Funktion. Wenn ich auch msb und lsb in einer einzigen Funktion lese,
geht das auch so zum Bsp.:

void i2c_read(void) {

 while (I2CBUSY & I2CDCTL);  // wait for i2C ready
 i2c_readInit();             // set to readMode
 I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST, SP
 while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
    msb = I2CDRB;
 while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
    lsb = I2CDRB;
}

Aber ich möchte wenns geht Byte für Byte mit einer Funktion lesen.

Also
init
start
high = i2c_readAck();
low  = i2c_readNak();
stop

Die readNak() funktioniert auch aber die readAck nicht, hat niemand
sowas schonmal gemacht?


Hier noch die restlichen Funktionen.

void i2c_init(void){
  P3SEL |= 0x0A;  // select module function for the used I2C pins
  P3DIR &= ~0x0A; // select ports for I2C function

  U0CTL |= I2C+SYNC;     // (1) Select I2C mode with SWRST=1
  U0CTL &= ~I2CEN;       // (2) disable the I2C module

  I2CTCTL = I2CSSEL_2+I2CRM;  // byte mode, repeat mode
  I2CPSC = 0x02;       // I2C clock = clock source/I2CPSC
                       // für 8MHz Quarz / (3+1) ==> 2MHz
  I2CSCLH = 0x08;      // SCL high period = (8+2)*I2C clock
                       // 1/2MHz ==> 0.5µSec * 10 => 5µSec
  I2CSCLL = 0x08;      // SCL low period  => wie I2CSLH
                    // SCL Low, 5µSec + SCL High, 5µSec = 10µSec
                    // ==> 1/10µSec = 100kHz I2C Clock

  I2CIFG = 0;
}

unsigned char i2c_start(unsigned char address) {

    //I2CNDAT = 0x01;       // I2C Data count (one byte)
    I2CSA = address;      //set I2C Slave Address
    U0CTL |= I2CEN;       // (4) set I2CEN via software

    return 0;
}

static void i2c_readInit(void){
  // Initialization of the I2C Module for Read operation.
  U0CTL |= MST;           // define Master Mode
  I2CTCTL &= ~I2CTRX;     // I2CTRX=0 => Receive Mode (R/W bit = 1)
  I2CIFG &= ~TXRDYIFG;    // clear Receive Data ready
  //I2CIE = RXRDYIE;      // enable Receive ready interrupt
}

unsigned char i2c_readNak(void) {

  while (I2CBUSY & I2CDCTL);  // wait for i2C ready
  i2c_readInit();             // set to readMode
  I2CTCTL |= I2CSTT + I2CSTP; // I2CRM =0; Receive, ST,STP

  while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
    return I2CDRB;
}

unsigned char i2c_readAck(void) {

  while (I2CBUSY & I2CDCTL);  // wait for i2C ready
  i2c_readInit();             // set to readMode
  I2CTCTL |= I2CSTT ; // I2CRM =0; Receive, ST

  while((I2CIFG & RXRDYIFG) != RXRDYIFG); // wait for Data Ready
    return I2CDRB;
}


@Martin Danke nochmal, was machst du eigentlich mit einer CMOS-Kamera
am msp? Bildverarbeitung?


Besten Dank im Voraus

mfg mathias

von Martin Schneider (Gast)


Lesenswert?

Hmmm, vielleicht ist das read_init() zuviel?
(Bei mehreren aufeinanderfolgenden Bytes...)

Und: Ja, so eine Art Bildverarbeitung.
Es geht um eine einfache optische Zeichenerkennung.

Ahoi, Martin

von Muhammad F. (Firma: Uni-duisburg) (fari01f)


Lesenswert?

hallo Mathias
hier ist Fari
ich schreibe auch ein API. Ich benutze MSP430F169 ich muss data seb´nden 
und empfangen duch Baustein DS2482( i2c to 1-Wire bridge). wenn du code 
hast oder irgendwelche beispiel hast kannst bitte per email schiken
frsn74@hotmail.com

Ich benutze IAR workbench.
MFG
Fari

von Muhammad F. (Firma: Uni-duisburg) (fari01f)


Lesenswert?

Hello,
I have a Problem i m using MSP430F169 as i2c Master and Bridge 
DS2482-100 as Slave and as 1-Wire master. After that I am using DS1923 
temp Sensor. I am new in this embedded field thats why I just want to 
know If I send Read ROM Command 0x33. How I could Read ths Uniquie  ID 
of  iButton [02(MSB) 00 00 00 02 E1 93 41(LSB)]...I  dont know, how will 
be I sure that I get this Uniquie ID.
tahnks

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.