سلام.
من دارم روی یک مداری کار میکنم که از طریق پورت سریال کامپیوتر یک سری داده به مدار بفرسته و مدار اون هارو روی mmc ذخیره کنه. و مدار این قابلیت رو داره که همون داده هارو از روی mmc میخونه و به کامپیوتر ارسال میکنه . برنامه کامپیوترشم نوشتم که قابلیت دریافت و ارسال رو هم داشته باشه.
مدار هم شامل atmega8 با کریستال داخلی 8 , و قسمت mmc رو هم از lf33 استفاده کردم واسه تغذیه و از پورتکل spi استفاده میکنم. مدار کاملا درست کار میکنه فقط چندتا مشکل به وجود میاد در اجرای برنامه.
1.وقتی میخوام در سکتورهای بالا مثلا 500,000 به بالا داده ای بنویسم دو حالت پیش میاد.
1-1 : عملیات موفقیت آمیزه >> ولی mmc در خواندن همون سکتور به مشکل میخوره و اررور میده ، و باید مدارو ریست کنیم چون دگ نه چیزی میشه نوشت نه خوند ، ولی مدار ریست میشه میتونیم بنویسیم.
1-2 : mmc نمیتونه بنویسه.
2.وقتی با کامپیوتر داده هارو از طریق یک حلقه به مدار ارسال میکنم (40 خط داده : از سکتور 0 تا 39)، فقط تا سکتور 10 مینویسه و بقیه سکتور ها رو نا دیده میگیره.. و داده های 10 تا 20 حلقه رو مینویسه... یعنی سکتور 0تا10 داده های 10 تا 20 حلقه....
در ارسال ها و دریافت داده در سکتور های پایین مثلا سکتور های 10000 به پایین هیچ مشکلی نیست.
گاهی پیش میاد وقتی مدار ارور میده دادهایی که قبلا نوسته شده تغییر میکنه مثلا میشه : acxsij23oi4?@#$?# یه همچین چیزی......
از رم sd و 1 گیگ ،
از کتاب خونه mmc.h با کمی تغییرات استفده میکنم :
#include <spi.h>
#include <delay.h>
#define CS_0 PORTB.4 = 0
#define CS_1 PORTB.4 = 1
#define OK PORTB.0 = 0
#define WR PORTB.1 = 1
#define ER PORTB.0 = 1
#define RD PORTB.1 = 0
//char str[5];
int res;
unsigned long int MMC_ADR;
unsigned char MMC_Buffer[512];
char Command(char befF, unsigned int AdrH, unsigned int AdrL, char befH )
{
CS_0;
spi(0xFF);
spi(befF);
spi((char)(AdrH >> 8));
spi((char)AdrH);
spi((char)(AdrL >> 8));
spi((char)AdrL);
spi(befH);
spi(0xFF);
return spi(0xFF);
}
char MMC_Init(void) {
char i;
DDRB = 0x2F;
PORTB = 0xFF;
delay_us(10);
PORTB = 0x00;
SPCR=0x50;
SPSR=0x01;
RD ;
OK;
CS_1;
for(i=0; i < 100; i++)
spi(0xFF);
CS_0;
if( Command(0x40,0,0,0x95) != 1)
{
ER;
printf("#init fail"
;
return 0;
}
do
{
res = Command(0x41,0,0,0xFF);
spi(0xFF);
ER;
}while(res != 0);
OK;
return 1;
}
char Write_MMC(unsigned long int N)
{
unsigned int i;
char c;
MMC_ADR = N;
MMC_ADR *= 512;
WR;
OK;
res = Command(0x58,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
if (res !=0)
{
printf("#512 mode"
;
ER;
return 0;
}
spi(0xFF);
spi(0xFF);
spi(0xFE);
for (i=0;i<512;i++)
spi(MMC_Buffer[i]);
spi(0xFF);
spi(0xFF);
c = spi(0xFF);
c &= 0x1F;
if (c != 0x05)
{
ER;
printf("#Write faild"
;
return 0;
}
i=0;
while(spi(0xFF) != (char)0xFF);
{
if(++i>5000)
{
ER;
printf("#busy"
;
return 0;
}
}
OK;
return 1;
}
char Read_MMC(unsigned long int N)
{
unsigned int i;
MMC_ADR = N;
MMC_ADR *= 512;
RD;
res = Command(0x51,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
if (res != 0)
{
printf("#read faild"
;
ER;
return 0;
}
i = 0;
while(spi(0xFF) != (char)0xFE)
{
if(++i==10000){
ER;
printf("#time out"
;
return 0;
}
delay_us(100);
}
for(i=0; i < 512; i++)
MMC_Buffer[i] = spi(0xFF);
OK;
return 1;
}
اگه کمک کنین ممنون میشم. و خیلی دوس دارم بدونم چطور میشه حجم رم رو با کد بدست آورد و چطور همه سکتور هارو پاک کرد.
مرسی.
من دارم روی یک مداری کار میکنم که از طریق پورت سریال کامپیوتر یک سری داده به مدار بفرسته و مدار اون هارو روی mmc ذخیره کنه. و مدار این قابلیت رو داره که همون داده هارو از روی mmc میخونه و به کامپیوتر ارسال میکنه . برنامه کامپیوترشم نوشتم که قابلیت دریافت و ارسال رو هم داشته باشه.
مدار هم شامل atmega8 با کریستال داخلی 8 , و قسمت mmc رو هم از lf33 استفاده کردم واسه تغذیه و از پورتکل spi استفاده میکنم. مدار کاملا درست کار میکنه فقط چندتا مشکل به وجود میاد در اجرای برنامه.
1.وقتی میخوام در سکتورهای بالا مثلا 500,000 به بالا داده ای بنویسم دو حالت پیش میاد.
1-1 : عملیات موفقیت آمیزه >> ولی mmc در خواندن همون سکتور به مشکل میخوره و اررور میده ، و باید مدارو ریست کنیم چون دگ نه چیزی میشه نوشت نه خوند ، ولی مدار ریست میشه میتونیم بنویسیم.
1-2 : mmc نمیتونه بنویسه.
2.وقتی با کامپیوتر داده هارو از طریق یک حلقه به مدار ارسال میکنم (40 خط داده : از سکتور 0 تا 39)، فقط تا سکتور 10 مینویسه و بقیه سکتور ها رو نا دیده میگیره.. و داده های 10 تا 20 حلقه رو مینویسه... یعنی سکتور 0تا10 داده های 10 تا 20 حلقه....
در ارسال ها و دریافت داده در سکتور های پایین مثلا سکتور های 10000 به پایین هیچ مشکلی نیست.
گاهی پیش میاد وقتی مدار ارور میده دادهایی که قبلا نوسته شده تغییر میکنه مثلا میشه : acxsij23oi4?@#$?# یه همچین چیزی......
از رم sd و 1 گیگ ،
از کتاب خونه mmc.h با کمی تغییرات استفده میکنم :
#include <spi.h>
#include <delay.h>
#define CS_0 PORTB.4 = 0
#define CS_1 PORTB.4 = 1
#define OK PORTB.0 = 0
#define WR PORTB.1 = 1
#define ER PORTB.0 = 1
#define RD PORTB.1 = 0
//char str[5];
int res;
unsigned long int MMC_ADR;
unsigned char MMC_Buffer[512];
char Command(char befF, unsigned int AdrH, unsigned int AdrL, char befH )
{
CS_0;
spi(0xFF);
spi(befF);
spi((char)(AdrH >> 8));
spi((char)AdrH);
spi((char)(AdrL >> 8));
spi((char)AdrL);
spi(befH);
spi(0xFF);
return spi(0xFF);
}
char MMC_Init(void) {
char i;
DDRB = 0x2F;
PORTB = 0xFF;
delay_us(10);
PORTB = 0x00;
SPCR=0x50;
SPSR=0x01;
RD ;
OK;
CS_1;
for(i=0; i < 100; i++)
spi(0xFF);
CS_0;
if( Command(0x40,0,0,0x95) != 1)
{
ER;
printf("#init fail"

return 0;
}
do
{
res = Command(0x41,0,0,0xFF);
spi(0xFF);
ER;
}while(res != 0);
OK;
return 1;
}
char Write_MMC(unsigned long int N)
{
unsigned int i;
char c;
MMC_ADR = N;
MMC_ADR *= 512;
WR;
OK;
res = Command(0x58,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
if (res !=0)
{
printf("#512 mode"

ER;
return 0;
}
spi(0xFF);
spi(0xFF);
spi(0xFE);
for (i=0;i<512;i++)
spi(MMC_Buffer[i]);
spi(0xFF);
spi(0xFF);
c = spi(0xFF);
c &= 0x1F;
if (c != 0x05)
{
ER;
printf("#Write faild"

return 0;
}
i=0;
while(spi(0xFF) != (char)0xFF);
{
if(++i>5000)
{
ER;
printf("#busy"

return 0;
}
}
OK;
return 1;
}
char Read_MMC(unsigned long int N)
{
unsigned int i;
MMC_ADR = N;
MMC_ADR *= 512;
RD;
res = Command(0x51,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
if (res != 0)
{
printf("#read faild"

ER;
return 0;
}
i = 0;
while(spi(0xFF) != (char)0xFE)
{
if(++i==10000){
ER;
printf("#time out"

return 0;
}
delay_us(100);
}
for(i=0; i < 512; i++)
MMC_Buffer[i] = spi(0xFF);
OK;
return 1;
}
اگه کمک کنین ممنون میشم. و خیلی دوس دارم بدونم چطور میشه حجم رم رو با کد بدست آورد و چطور همه سکتور هارو پاک کرد.
مرسی.
دیدگاه