Gast
#576848
Hallo,
ich nutze einen SPI EEProm, M95256 von ST, an einem ATmega8.
Nun habe ich folgendes Problem:
Ich beschreibe mit folgender C Routine den EEProm mit Daten, die er UART
rein kommen:
// Definition der Leds
//#define ANZAHL_LEDS 8
//#define ANZAHL_LEDS 16
//#define ANZAHL_LEDS 24
//#define ANZAHL_LEDS 32
//#define ANZAHL_LEDS 40
#define ANZAHL_LEDS 48
//#define ANZAHL_LEDS 56
//#define ANZAHL_LEDS 64
// Definition der Bytes pro Spalte
#define ANZAHL_BYTES ( ANZAHL_LEDS / 8 )
void Write_SPI_EEProm (void){
BYTE HighAdress = 0;
BYTE LowAdress = 0;
BYTE Daten[ANZAHL_BYTES];
BYTE i = 0;
while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
if(myReceivedByte==':'){
while(RxBufferStatus()==0);
HighAdress = RxBufferLesen();
while(RxBufferStatus()==0);
LowAdress = RxBufferLesen();
for( i = 0; i < ANZAHL_BYTES; ++i ) {
while(RxBufferStatus()==0);
Daten[i] = RxBufferLesen();
}
//status = Read_EEProm_Status();
//if ( status == 0b00000000 ){
//while(Read_EEProm_Status()!=0);
//while(Read_EEProm_Status()!=0);
cbi(PORTB,0);
spiTransferByte(0b00000110);//write enable WREN
sbi(PORTB,0);
cbi(PORTB,0);
spiTransferByte(0b00000010);//write command
spiTransferByte(HighAdress);//high adresse
spiTransferByte(LowAdress); //low adresse
for( i = 0; i < ANZAHL_BYTES; ++i )
spiTransferByte( Daten[i] );
sbi(PORTB,0);
nop;nop;nop;nop;nop;
// Write disable
cbi(PORTB,0);
spiTransferByte(0b00000100);//write disable WRDI
sbi(PORTB,0);
nop;nop;nop;nop;nop;
while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
if(myReceivedByte==';'){
//Bestätigung schicken
TxDatenSenden('O');
}
}
}
Mit folgender Routine lese ich den EEProm aus, und sende die Daten per
UART an den PC:
void Read_SPI_EEProm (void){
BYTE HighAdress = 0;
BYTE LowAdress = 0;
BYTE Daten[ANZAHL_BYTES];
BYTE i = 0;
while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
if(myReceivedByte==':'){
while(RxBufferStatus()==0);
HighAdress = RxBufferLesen();
while(RxBufferStatus()==0);
LowAdress = RxBufferLesen();
//status = Read_EEProm_Status();
//if ( status == 0b00000000 ){
//while(Read_EEProm_Status()!=0);
cbi(PORTB,0);
spiTransferByte(0b00000011); //read command
spiTransferByte(HighAdress); //high adresse
spiTransferByte(LowAdress); //low adresse
for( i = 0; i < ANZAHL_BYTES; ++i ){
Daten[i] = spiTransferByte(0b00000000);
}
sbi(PORTB,0);
while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
if(myReceivedByte==';'){
//Daten mit "D" ankündigen, PC wartet, bis "D" kommt
TxDatenSenden('D');
for( i = 0; i < ANZAHL_BYTES; ++i )
TxDatenSenden( Daten[i] );
}
}
}
Nun klappt Alles so weit ganz gut.
Das PC Programm erstellt mir eine Datei, mit den Daten : Highadresse,
Lowadresse, EEPromDaten.
Allerdings bekomme ich Fehler, wenn ich 3,5,6,7 Bytes pro Adresse
schreibe.
(Das ich umgekehrt lese, wie schreibe, abe ich schon bemerkt!)
Bei 2 Bytes pro Adresse sieht die Datei des PC Programms beispielweise
so aus (EEPromdaten = 0xFF,0x00):
Schreiben:
W: 0 0 (ÿ );
W: 0 2 (ÿ );
W: 0 4 (ÿ );
W: 0 6 (ÿ );
W: 0 8 (ÿ );
W: 0 10 (ÿ );
W: 0 12 (ÿ );
W: 0 14 (ÿ );
W: 0 16 (ÿ );
W: 0 18 (ÿ );
W: 0 20 (ÿ );
W: 0 22 (ÿ );
W: 0 24 (ÿ );
...
...
Lesen:
R: 0 0 ( ÿ);
R: 0 2 ( ÿ);
R: 0 4 ( ÿ);
R: 0 6 ( ÿ);
R: 0 8 ( ÿ);
R: 0 10 ( ÿ);
R: 0 12 ( ÿ);
R: 0 14 ( ÿ);
R: 0 16 ( ÿ);
R: 0 18 ( ÿ);
R: 0 20 ( ÿ);
R: 0 22 ( ÿ);
R: 0 24 ( ÿ);
...
...
Nun aber bei 6 Bytes bekomme ich folgendes:
(EEPromdaten = 0xFF,0x00,0x00,0x00,0x00,0x00)
Schreiben:
W: 0 0 (ÿ );
W: 0 6 (ÿ );
W: 0 12 (ÿ );
W: 0 18 (ÿ );
W: 0 24 (ÿ );
W: 0 30 (ÿ );
W: 0 36 (ÿ );
W: 0 42 (ÿ );
W: 0 48 (ÿ );
W: 0 54 (ÿ );
W: 0 60 (ÿ );
W: 0 66 (ÿ );
W: 0 72 (ÿ );
W: 0 78 (ÿ );
W: 0 84 (ÿ );
W: 0 90 (ÿ );
W: 0 96 (ÿ );
W: 0 102 (ÿ );
W: 0 108 (ÿ );
W: 0 114 (ÿ );
W: 0 120 (ÿ );
W: 0 126 (ÿ );
W: 0 132 (ÿ );
W: 0 138 (ÿ );
W: 0 144 (ÿ );
W: 0 150 (ÿ );
W: 0 156 (ÿ );
W: 0 162 (ÿ );
W: 0 168 (ÿ );
W: 0 174 (ÿ );
W: 0 180 (ÿ );
W: 0 186 (ÿ );
W: 0 192 (ÿ );
W: 0 198 (ÿ );
W: 0 204 (ÿ );
W: 0 210 (ÿ );
W: 0 216 (ÿ );
W: 0 222 (ÿ );
W: 0 228 (ÿ );
W: 0 234 (ÿ );
W: 0 240 (ÿ );
W: 0 246 (ÿ );
W: 0 252 (ÿ );
W: 1 2 (ÿ );
...
...
Lesen:
R: 0 0 ( ); ??????Wo sind die Daten hin?????
R: 0 6 ( ÿ);
R: 0 12 ( ÿ);
R: 0 18 ( ÿ);
R: 0 24 ( ÿ);
R: 0 30 ( ÿ);
R: 0 36 ( ÿ);
R: 0 42 ( ÿ);
R: 0 48 ( ÿ);
R: 0 54 ( ÿ);
R: 0 60 ( ÿ);
R: 0 66 ( ); ??????Wo sind die Daten hin?????
R: 0 72 ( ÿ);
R: 0 78 ( ÿ);
R: 0 84 ( ÿ);
R: 0 90 ( ÿ);
R: 0 96 ( ÿ);
R: 0 102 ( ÿ);
R: 0 108 ( ÿ);
R: 0 114 ( ÿ);
R: 0 120 ( ÿ);
R: 0 126 ( ð ÿ); ??????Was sind das für Daten?????
R: 0 132 ( ÿ);
R: 0 138 ( ÿ);
R: 0 144 ( ÿ);
R: 0 150 ( ÿ);
R: 0 156 ( ÿ);
R: 0 162 ( ÿ);
R: 0 168 ( ÿ);
R: 0 174 ( ÿ);
R: 0 180 ( ÿ);
R: 0 186 ( ÿ);
R: 0 192 ( ); ??????Wo sind die Daten hin?????
R: 0 198 ( ÿ);
R: 0 204 ( ÿ);
R: 0 210 ( ÿ);
R: 0 216 ( ÿ);
R: 0 222 ( ÿ);
R: 0 228 ( ÿ);
R: 0 234 ( ÿ);
R: 0 240 ( ÿ);
R: 0 246 ( ÿ);
R: 0 252 ( ÿ);
R: 1 2 ( ); ??????Wo sind die Daten hin?????
...
...
Woran kann das liegen?
Hat es etwa etwas mit dem PageWrite des EEProms zu tun?
Liegt es nun am Schreiben, oder am Lesen?
Für etwas Hilfe wäre ich sehr dankbar!
Gruß Toby