mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Bus Programmierung ARM9


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist denn der eine als Master und der andere als Slave konfiguriert ?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jap also das Board ist Master der IC Baustein Slave.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.