I2C Bus Programmierung ARM9

Gast #946961
Lesenswert?

Hallo,

Ich bin neu hier und habe auch schon nach der Problemlösung hier im 
Forum gesucht aber leider nichts gefunden.
Das Problem ist folgendes, ich benutze ein STR912F Board der Firma Hitex 
auf dem ein ARM9 Prozessor läuft, dieser hat zwei I2C Busse.
Die µP Beinchen sind alle auf Pinleisten rausgeführt und ich habe die 
zwei Busse miteinander verbunden.

Nun möchte ich eigentlich nicht viel mehr machen als Daten von dem einen 
Bus zum anderen schicken (dient nur als Test, in der Zukunft soll er 
einen DAC ansteuern der einen I2C Bus als Eingang besitzt).
Dies funktioniert aber überhaupt nicht. Also Programmiersprache fungiert 
C und ich habe bisher folgendes:

I2C_DeInit(I2C0);
I2C_DeInit(I2C1);

I2C_Cmd(I2C0, ENABLE);
I2C_Cmd(I2C1, ENABLE);

I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_OwnAddress = 0x7F;
I2C_InitStructure.I2C_GeneralCall = I2C_GeneralCall_Disable;
I2C_InitStructure.I2C_CLKSpeed = 100000;

I2C_Init(I2C0, &I2C_InitStructure);

I2C_InitStructure.I2C_OwnAddress = 0x00;

I2C_Init(I2C1, &I2C_InitStructure);

I2C_GenerateStart(I2C0, ENABLE);
I2C_GenerateStart(I2C1, ENABLE);

I2C_Send7bitAddress(I2C0, 0x00, I2C_MODE_TRANSMITTER);

I2C_SendData(I2C0, 0xFF);
test = I2C_ReceiveData(I2C0);
Delay(0x7FFFFF);
test = I2C_ReceiveData(I2C0);
Delay(0x7FFFFF);
test = I2C_ReceiveData(I2C1);

Wäre super wenn mal jemand von euch drüber schauen könnte, da ich 
langsam am verzweifeln bin...
Vielen Dank schonmal im Voraus!

Gruß Alex
Gast #952379
Lesenswert?

Hallo Alex,

auf dem Evalboard von Hitex ist auch Temperatursensor LM75 zum Test der 
I2C Funktion.

Hier ein Beispiel zum auslesen der Temperatur (12bit):

void I2C_Temp_Read_2Byte (u8 ADDRESS)
{
  // wait for conversion
     u32 k = 0x00FFFFFF;
     while (k-->0);

  //I2C Interface ready?
     I2C_CheckEvent(I2C0, I2C_FLAG_BUSY );

  //Start bit
     I2C_GenerateStart(I2C0, ENABLE);

  //Next check EV5:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT) );

  //Send address
    I2C_Send7bitAddress(I2C0,ADDRESS,I2C_MODE_TRANSMITTER);

  //Next check EV6:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECTED) );

  //Write I2Cn_CR register TWICE with PE=1
    I2C_Cmd (I2C0, ENABLE);

  //Next check EV8:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  //Send data Pointer Byte
    I2C_SendData(I2C0,0x00);

  //Next check EV8:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  //I2C Interface ready?
    I2C_CheckEvent(I2C0, I2C_FLAG_BUSY);

  // Start bit
    I2C_GenerateStart(I2C0, ENABLE);

  //Next check EV5:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT) );

  //Send address
    I2C_Send7bitAddress(I2C0, ADDRESS, I2C_MODE_RECEIVER);

  //Next check EV6:
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECTED) );

  //Write I2Cn_CR register TWICE with PE=1
    I2C_Cmd (I2C0, ENABLE);

  //Next check EV7
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED));

  //Read MSB Byte
    TEMP_HIGH_WERT = I2C_ReceiveData(I2C0);

  //Next check EV7
    while(!I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED));

  //Stop bit
    I2C_GenerateSTOP (I2C0, ENABLE);

  //Read LSB Byte
    TEMP_LOW_WERT = I2C_ReceiveData(I2C0);


Wie sind denn Deine GPIO konfiguriert?
SCU_APBPeriphClockConfig(__I2Cx ,ENABLE)?

Schau mal noch im Support Forum bei STM vorbei:
http://www.st.com/mcu/modules.php?name=Splatt_Forums

Gruss Heiko

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