Kết nối thẻ SD với vi điều khiển AT89S52
Thẻ SD được ưa thích hơn do kích thước nhỏ, dung lượng bộ nhớ cao, bộ nhớ lưu trữ dài hạn, tiêu thụ năng lượng thấp và chi phí thấp. Vì vậy, sản phẩm bộ nhớ này được sử dụng trong hầu hết các sản phẩm điện tử tiêu dùng.
Nếu bạn muốn thực hiện một hệ thống thu thập dữ liệu mà nên lưu trữ một lượng lớn dữ liệu thì SD card là một sự lựa chọn rất tốt.
Thẻ SD hoạt động ở mức logic 3.3v TTL trong khi vi điều khiển hoạt động ở mức logic 5v CMOS. Do đó họ không thể kết nối trực tiếp. Nếu kết nối chắc chắn thẻ SD sẽ bị hỏng do chập cháy.
Để giải quyết vấn đề này chúng ta cần một mạch điện áp chuyển đổi cấp giữa thẻ SD và vi điều khiển 89s52. Chúng tôi có thể sử dụng chip chuyển đổi SN74LS4245 chuyên dụng để thực hiện chuyển đổi phân áp.
Như vậy phải xây dựng một bộ chuyển đổi mức điện áp và sau đó có thể làm cho nó với một bóng bán dẫn NPN đơn giản.
Kết nối 5V với microcontroller và 3.3v bên cạnh thẻ SD. Mạch này chỉ có thể được sử dụng để chuyển dữ liệu từ vi điều khiển sang thẻ SD. Và để chuyển dữ liệu từ thẻ SD sang vi điều khiển, bạn có thể kết nối trực tiếp các chân từ vi điều khiển 89S52 có thể đọc dữ liệu ở logic 3.3v.
Chế độ truyền thông
Có 2 giao thức truyền thông cho thẻ SD. Họ là chế độ SD và chế độ SPI. Chế độ SD là một chế độ đọc thẻ SD chuẩn. Nhưng nó cần một giao diện bộ điều khiển thẻ SD. Nhưng AT89S52 không có bộ điều khiển giao diện thẻ SD tích hợp. Vì vậy chúng tôi đi cho chế độ tiếp theo đó là chế độ SPI. Nó chỉ cần một dây 4 cho truyền thông dữ liệu. Cũng có rất nhiều microcontrollers bây giờ trên thị trường có giao diện cổng SPI.
Mặc dù AT89S52 không có bộ điều khiển phần cứng SPI sẵn có, chúng tôi có thể sử dụng một bộ điều khiển SPI phần mềm để mô phỏng các tuyến bus SPI.
Ngoài ra AT89s52 chỉ có 256 bytes RAM trong , khi thẻ sd đọc và viết khối cần 512byts tại một thời điểm. Vì vậy, chúng ta cần một RAM bên ngoài nên được interfaced với vi điều khiển. Trong mạch này chúng tôi đang sử dụng 62256 IC có công suất 32KB.
Thiết kế phần mềm
Trong khi quyền lực trên thẻ sd sẽ ở chế độ SD bus. Gửi một lệnh đặt lại CMDO để vào chế độ SPI. Gửi dữ liệu vào thẻ SD được thực hiện bằng cách tạo ra một phần mềm SPI bus. Sử dụng mã sau để truyền dữ liệu sang thẻ SD.
sbit CS=P1^0;
sbit CLK= P1^1;
sbit DATaI=P1^2;
sbit DATaO=P1^3;
#define SD_Disable() CS=1 //Dừng cờ CS
#define SD_Enable() CS=0 //Mở cờ CS
unsigned char SPI_TransferByte(unsigned char val)
{
unsigned char BitCounter;
for(BitCounter=8; BiCounter!=0; BitCounter--)
{ CLK=0;
DATaI=0; // Bắt đầu ghi dữ liệu
if(val&0x80) DATaI=1;
val<<=1;
CLK=1;
if(DATaO)val|=1; // Đọc
}
CLK=0;
return val;
}
Initializing the SD card
unsigned char SD_Init(void)
{ unsigned char retry,temp;
unsigned char i;
for (i=0;i<0x0f;i++)
{ SPI_TransferByte(0xff); //delay
}
SD_Enable(); //Mở Chip select
SPI_TransferByte(SD_RESET); //gửi tín hiệu reset
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x95);
SPI_TransferByte(0xff);
SPI_TransferByte(0xff);
retry=0;
do{ temp=Write_Command_SD(SD_INIT,0);
//Send the initialization command
retry++;
if(retry==100) //lặp 100 lần
{SD_Disable(); //đóng chip select
return(INIT_CMD1_ERROR);
//Nếu sảy ra lỗi thì hiển thị lỗi và quay lại
}
}while(temp!=0);
SD_Disable(); //Đóng card
return(TRUE); //Lặp đến khi kết thúc
}
***********************************************************
Đọc và Viết khối dữ liệu
Sau khi hoàn thành việc khởi tạo thẻ SD, chúng tôi có thể thực hiện các thao tác đọc và ghi.
Chế độ SPI Bus hỗ trợ hoạt động ghi một khối (CMD24) và đa khối (CMD25). Multi-block hoạt động là viết ra bắt đầu từ vị trí quy định, cho đến khi thẻ SD trước khi nhận được một lệnh ngừng CMD12 để dừng lại.
Một khối duy nhất viết hoạt động của chiều dài khối dữ liệu chỉ 512 byte.
Để đọc thẻ SD CMD17 được sử dụng và thẻ SD sẽ trả lời với 0XFE theo sau là 512byte dữ liệu và 2 byte cuối cùng là mã xác minh CRC.
Nhận xét
Đăng nhận xét