Picproje Elektronik Sitesi

BİLGİSAYAR => Donanım ve Yazılım => Konuyu başlatan: SpeedyX - 07 Ağustos 2012, 17:37:37

Başlık: Structure/Array in Dataflash
Gönderen: SpeedyX - 07 Ağustos 2012, 17:37:37
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;
}
Başlık: Ynt: Structure/Array in Dataflash
Gönderen: controller - 07 Ağustos 2012, 18:19:18
Flash a yazmadan sadece RecordBuffer üzerinden yazma/okuma çalışıyor mu?
Başlık: Ynt: Structure/Array in Dataflash
Gönderen: parda - 07 Ağustos 2012, 18:26:18
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;
}

Başlık: Ynt: Structure/Array in Dataflash
Gönderen: SpeedyX - 08 Ağustos 2012, 09:03:13
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 :)