Ðề tài: giao tiep voi sd card
View Single Post
Old 30-11-2009, 02:34 PM   #14
tahi
Đệ tử 4 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 64
:
Cảm ơn bác đã giúp. Đoạn gửi ACMD41 đúng là em hơi sơ xuất, em chỉ loop mỗi gửi ACMD41, đáng nhẽ phải loop cả CMD55 và ACMD41
Trích:
Bạn ko nên dùng chân SS của SPI, dùng 1 chân IO bình thường để nối tới chân CS của card (hình như bạn đang làm như vậy, bạn nói chưa rõ).
Em gán cho 1 thằng I/O bình thường
Trích:
Khi khởi động, card ở chế độ SD, do đó chân SDO của card là opendrain, bạn cần 1 con điện trở pull-up ở chân này, từ 10k-50k.
Em ko có con trở pull-up nào. Đồng thời dính hiến tượng, cắm thẻ thì reset (sụt áp)

Khi send 6 byte lệnh, có delay giữa các byte hay ko hay là gửi liên tiếp,
Code:
unsigned char SD_WriteCommand(unsigned char* cmd)
{
	unsigned int i;
	unsigned char response;
	unsigned char savedSD_CS = SD_CS;	
	// SD Card Command Format
	// (from Section 5.2.1 of SanDisk SD Card Product Manual v1.9).
	// Frame 7 = 0
	// Frame 6 = 1
	// Command (6 bits)
	// Address (32 bits)
	// Frame 0 = 1

	// Set the framing bits correctly (never change)
	cmd[0] |= (1<<6);
	cmd[0] &= ~(1<<7);
	cmd[5] |= (1<<0);	
	// Send the 6 byte command
	SD_Enable();
	for(i = 0; i < 6; ++i)
	{
		SPIWrite(*cmd);
		Delay_Us(100);  //để 10 thì ăn, còn để 0 hoặc 100 là response về FF
		cmd++;
	}	
	// Wait for the response
	i = 0;
	do
	{
		response = SPIRead();
		if(i > 500) //If this value = 100, will recieved 0xFF with cmd17
		{
			break;
		}
		i++;
	} while(response == 0xFF);

	SD_Disable();

	// Following any command, the SD Card needs 8 clocks to finish up its work.
	// (from SanDisk SD Card Product Manual v1.9 section 5.1.8)
	SPIWrite(0xFF); 
	SD_CS = savedSD_CS;
	return(response);
}
tahi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn