PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Bus zu langsam?



stevensen
26.12.2005, 12:21
Frohe Weihnachten,

mein Grafik-Display habe ich am Laufen, ausserdem habe ich ein paar Grafiken in einem 24c256 EEprom abgelegt. Diese Daten möchte ich natürlich auslesen und darstellen, was auch funktioniert, nur eben zu langsam. Ich benutze einen Mega 8. Der I2C-delay steht auf 1. Gibt es eine Möglichkeit das Auslesen zu beschleunigen! Nützt eine Verdopplung des Systemtakts auf 16 Mhz was, oder ist der I2c unabhängig?

linux_80
26.12.2005, 13:02
Hallo,
da musst Du ins Datenblatt von deinem Speicher schauen, wie schnell der kann, der Mega ist normalerweise schnell genug.

Welche Geschwindigkeit möchstest Du am I2C haben 100 oder 400kBit/s ?
Bei 400 sollten es 16MHz sein, bei 100 reichen die 8MHz.
Es nutzt aber nix wenn Du 400k beim Mega einstellst und er Speicher das nicht kann, da gehts trotzdem nicht schneller.

Hellmut
26.12.2005, 16:22
Hallo stevensen

Es gibt auch die Möglichkeit ein EEPROM-Bauteil mit parallelem Datenbus, also z.B. 4-Bit zu benutzen. Dann kann man den Daten- und Steuerbus an Pins des mega8 anschliessen. Ich kenne deine Anwendung nicht, wenn du aber einen Bidirektionalen Bustreiber mit Enable benutzt könntest du die Pins auch weiterhin anderweitig verwenden!

Ratber
26.12.2005, 17:55
Alternativ Flash am SPI.

128K im So8 gibts schon für ca. 1.60 Euroen und geht bis 20 Mhz Takt.

Das sollte reichen

stevensen
27.12.2005, 12:11
Danke, für die Antworten!!
Im Datenblatt zum 24c256 steht, dass er mit verschiedenen Frequenzen abhängig von der Spannung arbeitet kann. Rein rechnerisch müßte er viel schneller sein, ich mache wahrscheinlich grundsätzlich was falsch. Ein Bild braucht 504 Bytes, um es auszulesen und darzustellen braucht der Mega8 2-3 sekunden! Das ist doch viel zu langsam, oder? Wie sieht den ein schneller Code aus?
ich benutze folgenden um jeweils 1 byte auszulesen und auf dem Lcd darzustellen und alles mal 504:

Sub Read_eeprom(byval Adres Word , Value As Byte)
Temp = High(adres)
Temp2 = Low(adres)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Temp
I2cwbyte Temp2 'address of EEPROM

I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
Waitms 10
End Sub

Ratber
27.12.2005, 13:03
Die Taktbegrenzung auf 100Khz gilt nur für eine Versorgung unter 2.7V und wenn du das Teil im Automotiven Temperaturbereich betreibst (Also anwendungen im Kfz wo es mal Frierz oder Kocht)

Für eine Modell gilt dieser Spannungsbereich nicht und ich denke mal das bei dir auch keine extremen Temperaturen auftreten also läufts für dich mit 400 Khz.

Allerdings halte ich 2-3 Sekunden für 504 Byte auch etwas lang.

Bist du icher das der Takt bei dir auch korrekt läuft ?

Config I2Cdelay richtig eingestellt ?

IngBo
31.12.2005, 15:28
Hi,

wenn du aber alle 504 Bytes hintereinder ausliest, dann gänge es bestimmt schneller.

z.b. (ich kenne aber diese Sprache nicht...!!!!)
Sub Read_eeprom(byval Adres Word , Value As Byte(sollte ein Array sein)???, Count As Word)
Temp = High(adres)
Temp2 = Low(adres)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Temp
I2cwbyte Temp2 'address of EEPROM

I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)

for-schleife i = 0 bis Count - 2 (502)
I2crbyte Value[i] , ack 'read byte

wenn fertig dann noch mal auslesen
I2crbyte Value[503] , Nack 'read byte

I2cstop 'generate stop
Waitms 10
End Sub


Ingbo

stevensen
03.01.2006, 16:33
Hallo,

danke für die Antworten, ich habs hingekriegt. Der Pseudocode hats gebracht, ich hatte vorher die wartezeit von 10 ms mal weggenommen, das Lesen ging auch ohne und sehr viel schneller. Das Beispiel war dann noch schneller. Also danke! =D>