紧急求助~~~~SD卡的fat32文件系统读BPB数据不正常~~、、
<br /><br />我做的SD卡的fat32文件系统,普通的正常读写没有任何问题,譬如利用欧冠测试数据写入到某个扇区,然后回读比较,结果均正常,读取硬件信息,结果正常,但是读取BPB数据就不正常:512BYTE的0扇区数据,前510全为0,理论上不正常,后面两位为0x55,0xaa,结果又正常。<br /><br />我现在怀疑可能是我读取BPB扇区的位置不对,如果有哪位知道是在哪个位置读取的请指教一下~~<br /><br />下面有读取BPB数据的程序,请大虾帮忙分析分析~~~<br /><br />void fnSD_InitDrive(void)<br />{<br /> MMC_read_sector(0,buffers.currentsector.u8data);//在0扇区处读取BPB数据<br /> buffers.SectorCurrentlyLoaded=0xFFFFFFFF;<br /> <br />}<br /><br />uint8_t MMC_read_sector(uint32_t addr,uint8_t *Buffer)<br />{<br /> uint8_t temp;<br /> uint32_t i;<br /> <br /> SPI_TransferByte(0xff);<br /> temp = Write_Command_MMC(MMC_READ_BLOCK,addr<<9);<br /> if(temp != 0x00)<br /> {<br /> return(READ_BLOCK_ERROR);<br /> }<br /> <br /> while(SPI_TransferByte(0xff) != 0xfe);<br /> <br /> for(i=0;i<512;i++)<br /> {<br /> *Buffer++ = SPI_TransferByte(0xff);<br /> }<br /> SPI_TransferByte(0xff);<br /> SPI_TransferByte(0xff);<br /> <br /> return (1);<br />}<br /><br /> <br /> <br />SD卡的0扇区可能为分区信息,LZ请仔细读SD卡datasheet
或找份文件系统研究一下,给你一个正常的吧,BTW,你的写法不太好,最好分层按标准
********************<br />* SD卡驱动程序设计 *<br />********************<br /> ------《ecos增值包》之SD卡驱动<br /> 2006/09/17 asdjf@163.com www.armecos.com<br /><br />------------<br />SD卡驱动测试<br />------------<br /><br />SmartARM2200平台<br /><br />一张512M的SD卡,格式化成FAT32,创建两个文本文件:<br />a.txt<br /> 1234567890<br />b.txt<br /> abcdefghijklmn<br />用winhex软件分析,FAT1位于32扇区,a.txt文件位于1980扇区,b.txt文件位于1988扇区,当然启动部分就固定在0扇区。<br />下面是用SD卡驱动读出的识别信息CID、CSD、0扇区数据、32扇区数据、1980扇区数据、1988扇区数据,和winhex的数据对比,完全一致。<br /><br />SD卡先关电源再打开,初始化硬件,检测卡是否插入,接着发送复位命令、激活初始化处理命令、读取并解析CID、读取并解析CSD、设置SPI时钟为最大值、设置读写块长度。(其他如OCR、SCR、CRC校验等省略。)每个命令都给出了命令、参数、应答信息,同时给出编码封装后的字节序。每个命令都超时等待应答成功,有写命令的应答带有返回数据。<br /><br />SD卡测试程序分析了MBR信息,准确读出了几个特定扇区的数据。接着向指定的100扇区强制写入固定数据,再读出来,结果数据一致。在完成写入命令后,还需要等待数据写入完成,写入扇区需要相对比较长的时间,这里使用忙等待模式(更快的可以使用异步模式,完成写命令后先处理其他任务,不必一直等待写数据完成)。<br /><br />经测试,寄存器读、数据读写均正确完成。<br /><br />test by yangyi<br />2007/09/17<br /><br />+<br /><br /><br /> *******************************<br /> * SD Card Test *<br /> *******************************<br /><br />Power down!<br />Power up!<br /><br />Card insert<br /><br />Request 40 00 00 00 00 95 ff<br />Sent command cmd = 00 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 01<br />Request 41 00 00 00 00 ff ff<br />Sent command cmd = 01 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 01<br />Request 41 00 00 00 00 ff ff<br />Sent command cmd = 01 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 01<br />Request 41 00 00 00 00 ff ff<br />Sent command cmd = 01 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 01<br />Request 41 00 00 00 00 ff ff<br />Sent command cmd = 01 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 01<br />Request 41 00 00 00 00 ff ff<br />Sent command cmd = 01 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />Request 4a 00 00 00 00 ff ff<br />Sent command cmd = 0a arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_data(): got data and CRC 4a 36<br /><br /><br />CID data: 27 50 48 53 44 35 31 32 11 21 f0 56 01 00 68 ab<br />CID data: register<br /> : Manufacturer ID : MID = 0x27<br /> : OEM/Application ID : OID = 0x5048<br /> : Product name : PNM = SD512<br /> : Product revision : PRV = hwrev(0x01) fwrev(0x01)<br /> : Product serial number : PSN = 0x21f05601<br /> : Manufacturing date : MDT = 2006-08<br /><br /><br />Request 49 00 00 00 00 ff ff<br />Sent command cmd = 09 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_data(): got data and CRC 53 78<br /><br /><br />CSD data: 00 4f 00 32 5f 59 83 ca f6 db 7f 87 8a 40 00 2d<br />CID data: register<br /> : Data read time parameter1 : TAAC = 40000000ns<br /> : Data read time parameter2 : NSAC = 0<br /> : Max data transfer rate : TRAN_SPEED = 25000000Hz<br /> : Card command class : CCC = 5f5<br /> : Card capacity : C_SIZE、C_SIZE_MULT = 994304 Blocks (485MB)<br /> : Max read data length : READ_BL_LEN = 9<br /> : Read block partial enable : READ_BL_PARTIAL = 1<br /> : Write block misalign : WRITE_BLK_MISALIGN = 0<br /> : Read block misalign : READ_BLK_MISALIGN = 0<br /> : Write speed factor : R2W_FACTOR = 1<br /> : Max write data length : WRITE_BL_LEN = 9<br /> : Write block partial enable: WRITE_BL_PARTIAL = 0<br /><br /><br />mmc_spi_read_disk_block(0): sending command<br />Request 51 00 00 00 00 ff ff<br />Sent command cmd = 11 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(0): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 96 bc<br /><br /><br />MBR dump<br /> 0000: eb 58 90 4d 53 44 4f 53 35 2e 30 00 02 08 20 00<br /> 0010: 02 00 00 00 00 f8 00 00 3f 00 ff 00 00 00 00 00<br /> 0020: 00 2c 0f 00 ca 03 00 00 00 00 00 00 02 00 00 00<br /> 0030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> 0040: 00 00 29 cb 90 87 a8 4e 4f 20 4e 41 4d 45 20 20<br /> 0050: 20 20 46 41 54 33 32 20 20 20 33 c9 8e d1 bc f4<br /> 0060: 7b 8e c1 8e d9 bd 00 7c 88 4e 02 8a 56 40 b4 08<br /> 0070: cd 13 73 05 b9 ff ff 8a f1 66 0f b6 c6 40 66 0f<br /> 0080: b6 d1 80 e2 3f f7 e2 86 cd c0 ed 06 41 66 0f b7<br /> 0090: c9 66 f7 e1 66 89 46 f8 83 7e 16 00 75 38 83 7e<br /> 00a0: 2a 00 77 32 66 8b 46 1c 66 83 c0 0c bb 00 80 b9<br /> 00b0: 01 00 e8 2b 00 e9 48 03 a0 fa 7d b4 7d 8b f0 ac<br /> 00c0: 84 c0 74 17 3c ff 74 09 b4 0e bb 07 00 cd 10 eb<br /> 00d0: ee a0 fb 7d eb e5 a0 f9 7d eb e0 98 cd 16 cd 19<br /> 00e0: 66 60 66 3b 46 f8 0f 82 4a 00 66 6a 00 66 50 06<br /> 00f0: 53 66 68 10 00 01 00 80 7e 02 00 0f 85 20 00 b4<br /> 0100: 41 bb aa 55 8a 56 40 cd 13 0f 82 1c 00 81 fb 55<br /> 0110: aa 0f 85 14 00 f6 c1 01 0f 84 0d 00 fe 46 02 b4<br /> 0120: 42 8a 56 40 8b f4 cd 13 b0 f9 66 58 66 58 66 58<br /> 0130: 66 58 eb 2a 66 33 d2 66 0f b7 4e 18 66 f7 f1 fe<br /> 0140: c2 8a ca 66 8b d0 66 c1 ea 10 f7 76 1a 86 d6 8a<br /> 0150: 56 40 8a e8 c0 e4 06 0a cc b8 01 02 cd 13 66 61<br /> 0160: 0f 82 54 ff 81 c3 00 02 66 40 49 0f 85 71 ff c3<br /> 0170: 4e 54 4c 44 52 20 20 20 20 20 20 00 00 00 00 00<br /> 0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> 0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br /> 01a0: 00 00 00 00 00 00 00 00 00 00 00 00 0d 0a 4e 54<br /> 01b0: 4c 44 52 20 69 73 20 6d 69 73 73 69 6e 67 ff 0d<br /> 01c0: 0a 44 69 73 6b 20 65 72 72 6f 72 ff 0d 0a 50 72<br /> 01d0: 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 72<br /> 01e0: 65 73 74 61 72 74 0d 0a 00 00 00 00 00 00 00 00<br /> 01f0: 00 00 00 00 00 00 00 00 00 ac bf cc 00 00 55 aa<br />Read block 0 (partition table)<br />Signature 0x55 0xaa, should be 0x55 0xaa<br />Partition 0: boot ff, first sector 0d 0a 44, file system 69, last sector 73 6b 20<br /> : first sector (linear) 6f 72 72 65, sector count 0a 0d ff 72<br />Partition 1: boot 50, first sector 72 65 73, file system 73, last sector 20 61 6e<br /> : first sector (linear) 65 6b 20 79, sector count 6f 74 20 79<br />Partition 2: boot 20, first sector 72 65 73, file system 74, last sector 61 72 74<br /> : first sector (linear) 00 00 0a 0d, sector count 00 00 00 00<br />Partition 3: boot 00, first sector 00 00 00, file system 00, last sector 00 00 00<br /> : first sector (linear) ac 00 00 00, sector count 00 00 cc bf<br /><br /><br />mmc_spi_read_disk_block(0): sending command<br />Request 51 00 00 00 00 ff ff<br />Sent command cmd = 11 arg = 0: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(0): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 96 bc<br /><br /><br />Sector info(0 sec : boot):<br />----------------------------------------------------------------<br /><br /> 0 eb 58 90 4d 53 44 4f 53 35 2e 30 0 2 8 20 0 <br /> 10 2 0 0 0 0 f8 0 0 3f 0 ff 0 0 0 0 0 <br /> 20 0 2c f 0 ca 3 0 0 0 0 0 0 2 0 0 0 <br /> 30 1 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 40 0 0 29 cb 90 87 a8 4e 4f 20 4e 41 4d 45 20 20 <br /> 50 20 20 46 41 54 33 32 20 20 20 33 c9 8e d1 bc f4 <br /> 60 7b 8e c1 8e d9 bd 0 7c 88 4e 2 8a 56 40 b4 8 <br /> 70 cd 13 73 5 b9 ff ff 8a f1 66 f b6 c6 40 66 f <br /> 80 b6 d1 80 e2 3f f7 e2 86 cd c0 ed 6 41 66 f b7 <br /> 90 c9 66 f7 e1 66 89 46 f8 83 7e 16 0 75 38 83 7e <br /> a0 2a 0 77 32 66 8b 46 1c 66 83 c0 c bb 0 80 b9 <br /> b0 1 0 e8 2b 0 e9 48 3 a0 fa 7d b4 7d 8b f0 ac <br /> c0 84 c0 74 17 3c ff 74 9 b4 e bb 7 0 cd 10 eb <br /> d0 ee a0 fb 7d eb e5 a0 f9 7d eb e0 98 cd 16 cd 19 <br /> e0 66 60 66 3b 46 f8 f 82 4a 0 66 6a 0 66 50 6 <br /> f0 53 66 68 10 0 1 0 80 7e 2 0 f 85 20 0 b4 <br /> 100 41 bb aa 55 8a 56 40 cd 13 f 82 1c 0 81 fb 55 <br /> 110 aa f 85 14 0 f6 c1 1 f 84 d 0 fe 46 2 b4 <br /> 120 42 8a 56 40 8b f4 cd 13 b0 f9 66 58 66 58 66 58 <br /> 130 66 58 eb 2a 66 33 d2 66 f b7 4e 18 66 f7 f1 fe <br /> 140 c2 8a ca 66 8b d0 66 c1 ea 10 f7 76 1a 86 d6 8a <br /> 150 56 40 8a e8 c0 e4 6 a cc b8 1 2 cd 13 66 61 <br /> 160 f 82 54 ff 81 c3 0 2 66 40 49 f 85 71 ff c3 <br /> 170 4e 54 4c 44 52 20 20 20 20 20 20 0 0 0 0 0 <br /> 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1a0 0 0 0 0 0 0 0 0 0 0 0 0 d a 4e 54 <br /> 1b0 4c 44 52 20 69 73 20 6d 69 73 73 69 6e 67 ff d <br /> 1c0 a 44 69 73 6b 20 65 72 72 6f 72 ff d a 50 72 <br /> 1d0 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 72 <br /> 1e0 65 73 74 61 72 74 d a 0 0 0 0 0 0 0 0 <br /> 1f0 0 0 0 0 0 0 0 0 0 ac bf cc 0 0 55 aa <br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(32): sending command<br />Request 51 00 00 40 00 ff ff<br />Sent command cmd = 11 arg = 16384: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(32): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 76 3a<br /><br /><br />Sector info(32 sec : root dir):<br />----------------------------------------------------------------<br /><br /> 0 f8 ff ff ff ff ff ff ff ff ff ff f ff ff ff f <br /> 10 ff ff ff f 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(1980): sending command<br />Request 51 00 0f 78 00 ff ff<br />Sent command cmd = 11 arg = 1013760: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(1980): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 9a 31<br /><br /><br />Sector info(1980 sec : a.txt):<br />----------------------------------------------------------------<br /><br /> 0 31 32 33 34 35 36 37 38 39 30 0 0 0 0 0 0 <br /> 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /><br />----------------------------------------------------------------<br /><br />mmc_spi_read_disk_block(1988): sending command<br />Request 51 00 0f 88 00 ff ff<br />Sent command cmd = 11 arg = 1017856: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(1988): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 67 a2<br /><br /><br />Sector info(1988 sec : b.txt):<br />----------------------------------------------------------------<br /><br /> 0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 0 0 <br /> 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1a0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1b0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1d0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /> 1f0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <br /><br />----------------------------------------------------------------<br /><br /><br /><br />Write test<br />mmc_spi_write_disk_block(), sending command<br />Request 58 00 00 c8 00 ff ff<br />Sent command cmd = 18 arg = 51200: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_write_disk_block(): sending data token/data/crc<br />mmc_spi_write_disk_block(): got data response token e5<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 00<br />mmc_spi_write_disk_block(), polling for ! busy, got response 01<br />mmc_spi_read_disk_block(100): sending command<br />Request 51 00 00 c8 00 ff ff<br />Sent command cmd = 11 arg = 51200: reply bytes ff ff ff ff ff ff ff<br /> loop 0, additional reply 00<br />mmc_spi_read_disk_block(100): reading data token/data/crc<br />mmc_spi_read_data(): got data and CRC 40 da<br /><br /><br />Sector info(100 sec : test):<br />----------------------------------------------------------------<br /><br /> 0 0 1 2 3 4 5 6 7 8 9 a b c d e f <br /> 10 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f <br /> 20 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f <br /> 30 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f <br /> 40 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f <br /> 50 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f <br /> 60 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f <br /> 70 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f <br /> 80 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f <br /> 90 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f <br /> a0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af <br /> b0 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf <br /> c0 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf <br /> d0 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df <br /> e0 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef <br /> f0 f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff <br /> 100 0 1 2 3 4 5 6 7 8 9 a b c d e f <br /> 110 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f <br /> 120 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f <br /> 130 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f <br /> 140 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f <br /> 150 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f <br /> 160 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f <br /> 170 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f <br /> 180 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f <br /> 190 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f <br /> 1a0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af <br /> 1b0 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf <br /> 1c0 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf <br /> 1d0 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df <br /> 1e0 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef <br /> 1f0 f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff <br /><br />----------------------------------------------------------------<br />********************<br />* SD卡驱动程序设计 *<br />********************<br /> ------《ecos增值包》之SD卡驱动<br /> 2006/09/17 asdjf@163.com www.armecos.com<br /><br /> 《ecos增值包》提供了SD/MMC卡驱动程序。SD/MMC卡是体积小(24mm * 32mm * 1.4mm),重量轻(<2克)的非易失性大容量存储设备。典型的卡容量为16MB、128MB、256MB、512MB直至4GB。<br /> <br /> 硬件级别有两种方式访问SD卡:专用SD总线或者SPI总线。在使用时软件会选择使用其中一种接口。SD总线在性能上优于SPI总线,但需要增加额外硬件。<br /> <br /> SD卡一般被格式化为PC兼容的格式,第一块保存分区表,其余部分存放一个单独的FAT文件系统。<br /> <br /> SD卡可以在任何时间插入和拔出,设备驱动程序在下一次I/O操作时将检测到拔出事件并通过发送错误码ENODEV向更高层软件汇报,不过,高层代码不保证系统能从这个错误恢复。期望的正确做法是应用代码在尝试访问文件I/O前显式地调用mount挂装SD卡,在卡移除前调用unmount。在mount和unmount之间,系统倾向于在缓存中保存数据块,以便提升性能。如果在unmount前移除SD卡,就会破坏文件系统正确性,导致文件系统处于不稳定状态。定期使用同步sync将减少文件系统被破坏的风险。<br /> <br /> SD卡驱动的主要内容是:硬件初始化、SPI时钟速率设置/恢复、寄存器读写、数据块读写擦、电源开关控制、卡在位检测、卡变动识别。<br /> <br /> 最重要的代码之一是mmc_spi_send_command_start(...),完成命令的组装发送应答。如代码所示,首先将命令、参数和CRC校验组装成6字节命令封装,第7字节的FF是为了获得紧接着的卡应答目的设置的。前面MMC_SPI_BACKGROUND_WRITES条件编译里的代码是为后台模式写操作准备的,用于继续等待前一次写操作命令完成后的数据写入扇区延时,这么做可以在写命令完成后立即做别的工作,不必等待写扇区完成,在下一次写操作前会判断上一次写是否完成,若没有完成则继续等待。<br /> <br /> 接下来就是SPI总线上的操作了,如《SPI驱动程序设计》一节所述,首先要调用cyg_spi_transaction_begin开始SPI传输过程,这个函数完成总线锁定,避免多个线程同时访问同一个SPI总线。然后调用cyg_spi_transaction_transfer发送命令和接收应答。由于《ecos增值包》的驱动程序可以同时驱动多个SPI总线,所以第一个参数必须提供设备识别dev,以便区分是哪个SPI总线设备。cyg_mmc_spi_polled参数用于选择工作模式(查询/中断),此处应该选择中断模式,以便提高CPU工作效率。SMARTARM2200的SPI是全双工的,收发同时进行,给出发送缓冲、接收缓冲和传输数量,此函数就能自动完成命令发送和应答接收。可能响应不是立即的,此时需要不断查询有效的卡响应。当然应该提供超时退出机制。<br /> <br /> 数据块读写与此类似,主要是调用SPI总线驱动,按照SD卡访问流程操作,配套书上已经讲得非常详细了,在此不再赘述,请读者举一反三。<br /> <br /> CID和CSD是两个比较重要的寄存器,解码程序见后面示例。<br /> <br /> SD卡驱动程序总流程:<br /> <br /> 硬件初始化(切记一定要断开JP7的ATA_INT跳线,因为SSEL需要设置为主机模式,需要上拉。如果不断开ATA_INT,会干扰上拉,导致SPI主机工作不正常。)<br /> 至少延时74个时钟周期<br /> 复位SD卡命令<br /> 激活初始化处理命令<br /> 读取并解析CID<br /> 读取并解析CSD<br /> 设置SPI时钟为最大值<br /> 设置读写块长度<br /> ---数据块读写擦---<br /> <br />static cyg_uint32<br />mmc_spi_send_command_start(cyg_mmc_spi_disk_info_t* disk, cyg_uint32 command, cyg_uint32 arg)<br />{<br /> cyg_spi_device* dev = disk->mmc_spi_dev;<br /> cyg_uint8 request;<br /> cyg_uint8 response;<br /> cyg_uint8 reply;<br /> int i;<br /><br />#ifdef MMC_SPI_BACKGROUND_WRITES <br /> if (disk->mmc_writing) {<br /> DEBUG2("mmc_spi_send_command_start(): polling for completion of previous write");<br /> disk->mmc_writing = 0;<br /> response = 0x00;<br /> for (i = 0; (i < MMC_SPI_WRITE_BUSY_RETRIES) && (0x00FF != response); i++) {<br /> cyg_spi_transfer(dev, cyg_mmc_spi_polled, 1, mmc_spi_ff_data, response);<br /> }<br /> }<br />#endif <br /> <br /> request = command | 0x0040;<br /> request = (arg >> 24) & 0x00FF;<br /> request = (arg >> 16) & 0x00FF;<br /> request = (arg >> 8) & 0x00FF;<br /> request = arg & 0x00FF;<br /> request = (command == 0x00) ? 0x0095 : 0x00ff;<br /> request = 0x00ff;<br /><br /> cyg_spi_transaction_begin(dev);<br /> <br />
哇,LS强淫。。。
LS的天天在做广告,不得不服,,
感谢armecos的回复
回复的实在是太精彩了~~~谢谢<br /><br />我现在测试的结果是,普通的读写没有问题,但是对0扇区读出的系统信息有问题,512个byte数据,直到第440个才不为0,最后两个数据又是0x55aa,显然又是正常的,armecos你看可以帮我分析下不?如果可以的话,请留下邮箱你读的是对的。
MBR本来就是这样的。 440开始的16个字节是分区表,一共4个。 <br />----<br />你前后描述不一致。LZ还是没有去看SD卡的datasheet,没搞清分区概念,
我还是闪吧,
页:
[1]