Merhabalar,
Çözemediğim bir konu var, fikrinizi almak istiyorum.
Aşağıdaki kodda bir struct ve bir de 2 boyutlu dizi değişkenim var, bunları AT45DB161D adlı flash chipine yazıp okuyorum. Ancak kullandığım kopyalama yönteminde bir sorun var sanırım ki yazdığım şeyi okumuyorum.
Oysa program FlashTest rutininden TRUE döndürerek çıkıyor, yani flash fonksiyonlarında sorun yok sanıyorum.
Derleyici keil uVision4
Ne önerirsiniz?
typedef union
{
u8 b8[4];
u16 b16[2];
u32 b32;
} un;
typedef struct
{
u8 _a;
u8 _b;
un _c[4];
un _d[4][3];
un _e[4];
un _f[4];
} StorDat;
StorDat _Per;
un _Vals[50][4];
U8 RecordBuffer[1000];
void WriteRecord(U8 RecType)
{
U32 len, faddr;
switch(RecType)
{
case 0:
{
memcpy(RecordBuffer,&_Per,sizeof(_Per));
len = sizeof(_Per);
faddr = 0;
}
break;
case 1:
{
memcpy(RecordBuffer,&_Vals,sizeof(_Vals));
len = sizeof(_Vals);
faddr = 0x400;
}
break;
default: return;
}
WriteFlash(faddr, RecordBuffer, len);
}
void ReadRecord(U8 RecType)
{
U32 len, faddr;
switch(RecType)
{
case 0: len = sizeof(_Per); faddr = 0; break;
case 1: len = 50*4*4/*sizeof(_Vals)*/; faddr = 0x400; break;
default: return;
}
ReadFlash(faddr, RecordBuffer, len);
switch(RecType)
{
case 0:
{
memcpy(&_Per,RecordBuffer,sizeof(_Per));
}
break;
case 1:
{
memcpy(&_Vals,RecordBuffer,sizeof(_Vals));
}
break;
}
}
boolean FlashTest(u32 FlashTestArea, u16 tlen)
{
u32 i;
// #define FlashTestArea 0x200000
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0x55;
WriteFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0x00;
ReadFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
if(RecordBuffer[i] != 0x55)
break;
if(i<tlen)
return FALSE;
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0xAA;
WriteFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0x00;
ReadFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
if(RecordBuffer[i] != 0xAA)
break;
if(i<tlen)
return FALSE;
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0xFC;
WriteFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
RecordBuffer[i] = 0x00;
ReadFlash(FlashTestArea, RecordBuffer, tlen+1);
for(i=0;i<tlen;i++)
if(RecordBuffer[i] != 0xFC)
break;
if(i<tlen)
return FALSE;
return TRUE;
}
Flash a yazmadan sadece RecordBuffer üzerinden yazma/okuma çalışıyor mu?
Vaktiyle şöyle bişey yapmışım (avr gcc )bu kısmı çalışıyor eminim sadece hata kontrol kısmı eksikti.
belki fikir verir.
typedef struct
{
unsigned Tip :1;
unsigned KanalNo :5;
unsigned Saat :5;
unsigned Dakika :6;
unsigned Gun :5;
unsigned Ay :4;
unsigned Yil :5;
unsigned Direnc :9;
}LogData_t;
...
char SaveLog(LogData_t *stLog)
{
uint8_t *cpByte;
uint32_t lAdr;
cpByte = (uint8_t *)stLog;
lAdr = ReadLastDFAdres();
DataFlashWrite(lAdr++,*(cpByte+4));
DataFlashWrite(lAdr++,*(cpByte+3));
DataFlashWrite(lAdr++,*(cpByte+2));
DataFlashWrite(lAdr++,*(cpByte+1));
DataFlashWrite(lAdr++,*(cpByte));
DataFlashWrite(lAdr++,0xFF);
WriteLastDFAdres(lAdr);
return 0;
}
Bu kod çalışıyor. Demekki benim flash kodunda sorun var... Onunla da flash a yazdığımı okuyabiliyorum
char RecordBuffer[1023];
for(reg = 0; reg < 50; reg++)
{
_Vals[reg][0].b32 = 0x03;
_Vals[reg][1].b32 = 0x03;
_Vals[reg][2].b32 = 0x03;
_Vals[reg][3].b32 = 0x03;
}
memset(RecordBuffer,0x00,sizeof(RecordBuffer));
memcpy(RecordBuffer,&_Vals,sizeof(_Vals));
memcpy(&_Vals,RecordBuffer,sizeof(_Vals));
EDIT:
Herzamanki gibi alakasız birşeyden çıktı problem, unutulmuş bir kod parçacığı başlangıçta flashı sıfırlıyor :)