SD 의 FAT 파일 시스템
[날짜: 2008 년 8 월 4 일] 출처: 중국 전력망 작가: 우한 이공대 자동화학원 소일신성민 우한 대학 리와 [서체: 중소규모]
순서
플래시 메모리를 스토리지로 사용하는 SD 카드는 소형, 전력 소비, 삭제 가능, 비휘발성 등의 장점으로 가전 제품에 널리 사용되고 있습니다. 특히 최근 몇 년 동안 가격 하락과 스토리지 용량 증가에 따라 애플리케이션 범위가 확대되고 있습니다. 데이터 수집 시스템이 대량의 데이터를 수집하는 데 오랜 시간이 걸릴 경우 SD 카드를 스토리지 미디어로 선택하는 것은 개발자에게 좋은 선택입니다. 전력 모니터링 및 무효 전력 보상 시스템에서는 대량의 전압, 전류, 유효 전력, 무효 전력 및 시간 매개변수를 지속적으로 기록해야 합니다. SD 는 SD 를 저장 매체로 사용할 수 있습니다. 이 문서에서는 SD 카드가 전력 모니터링 및 무효 전력 보상 데이터 수집 시스템에 사용되는 방법을 주로 설명합니다.
설계방안
AT89C52 로 SD 카드를 읽고 쓰는 데는 두 가지 주의가 필요하다. 먼저 AT89C52 단일 컨트롤러와 SD 카드 간의 통신을 위한 솔루션을 찾아야 합니다. 둘째, SD 카드는 AT89C52 에서 제공하는 논리적 평평과 일치하지 않는 논리적 수평을 허용하므로 수평 일치 문제를 해결해야 합니다.
통신 모드
SD 카드에는 SD 모드와 SPI 모드의 두 가지 통신 프로토콜 (옵션) 이 있습니다. SD 모드는 SD 카드의 표준 읽기 및 쓰기 모드이지만 SD 모드를 선택할 때 SD 카드 컨트롤러 인터페이스가 있는 MCU 를 선택하거나 SD 카드 읽기 및 쓰기를 지원하기 위해 SD 카드 제어 장치를 추가해야 하는 경우가 많습니다. AT89C52 단일 칩은 통합 SD 카드 컨트롤러 인터페이스가 없으므로 SD 모드 통신을 선택하면 제품 하드웨어 비용이 사실상 증가합니다. SPI 모드는 SD 카드 데이터의 읽기 및 쓰기 시간 요구 사항이 그다지 엄격하지 않은 경우에 가장 적합한 솔루션이라고 할 수 있습니다. SPI 모드에서는 모든 데이터 교환을 4 선으로 수행할 수 있고 시중에 나와 있는 많은 MCU 에 기성 SPI 인터페이스 회로가 통합되어 있기 때문에 SPI 모드에서 SD 카드를 읽고 쓰면 하드웨어 회로 설계를 크게 단순화할 수 있습니다.
AT89C52 에는 SD 카드 하드웨어 컨트롤러도 없고 기성 SPI 인터페이스 모듈도 없지만 SPI 버스 타이밍은 소프트웨어로 시뮬레이션할 수 있습니다. 이 기사에서는 SPI 버스 읽기 및 쓰기 SD 카드를 사용합니다.
수평 일치
SD 카드의 논리 평평은 3.3V TTL 평평 표준과 맞먹는 반면 제어 칩 AT89C52 의 논리 평평은 5V CMOS 평평 표준입니다. 따라서 직접 연결할 수 없습니다. 그렇지 않으면 SD 카드가 타 버릴 수 있습니다. 안전을 위해 레벨 일치 문제를 해결해야 합니다.
이 문제를 해결하기 위해 가장 근본적인 것은 논리 디바이스 인터페이스의 수준 호환성 문제를 해결하는 것입니다. 두 가지 주요 원칙이 있습니다. 하나는 출력 평평기의 최소 전압 값이 수신 평평기가 고평으로 인식하는 최소 전압 값보다 커야 한다는 것입니다. 다른 하나는 출력 평평한 장치가 저평일 때의 최대 전압 값이며, 수신 평평한 장치가 저평으로 인식하는 최대 전압 값보다 작아야 합니다.
일반적으로 일반적인 레벨 변환 시나리오는 SN74ALVC4245 와 같은 전용 레벨 변환 칩을 사용하여 승압 및 강압에 사용할 수 있을 뿐만 아니라 양쪽 전원 공급 장치가 동기화되지 않도록 하는 것입니다. 하지만 이 방안은 비교적 비싸고, 일반적으로 전용 레벨 변환 칩은 모두 동시에 8 개 채널, 16 개 채널 이상, 3 개 채널만 변환하는 시스템에 비해 자원 낭비다.
SPI 프로토콜 작동 모드에서 SD 카드의 통신이 단방향이라는 점을 감안하면 SD 카드로 데이터를 전송할 때 트랜지스터 갈라 저항 방안을 사용합니다. 기본 회로는 1 과 같습니다. SD 카드가 단일 디스크로 데이터를 전송할 때 직접 연결할 수 있습니다. 왜냐하면 두 카드 사이의 평평은 위에서 설명한 레벨 호환성 원칙을 정확히 충족하며 경제적이기 때문입니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 스포츠명언)
이 시나리오에서는 AMS11117 전압 조절기를 통해 5V 전원 공급 장치에서 얻을 수 있는 이중 전원 공급 장치 (5V 전원 공급 장치, 3.3V 전원 공급 장치) 가 필요합니다.
하드웨어 인터페이스 설계
SD 카드는 주변 회로 작동을 용이하게 하는 9 핀 핀 핀 핀 커넥터를 제공합니다. 9 핀 9Pin 은 작동 모드에 따라 다릅니다. SPI 모드에서 핀 1(DAT3) 은 SPI 칩 라인 선택 CS, 핀 2(CMD) 는 SPI 버스의 데이터 출력선 MOSI, 핀 7(DAT0) 은 데이터 입력선 MISO, 핀 5 로 사용됩니다. 전원 및 접지 외에도 예약 핀은 공중에 떠 있을 수 있습니다.
이 문서에서 SD 카드를 제어하는 MCU 는 ATMEL 이 생산한 저전압 고성능 CMOS 8 비트 마이크로컨트롤러 AT89C52 로, 8 바이트 다시 쓰기 가능한 읽기 전용 프로그램 메모리 1 개와 256 바이트 랜덤 액세스 데이터 메모리가 포함되어 있습니다. AT89C52 는 256 바이트의 데이터 메모리만 있고 SD 카드의 데이터 쓰기는 블록 단위이며 각 블록은 5 12 바이트이므로 단일 칩 마이크로 컴퓨터의 최소 시스템에는 RAM 이 필요합니다. 이 시스템은 메모리 칩 HM62256 을 RAM 으로 선택하고 용량은 32K 입니다. RAM 을 읽고 쓸 때 잠금 장치는 낮은 8 비트 데이터 잠금 및 P2 포트의 8 비트 주소 데이터와 함께 16 비트 주소 공간을 형성하여 SD 카드가 한 번에 5 12 바이트를 읽고 쓸 수 있도록 합니다. 시스템 하드웨어 블록 다이어그램은 그림 2 에 나와 있습니다.
소프트웨어 설계
SPI 작동 모드
SD 카드는 전원 초기 단계에서 SD 버스 모드로 자동 진입하여 SD 카드에 리셋 명령 CMD0 을 전송합니다. SD 카드가 리셋 명령을 받는 동안 CS 저수준에서 유효한 경우 SPI 모드로 들어갑니다. 그렇지 않으면 SD 버스 모드에서 작동합니다.
SPI 직렬 버스 인터페이스가 없는 AT89C52 마이크로 컨트롤러의 경우 포트 P 1.5 (아날로그 CLK 라인) 의 초기 상태를 1 으로 설정하고 수신 후 p/kloc-0-을 사용하여 소프트웨어를 사용하여 SPI 버스 작동을 시뮬레이션합니다 이렇게 하면 단일 칩 출력 1 비트 SCK 클럭이 동시에 인터페이스 칩 직렬 왼쪽으로 이동하여 1 비트 데이터를 AT89C52 단일 칩 P 1.7 (아날로그 MISO 선) 로 출력합니다. 그런 다음 P 1.5 를 0 으로 설정하고 1 비트 데이터의 입력 출력을 시뮬레이션하여 8 회 루핑하고 1 번 SPI 버스를 통해 8 비트 데이터를 전송하는 작업을 완료합니다.
이 문서의 구현 어셈블리는 SPI 버스의 읽기 및 쓰기 기능이 되었으며, 전달된 val 변수는 SPI 에 기록된 데이터뿐만 아니라 SPI 에서 읽은 데이터도 포함합니다. 구체적인 절차는 다음과 같습니다. (프로그램은 Keil Vision 2 의 컴파일 환경에서 작성되었습니다.)
Sbit cs = P3 5;
Sbit clk = p15;
Sbit datai = p17;
Sbit datao = p16;
# definesd _ disable () cs =1//슬라이스 선택.
#define SD_Enable() CS=0 // 켜기/끄기.
부호 없는 문자 SPI_TransferByte (부호 없는 문자 값)
{
부호없는 문자 비트 카운터;
For (bitcounter = 8; 이중 카운터! =0; 비트 카운터-)
{CLK = 0;;
DataI = 0;; //쓰기
If(val & amp;; 0x80) datai =1;
Val<& lt= 1;
Clk =1;
If (datao) val | =1; //읽기
}
CLK = 0;;
Val 을 반환합니다
}
SD 카드 초기화
SD 카드를 조작하려면 먼저 SD 카드를 초기화해야 합니다. 초기화 중 SD 카드는 그림 3 과 같이 SPI 모드에서 작동하도록 설정되어 있습니다.
재설정이 성공하면 CMD55 및 ACMD4 1 을 통해 현재 전압이 작동 범위 내에 있는지 확인할 수 있습니다. 호스트는 CMD 10 을 통해 SD 카드의 CID 레지스터를 계속 읽고, CMD 16 을 통해 블록 길이를 설정하고, CMD9 를 통해 카드의 CSD 레지스터를 읽을 수 있습니다. CSD 레지스터에서 호스트는 카드 용량, 지원되는 명령 세트 및 기타 중요한 매개변수를 알 수 있습니다. SD 카드가 초기화한 c 언어 프로그램은 다음과 같습니다.
부호 없는 문자 SD_Init(void)
{부호 없는 문자 재시도, 임시.
부호 없는 문자 I;
For(I = 0;; 나 & lt0x0fi++)
{SPI _ transferbyte (0xff); //74 개 이상의 클럭 지연
}
Sd _ enable (); //선택 사항 열기
Spi _ transferbyte (SD _ reset); //재설정 명령 보내기
Spi _ transferbyte (0x00);
Spi _ transferbyte (0x00);
Spi _ transferbyte (0x00);
Spi _ transferbyte (0x00);
Spi _ transferbyte (0x95);
Spi _ transferbyte (0xff);
Spi _ transferbyte (0xff);
재시도 = 0;
Do {temp = write _ command _ SD (SD _ init, 0);
//초기화 명령 보내기
다시 시도++;
If(retry== 100) // 재시도 100 회.
{SD _ disable (); //영화 선택 해제
리턴 (init _ cmd1_ error);
//100 번 재시도에 실패하면 오류 번호를 반환합니다.
}
}while(temp! =0);
Sd _ disable (); //영화 선택 해제
반환 (참); //성공적으로 반환됨
}
데이터 블록 읽기 및 쓰기
SD 카드 초기화가 완료되면 읽고 쓸 수 있습니다. SD 카드의 읽기 및 쓰기 작업은 SD 카드 명령을 전송하여 수행됩니다. SPI 버스 모드는 단일 블록 (CMD24) 및 다중 블록 (CMD25) 쓰기 작업을 지원합니다. 다중 블록 작업은 SD 카드가 중지 명령 CMD 12 를 받을 때까지 지정된 위치에서 쓰기를 시작합니다. 단일 블록 쓰기 작업의 블록 길이는 5 12 바이트만 될 수 있습니다. 단일 블록에 쓸 때 명령은 CMD24 입니다. 응답이 0 이면 데이터를 쓸 수 있으며 크기는 5 12 바이트입니다. SD 카드는 응답 명령을 통해 전송된 각 데이터 블록을 1 바이트 길이로 확인합니다. 낮은 5 비트가 00 10 1 이면 데이터 블록이 SD 카드에 올바르게 기록됩니다.
SD 카드의 데이터를 읽어야 할 경우 SD 카드를 읽는 명령은 CMD 17 이고, 올바르게 수신되는 첫 번째 응답 명령 바이트는 0xFE 이고, 그 뒤에는 5 12 바이트의 사용자 데이터 블록, 마지막으로 2 바이트의 CRC 검사 코드가 옵니다.
SD 카드를 읽고 쓰는 작업은 초기화 후 SD 카드의 명령과 응답을 기반으로 수행됨을 알 수 있습니다. 그림 4 와 그림 5 에는 SD 카드를 읽고 쓰는 프로그램 절차가 나와 있습니다.
끝말
실험 결과 단일 칩 마이크로 컴퓨터가 12MHz 결정진을 사용할 때 읽기 및 쓰기 속도와 전력 소비량이 기본적으로 만족스러워 읽기 및 쓰기 속도가 높지 않은 경우에 적용할 수 있는 것으로 나타났다. 이 문서에서는 AT89C52 단일 칩 SD 카드 운영 프로세스에 대해 자세히 설명하고 SD 카드 컨트롤러 없이 SD 카드를 읽고 쓸 수 있는 방법을 제시하여 전력 모니터링 및 무효 전력 보상 데이터 수집 시스템에서 SD 카드를 사용할 수 있도록 합니다.