Forum: Mikrocontroller und Digitale Elektronik I2C Bus Programmierung ARM9


von Alex (Gast)


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

von Pete K. (pete77)


Lesenswert?

Ist denn der eine als Master und der andere als Slave konfiguriert ?

von Alex (Gast)


Lesenswert?

Jap also das Board ist Master der IC Baustein Slave.

von Heiko (Gast)


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

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.