@ Michael Z. (incunabulum)
>Ich versuche gerade, für ein externes I2C-Eeprom, block-read und
>block-write zu implementieren. Byteweises schreiben & lesen
>funktioniert. Nur hapert es jetzt am C :-)
>So sieht es im Main aus:
>u16 value = 16;
>i2cEepReadBlock(eepAddr, 20, 2, &value);
>Aufbauend auf den Methodendefinitionen der avr-libcs (eeprom_read_block
>+ write) sieht meine ReadBlock methode aus wie folgt:
>void i2cEepReadBlock(u08 i2cAddr, u32 memAddr, u16 sizebytes, void *pData) {
>// I2C Kram + 1. Adresse setzen
>for (u08 i = 0; i < sizebytes; i++) {
> u08 tmp = i2cReadDataByte(I2C_ACK);
> *pData[i] = tmp;
>}
>i2cReadDataByte(I2C_NACK);
>}
>In der for-Schleife lese ich nacheinander (auto-increment mode) die
>entsprechenden Bytes. Diese sollen nun byteweise nacheinander in der
>Variable "value" im Main geschrieben werden.
Na das ist ein wenig sinnlos, da kannst du ja gleich einzelne Bytes
lesen und ausgeben. Der Sinn von Blockzugriffen ist ja, dass man mehrere
Bytes transportiert. Und dazu reichen einfache variablen nciht aus, du
brauchst ein Array.
u16 value[16];
Dann natürlcih der Aufruf mit
i2cEepReadBlock(eepAddr, 20, 2, value);
Ohne Adrerssoperator vor value, denn bei Arrays ist der Name bereits ein
Zeiger!
>Nur wie? Pointer sind nicht meine Stärke. Der Compiler meckert
Na dann solltest du mal schleunigst die Grundlagen nachholen.
>jedenfalls über "'void*' is not a pointer-to-object type". Und da muss
>ich zur Zeit noch passen...
Du würfelst ja auch einiges durcheinander. Ein einfaches
pData[i] = tmp;
ist hier vollkommen ausreichend. Durch den Index wird schon
referenziert.
Ausserdem hast du noch einen kleinen logischen Bug drin. Du musst
in der Schleife ein Byte weniger lesen als per Funktionsaufruf
gefordert,
for (u08 i = 0; i < (sizebytes-1); i++) {
damit dann der letzte Zugriff den I2C Bus abschliesst (mit NAK). Und
dann natürlich ein STOP auf dem I2C Bus.
MFG
Falk
Nochmal alles auf einen Blick
//Main
u16 value[16]; // 16 Byte Array
i2cEepReadBlock(eepAddr, 20, 2, value);
void i2cEepReadBlock(u08 i2cAddr, u32 memAddr, u16 sizebytes, void
*pData) {
// I2C Kram + 1. Adresse setzen
for (u08 i = 0; i < (sizebytes-1); i++) {
pData[i] = i2cReadDataByte(I2C_ACK);
}
i2cReadDataByte(I2C_NACK);
// I2C STOP
}