Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: I2C Funktion Kategorie: I²C-Bus (von Robert - 30.06.2010 15:05)
Als Antwort auf I2C Funktion von Jenny - 30.06.2010 11:50
Ich nutze:
C-Control Pro Mega128
Hallo,

1.) Was meinst du mit "adresse"? Bei dem I2C-Bus hat jedes Device eine Adresse (die ersten 4 Bit),
dann 3 Bit f├╝r die interne Adressierung (das werden dann die Register vermutlich adressiert) und ein
letztes Bit f├╝r Read/Write (also ob du lesen oder schreiben willst). Kurz: y=Ger├Ąt, x=register, b=Zugriff:
yyyyxxxb = Erstes gesendet Paket nach Start-Kondition.
2.) "data" sind die Daten (das Byte), die/das ins EEPROM geschrieben wird.
3.) ">>" ist ein Bitschiebeoperator. Ein Register im diesem EEPROM wird anscheinend ├╝ber ein Word
(2 Byte) adressiert. Da man das nicht auf einmal schicken kann, wird erst das h├Âherwertige Byte
zuerst geschickt, dann das niederwertige.
Mehr Infos zu >> und << in der Hilfe.

Ich hoffe, ich konnte helfen.

P.S.: Du musst unterscheiden zwischen der Adresse auf dem I2C-Bus (erstes geschriebens Byte) und
der Adresse im EEPROM ("address").

> Hallo an alle,
>
> ich m├Âchte eine Beschleunigungssensor (BMA150) mit meinem PRO BOT128 verbinden und
> anschlie├čend die Register des Sensore auslesen.
>
> Das ganze soll ├╝ber I2C laufen.
>
> Nun habe ich den Aufbau, Funktion usw. der I2C SChnittstelle theoretisch verstanden,
> aber die Probleme sind nun bei der Umsetzung, sprich bei der Programmierung.
>
> Dazu habe ich das Handbuch von C-Control durchforstet und bin auf ein Beispiel gesto├čen:
>
> I2C Beispiel Seite 159
>
> >Beispiel: EEPROM 24C64 lesen und schreiben ohne I2C_Status Abfrage
> >
> >main(void)
> >{
> >>word address;
> >>byte data,EEPROM_data;
> >>
> >>address=0x20;
> >>data=0x42;
> >>
> >>I2C_Init(I2C_100kHz );
> >>// write data to 24C64 (8k x 8) EEPROM
> >>
> >>I2C_Start();
> >>I2C_Write(0xA0); // DEVICE ADDRESS : A0
> >>I2C_Write(address>>8); // HIGH WORD ADDRESS
> >>I2C_Write(address); // LOW WORD ADDRESS
> >>I2C_Write(data); // write Data
> >>I2C_Stop();
> >>
> >>AbsDelay(5); // delay for EEPROM Write Cycle
> >>
> >>// read data from 24C64 (8k x 8) EEPROM
> >>
> >>I2C_Start();
> >>I2C_Write(0xA0); // DEVICE ADDRESS : A0
> >>I2C_Write(address>>8); // HIGH WORD ADDRESS
> >>I2C_Write(address); // LOW WORD ADDRESS
> >>I2C_Start(); // RESTART
> >>I2C_Write(0xA1); // DEVICE ADDRESS : A1
> >>EEPROM_data=I2C_Read_NACK();
> >>I2C_Stop();
> >>Msg_WriteHex(EEPROM_data);
> >}
>
> 1.) Kann ich adresse im Programm gleichsetzten mit der Adresse meines Registers?
> 2.) Entspricht data im Programm, meine Gr├Â├če des Registers z.B. 2 bit?
> 3.) address>>8 verstehe ich nicht
>
> Ist zeimlich viel geschrieben sorry, hoffe aber Ihr k├Ânnt mir nen kleinen Tipp geben.
> Vielen Dank im Voraus.
>
> Gru├č Jenny


    Antwort schreiben


Antworten: