Ich benutze ein ATtiny84A
folgendes Problem.
Ich Lese immer abwechselnd ein Byte aus dem EEprom und sende dieses über
I2C zum Master. Bei jedem zweiten Aufruf wird nur das ACK vom I2C-Bus
detektiert. Sobald ich an einem Stück mehr als ca. 85 Bytes auslese kann
ich nur durch einen Hardreset das Programm wieder zum laufen bringen.
Ich würde gerne mindestens 128 Bytes über I2C-verschicken können.
Die folgende Funktion wird bei einem USI_OVF Interrupt aufgerufen.
Prallel zum USI_OVF läuft noch ein Timer. Dieser Timer wird am Anfang
des USI_OVF zurückgesetzt. Beim Überlauf wird der I2C Übertragung
resetet und auf den Empfang von neuen Werten vorbereitet. (Hab
irgendwie keine schönere Lösung hierfür gefunden.)
1 | void I2C_SendEepromData(uint8_t Register)
|
2 | {
|
3 | if (eeprom_counter&1) // eeprom_counter is odd
|
4 | {
|
5 | USIDR = 0;
|
6 | USISR = 14;
|
7 | //PORTB ^= (1 << PB1 );
|
8 |
|
9 | }
|
10 | else // eeprom_counter is even Read ACK
|
11 | {
|
12 |
|
13 | eeprom_busy_wait();
|
14 | I2C_DataAck( eeprom_read_byte( cali_ptr + Register +(eeprom_counter >> 1)) , 0);
|
15 | }
|
16 | eeprom_counter++;
|
17 | }
|
kurze Erklärung zu einen Variablen:
cali_ptr: pointer auf ersten EEPROM Speicherplatz
Register: Start-Byte ab dem geschrieben werden soll
eeprom_counter einfacher Zähler
I2C_DataAck gibt Daten auf EEProm aus und setzt den USI Zähler)
Also jemand eine Idee woran es liegen könnte, warum nur ein Teil der
Daten übertragen wird?