전함 보드의 USB 카드 리더 실험을 단일 디스크 읽기, 교육용 스티커로 수정하는 방법
대상: 디스크가 하나만 있고 SPI 플래시 디스크입니다.
지식 포인트:
1, MAX_LUN 은 디스크 수, , 1, 1, 2, 2, 3 등
2,
1 exex 등을 나타냅니다
2 extern u32mass _ block _ size [max _ LUN+1];
3 extern u32mass _ block _ count [max _ LUN+1];
디스크 정보를 나타내는 데 매우 중요한 세 가지 배열, 디스크 크기를 나타내는 Mass_Memory_Size, 디스크 블록 크기 (섹터 크기) 를 나타내는 Mass_Block_Size, mass _ block
3, MAL_Write 및 MAL_Read 함수. 기본 디스크의 읽기 및 쓰기 작업을 수행하는 데 사용됩니다. 즉, USB 읽기 및 쓰기 인터페이스는 반드시 구현되어야 합니다.
위의 지식 포인트를 통해 수정 방법을 살펴보겠습니다.
1 단계, MAX_LUN 수정 (원래 1) 은 디스크가 하나만 있음을 나타냅니다. MAX_LUN 은 mass_mal.h 파일에 있습니다.
단계 2, MAL_Write 및 MAL_Read 함수 수정, 수정된 코드는
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * 입니다 Function name: mal _ write
3 * description: write sectors
4 * input: none
5 * Output: none
6 * return: , ok
7 1, 페일
8 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. U32 * write buff, u16 transfer _ length)
1 {
11 u8 sta;
12 스위치 (LUN)
13 {
14 case:
15 sta = ;
16 SPI _ flash _ write ((u8 *) writebuff, memory _ offset, transfer _ length);
17//sta = SD _ writedisk ((u8 *) writebuff, memory _ offset > > 9, Transfer_Length> > 9);
18 break;
19 case 1:
2 STA=;
21 SPI _ flash _ write ((u8 *) writebuff, memory _ offset, transfer _ length);
22 break;
23default:
24 return mal _ fail;
25}
26 if(STA! =)return MAL_FAIL;
27 return MAL_OK;
28}
29
3/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * Function name: mal _ read
32 * description: read sectors
33 * input: none
34 * Output: none
35 * return: , ok
36 1, 페일
37 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. U32 * read buff, u16 transfer _ length)
39 {
4 u8 sta;
41 스위치 (LUN)
42 {
43 case:
44 sta = ;
45 SPI _ flash _ read ((u8 *) read buff, memory _ offset, transfer _ length);
46//sta = SD _ readdisk ((u8 *) read buff, memory _ offset > > 9, Transfer_Length> > 9);
47 break;
48 case 1:
49 STA=;
5spi _ flash _ read ((u8 *) read buff, memory _ offset, transfer _ length);
51 break;
52 default:
53 return mal _ fail;
54}
55 if(STA! =)return MAL_FAIL;
56 return MAL_OK;
57}
보시는 바와 같이 switch case 을 SPI FLASH 작업으로 변경하여 디스크가 하나만 있는 경우 switch 는 항상 일 수 있으며 SPI FLASH 가 작동됩니다.
단계 3, main 함수에 의한 Mass_Memory_Size 와 같은 세 배열의 초기화를 수정하고 수정된 코드는 다음과 같습니다.
1//if (SD _ initialize ()) lce ); //SD 카드 오류 감지
2 // else //SD 카드 정상
3 // {
4 // Lcd _ showstring (6,13,2,16,16, "SD 카드 크기: MB");
5//mass _ memory _ size [] = (long long) SD _ getsectorcount () * 512; //SD 카드 용량 (바이트) 을 얻습니다. SD 카드 용량이 4G 를 초과하면
6 // Mass_Block_Size[] =512 를 나타내는 두 개의 u32 가 필요합니다. //Init 에 SD 카드를 설치한 운영 바이트가 512 개이므로 여기는 512 바이트여야 합니다.
7//mass _ block _ count [] = mass _ memory _ ssy
8//LCD _ shownum (164,13, mass _ memory _ size [] > > 2,5,16); //SD 카드 용량 표시
9 //}
1 if(SPI_FLASH_TYPE! = w25q64) LCD _ showstring (6,13,2,16,16, "w25q64error!" ); //SD 카드 오류 감지
11 else//SPI 플래시 정상
12 {
13 mass _ memory _ size [] = 124 * 124) //처음 6M 바이트
14 Mass_Block_Size[] =512; //Init 에 SD 카드를 설치한 운영 바이트가 512 개이므로 512 바이트여야 합니다.
15 mass _ block _ count [] = mass _ memory _ size [
16 LCD _ showstring (6,15,2,16,16, "SPI 플래시 크기: 6144kb");
17}
보시다시피 SD 카드를 부분적으로 마스킹한 다음 Mass_Memory_Size, Mass_Block_Size 및 Mass_Block_Count 를 볼 수 있습니다