Thông báo

Collapse
No announcement yet.

SD card và MMC card

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • rptdnmqs
    replied
    fat16 thì xác định 2^16 clustor nên nó chỉ dùng cho thẻ 32MB.

    Leave a comment:


  • lequyen
    replied
    ????????????

    Leave a comment:


  • lequyen
    replied
    mong chỉ giùm

    Leave a comment:


  • lequyen
    replied
    Nguyên văn bởi yankazaz Xem bài viết
    Giả sử đã khởi tạo MMC, chúng ta sẽ bàn tiếp đến các hàm đọc và ghi sector cho MMC.

    - Do đọc dễ hơn ghi, nên tôi nói hàm read_sector trước.
    Command đọc 1 sector là Command 17. 17(dec) = 0x11(hex) = 0001 0001
    Ghép với byte command 0x01.... ta có : 0x0101 0001 = 0x51

    Vậy lệnh đọc là : CMD17( 0x51, byte4..1,0x00)
    Có một điều hơi khó hiểu chỗ này, các bác cẩn thận này:
    Các byte4-1 là địa chỉ theo byte, nhưng MMC lại đọc theo sector. Có nghĩa là: giả sử chúng ta cần đọc sector0 = 512byte đầu tiên, MMC sẽ gửi dữ liệu bắt đầu từ byte số 0. Vậy 4byte này là 0x00 0x00 0x00 0x00 = 0!

    Nhưng giả sử chúng ta muốn đọc sector 1, là 512byte tiếp theo, MMC sẽ gửi từ byte thứ 512 đến byte 1023, vậy 4byte này phải trỏ đến byte thứ 512 và như vậy có giá trị là: 0x00 0x00 0x02 0x00 = 0x200 = 512.

    Vậy nếu chúng ta có 4 thanh ghi 8bit từ r20-r23 lưu địa chỉ byte, để chuyển thành sector muốn đọc ta làm thêm 1 hàm shift_mmc như sau:


    Khi đó, Muốn đọc sector 0, r23..r20 = 0x00 0x00 0x00 0x00
    Muốn đọc sector 1, r23..r20 = 0x00 0x00 0x00 0x01 0x00
    Áp dụng hàm shift_mmc cho trường hợp này:
    r20 = 0x00
    r21 = 0x01, lsl r21 = 0x02
    rol r22 = 0x00
    rol r23 = 0x00
    ---> r23..r20 = 0x00 0x00 0x02 0x00
    Các bác có thể thử với một vị trí sector bất kỳ để hiểu đoạn này

    Như vậy, lệnh đọc sector MMC sẽ là: (giả sử sector 1)

    bác làm ơn chỉ giùm cách đọc sector o bằng c ,rồi cho hiển thi trên virtual terminal với.

    Leave a comment:


  • lequyen
    replied
    bác làm ơn chỉ giùm cách đọc sector o bằng c ,rồi cho hiển thi trên virtual terminal với.

    Leave a comment:


  • lequyen
    replied
    Nguyên văn bởi yankazaz Xem bài viết
    Thẻ nhớ thường được format dưới FAT16, nhưng những loại thẻ có dung lượng cao đều support FAT32 (bạn có thể ghi từ Win sang thẻ nhớ những file dài đến ..ái). Tuy nhiên khi có một thẻ nhớ bất kỳ bạn nên reformat dưới dạng FAT16!
    Có phải người ta gọi FAT 16 là FAT ko hả bác?

    Leave a comment:


  • lequyen
    replied
    e đang làm đồ án píc6f877a giao tiep mmc card .
    bác nào có code c và file mô phỏng đọc thẻ nhớ ko thì giúp e với
    thẻ nhớ nhỏ hơn 4G thì là định dạng FAT16 đúng ko?
    Ví dụ muốn format một thẻ nhớ theo định dạng Fat16 hay fat 32 có được ko?

    Leave a comment:


  • phuongchan
    replied
    Tôi cũng đang tìm hiểu về vấn đề này, nếu bạn muốn dùng nguồn 3,3V thì bạn có thể dùng IC LM317 hoặc từ nguồn 5V cho qua 3 Diod. Mục đích của tôi cũng giống như bạn là dùng AVR ghi data vào SD/MMC và nó được save dưới dạng một file text. Ai đã từng làm hãy cho tôi cùng mọi người giải pháp với

    Leave a comment:


  • lequyen
    replied
    xin các cao thủ chỉ giùm chi tiết cách tạo file ảnh cho mmc,sd mô phỏng trong protues

    Leave a comment:


  • vuhungster
    replied
    Chào bác windy2055! Nghe bác nói thì chắc bác đã làm cái giao tiếp SDCard vơi ARM rồi, tôi thì mới tìm hiểu và đang bắt đầu làm về nó nhưng thấy phức tạp và khó hiểu quá. Bác làm rồi, các bước làm như thế nào, thực hiện ra làm sao bác biết bác chỉ giùm tôi vài chiêu hay tài liệu gì được không bác.
    Cám ơn bác nhiều nhé.

    Leave a comment:


  • trungpham90
    replied
    Hic , Mọi người cho mình hỏi , tại sao khi mình không gửi lệnh cmd 0, thay vào đó là {0x00,0x00,0x00,0x00,0x00,0x00} hoặc {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} thì SD card vẫn phản hồi lại 0x01 cảm ơn mọi người nhiều, mình đánh vật với cái này gần 1 tháng rồi đây là code của mình
    Code:
    void Initialization (void)
    {
    	int status					= 0xFF;
    	int i 						= 0;
    	int ii						= 0;
    	int iii						= 0;
    	int true1					= 0;
    	int true2					= 0;
    	
    	PORTC.DDR.BIT.B0			= 1;
    	PORTC.DR.BIT.B0			= 1;
    	
    	while(i<1000) 		
    	{
    		TX2_CHAR('%');	
    		WriteSD(0XFF);		// DELAY TIME	
    		i++;
    	}	
    
    	PORTC.DR.BIT.B0			= 1;
    //	Error();	
    	while(status != 0x01 )
    	{
    		status 						= WriteCommand(CMD0,0);
    		ii++;
    	}
    	Error();		
    	if(ii == 100)
    	{
    		TX2_CHAR('?');		
    		Error();	
    	}	
    	ii								= 0;	
    	while(status == 0x01 && ii < 8)
    	{
    		status 						= WriteCommand(CMD8,0);
    		ii++;
    	}	
    	
    //	Error();	
    	TX2_NUM(status);
    	
    	TX2_CHAR('!');			
    	status						= 0xFF;	
    	TX2_CHAR('!');		
    	while(true1 == 0|| true2 == 0)
    	{
    		status						= 0xFF;		
    		status	 					= WriteCommand(CMD55,0);
    		true1							= 0;
    		true2							= 0; 
    		if(status == 0x00)
    		{	
    			true1 					= 1;
    			TX2_CHAR('+');		
    		}	
    		else
    			true1 					= 0;	
    	
    		status						= 0xFF;
    		status 						= WriteCommand(ACMD41,0);
    		if(status == 0x00)
    		{
    			true2 					= 1;			
    			TX2_CHAR('@');	
    		}	
    		else				
    			true2 = 0;			
    		TX2_NUM(status);	
    				
    	}
    //	if(iii == 100)
    	//	TX2_CHAR('?');		
    //		Error();	
    	status						= 0xFF;
    	status 						= WriteCommand(CMD58,5);
    //	TX2_NUM(status);	
    		
    	i								= 0;	
    	while(i<5)
    		TX2_NUM(RES[i++]);	
    
    	RSPI0.SPCR.BIT.SPE		= 0;	// DISABLE RSPI FUNCTION
    	RSPI0.SPBR.BYTE 			= 3*(PCLK / SD_CLOCK_RUN / 2 -1);	//Clock at 24MHz
    	RSPI0.SPCR.BIT.SPE		= 1;	// ENABLE RSPI FUNCTION	
    }	
    
    ///////////////////////////////////////////////COMMAND SENDING/RECIVEING HANDLER ///////////////////////////////////////////////////////////////
    void Receive_handling(void)
    {	
    	int i 						= 0;	
    	read 							= 1;	
    	RSPI0.SPDCR.BIT.SPRDTD	= 0;
    	
    /*	if(command == 1)
    	{
    		response						= RSPI0.SPDR.WORD.H;	
    		TX2_CHAR('R');	
    		TX2_NUM(response);
    		command						= 0;
    	}	
    */	
    	if(waiting !=0)
    	{
    		RES[i++]						= RSPI0.SPDR.WORD.H;	
    		waiting --;
    		TX2_CHAR('?');
    	}		
    	if(RSPI0.SPDR.WORD.H != 0xFF && delay1 != 0)
    	{
    		delay1 						= 0;	
    		TX2_CHAR('D');		
    		TX2_NUM (RSPI0.SPDR.WORD.H);
    		response						= RSPI0.SPDR.WORD.H;	
    	//	command						= 1;
    	}	
    	SD_data 						= RSPI0.SPDR.WORD.H;		
    	TX2_NUM (SD_data);	
    	RSPI0.SPDCR.BIT.SPRDTD	= 1;
    }
    
    int ReadSD()
    {
    	int i = 0;
    	while(read == 0)
    	{
    		i++;
    		if(i>=0xFFFF)
    			read 							= 1;
    	}
    	read 							= 0;
    	return SD_data;
    }	
    
    void WriteSD(int data)
    {		
    	RSPI0.SPDR.WORD.H 		= data;
    	while(done == 0);
    //	TX2_CHAR('#');	
    	done 							= 0;
    }
    	
    char WriteCommand(char* cmd, int length)
    {
    	int i							= 0;
    	SD_data						= 0xFF;
    	response						= 0xFF;
    	TX2_CHAR('<');	
    	PORTC.DR.BIT.B0			= 0;
    
    //	while(i<0xFFF)				i++;
    	WriteSD(0XFF);
    //	for (i = 0; i<6; i++)
    //	{		
    //		WriteSD(cmd[i]);
    //	}	
    	delay1 						= 1;
    	i 								= 0;
    	while(delay1 != 0 && i < 8)
    	{			
    		WriteSD(0XFF);
    		//i++;
    	}	
    //	WriteSD(0XFF);
    	TX2_CHAR('T');	
    	waiting 						= length;
    	while(waiting >0)
    	{
    		WriteSD(0XFF);
    		TX2_CHAR('#');
    	}	
    	WriteSD(0XFF);
    	PORTC.DR.BIT.B0			= 1;
    				
    	WriteSD(0XFF);
    		
    //	TX2_NUM (SD_data);
    	TX2_CHAR('>');	
    	TX2_NUM (response);
    	return response;
    }	
    void Transmit_handling(void)
    {			
    	done 							= 1;
    }

    Leave a comment:


  • enter88
    replied
    Nguyên văn bởi Minh Hai Xem bài viết
    sorry vì mình không post được hình do hình có kích thước lớn quá hay sao ấy (1.4M) nhưng đại khái thì mình dùng hàm đọc sector 0 thì ở địa chỉ 446=0x00; 447=0x04;448=0x02;450=0x06;451=0x08;452=0xc8;453=0 xd0;454=0xFD;458=0X03;459=0X07;460=0X1E;510=0X55;5 11=0XAA; còn lại tất cả =0 . có bác nào có kinh nghiệm về cái này nói dùm em là thẻ SDcard của em đã active được chưa và nếu em muốn đọc những cái này để biết các thông tin về thẻ, thì phải làm như thế nào (bác nào có tài liệu về đọc cái này thì cho em với ). em xin chân thành cảm ơn !
    Tài liệu bạn đọc ở đây : http://www.maverick-os.dk/FileSystem...iskFormat.html. Trang này sẽ cho bạn những thứ bạn cần cả tính toán để đọc 1 file bất kì. Nếu bạn đã giao tiếp dc với thẻ rồi thì bạn đã làm dc 50% rồi.

    Leave a comment:


  • Minh Hai
    replied
    sorry vì mình không post được hình do hình có kích thước lớn quá hay sao ấy (1.4M) nhưng đại khái thì mình dùng hàm đọc sector 0 thì ở địa chỉ 446=0x00; 447=0x04;448=0x02;450=0x06;451=0x08;452=0xc8;453=0 xd0;454=0xFD;458=0X03;459=0X07;460=0X1E;510=0X55;5 11=0XAA; còn lại tất cả =0 . có bác nào có kinh nghiệm về cái này nói dùm em là thẻ SDcard của em đã active được chưa và nếu em muốn đọc những cái này để biết các thông tin về thẻ, thì phải làm như thế nào (bác nào có tài liệu về đọc cái này thì cho em với ). em xin chân thành cảm ơn !

    Leave a comment:


  • xuan08dv
    replied
    bác nào đã làm về đọc file mp3 xin cho ý kiến đi.chắc hẳn có rất nhiều bạn quan tâm đến cái này

    Leave a comment:


  • Minh Hai
    replied
    các bác đã có kinh nghiệm là thẻ SDcard cho em hỏi với, em dùng thẻ micro cắm vào adapter rồi dùng như thẻ SDcard bình thường và đã dùng hàm đọc sector để đọc được sector 0 là master boot record và đã thu được như hình dưới . nhưng em không biết làm cách nào để đọc cái này. có bác nào làm ơn hướng dẫn em cách để đọc cái này được không và giải thích dùm em là card của em đã active được chưa và bước tiếp theo em phải làm gì. em xin cảm ơn ! (hic add mấy file ảnh có 1.4M mà ko được là sao nhỉ ???)
    Last edited by Minh Hai; 08-12-2010, 16:53.

    Leave a comment:

Về tác giả

Collapse

atmega8 Tìm hiểu thêm về atmega8

Bài viết mới nhất

Collapse

Đang tải...
X