Structure/Array in Dataflash

Başlatan SpeedyX, 07 Ağustos 2012, 17:37:37

SpeedyX

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;
}

controller

Flash a yazmadan sadece RecordBuffer üzerinden yazma/okuma çalışıyor mu?
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

parda

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;
}

Bildiğim tek şey, hiç bir şey bilmediğimdir.

SpeedyX

#3
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 :)