PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 30-11-2009, 02:34 PM   #1
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
Old 30-11-2009, 03:28 PM   #2
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi tahi View Post
Đồng thời dính hiến tượng, cắm thẻ thì reset (sụt áp)
Bạn phải kiểm tra chắc chắn là phần cứng đúng. Vì thẻ ngốn dòng nhiều nhất khi ghi, nhưng cũng không quá 100mA
Trích:
Khi send 6 byte lệnh, có delay giữa các byte hay ko hay là gửi liên tiếp,
Gửi liên tiếp ko delay, nhưng lần ghi sau cùng phải chờ tới khi module SPI xuất hết dữ liệu ra, tức là cờ ngắt bật thì mới được đưa chân CS về 1. Vì sau khi ghi vào thanh ghi SPIxBUF, cần tốn 1 thời gian tùy thuộc vào tốc độ baud thì dữ liệu mới ghi ra bus hết. Nếu bạn đưa chân CS về 1 ngay sau khi ghi SPIxBUF thì byte cuối cùng thẻ sẽ không nhận!


Và chú ý bạn phải gửi lệnh SET_BLOCK_LEN, đây là lệnh bắt buộc trong quá trình khởi tạo thẻ

Bạn muốn tự viết driver thẻ?
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]

thay đổi nội dung bởi: bien_van_khat, 30-11-2009 lúc 05:05 PM.
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:41 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam