完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
int sd_read_sector(alt_u32 sd_base, int sdhc, alt_u32 sect, alt_u8 *buf)
{ int i; alt_u8 rcode, token; alt_u32 addr, ocr; /* byte addr for SD card; sector # for SDHC card */ if (sdhc==0) addr = (sect<<9); else addr = sect; /* send sd card read single block commend */ rcode = sd_wr_cmd(sd_base, SD_CMD17_READ, addr, &ocr); ////if (rcode != 0x00){ printf("CMD17 command fails: R1=0x%02x n", rcode); return (-1); ////} /* wait for data start token up to 0.1 sec */ for(i=0; i token = sd_spi_rd_byte(sd_base); if (token==SD_TOKEN_DATA_START) // correct response received break; } if (token!=SD_TOKEN_DATA_START){ //time-out printf("No data start token: last token=0x%02xn", token); return (-1); } /* read one sector (512 bytes) */ for (i=0; i<512; i++) buf[i] = sd_spi_rd_byte(sd_base); /* read and discard two crc bytes */ sd_spi_rd_byte(sd_base); sd_spi_rd_byte(sd_base); return (0); } /*********************************************************************** * function: sd_write_sector() * purpose: write one sector (512 (2^9) bytes) from a buffer to sd card * argument: * sd_base: base address of sd card interface * sdhc: 0 for SD card; 1 for SDHC card * sect: sector number * buf: pointer to buffer * return: 0 for success; -1 otherwise * note: * - procedure: * 1. send write-one-sector command * 2. send data_start token * 3. send 512 bytes * 4. send 2 dummy crc bytes * 5 check data accept token * 5. wait for completion * - CMD24 argument * - standard capacity SD card: starting byte address (sect<<9) * - high capacity SDHC card: starting sector address (sect) * - 10 MHz sclk used to calculate # timeout cycles ***********************************************************************/ int sd_write_sector(alt_u32 sd_base, int sdhc, alt_u32 sect, alt_u8 *buf) { int i; alt_u8 rcode, token; alt_u32 addr, dummy; /* byte addr for SD card; sector # for SDHC card */ if (sdhc==0) addr = (sect<<9); else addr = sect; /* send sd card write single block commend */ rcode = sd_wr_cmd(sd_base, SD_CMD24_WRITE, addr, &dummy); // error ////if (rcode != 0x00){ printf("nCMD24 command fails: R1=0x%02x n", rcode); return (-1); ////} /* initiate transfer by send data start token */ sd_spi_wr_byte(sd_base, SD_TOKEN_DATA_START); /* send 512 bytes */ for (i=0; i<512; i++){ sd_spi_wr_byte(sd_base, buf[i]); } /* send two dummy crc bytes */ sd_spi_wr_byte(sd_base, 0xff); sd_spi_wr_byte(sd_base, 0xff); /* wait for data acceptance token up to 0.25 sec */ for(i=0; i token = token & 0x1f; // only 5 LSBs used if (token==SD_TOKEN_DATA_ACCEPT) // correct response received break; } if (token!=SD_TOKEN_DATA_ACCEPT){ printf("No data accept token: last token=0x%02xn", token); return (-1); } /* wait for write completion */ for(i=0; i if (token==0xff) // correct response received break; } if (token != 0xff){ printf("Write completion timeout: last token=0x%02xn", token); return (-1); } return (0); // ok } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
375 浏览 0 评论
NVMe over Fabrics 国产 IP:高性能网络存储解决方案
363 浏览 0 评论
130 浏览 0 评论
NVMe高速传输之摆脱XDMA设计54:如何测试队列管理功能2
397 浏览 0 评论
NVMe高速传输之摆脱XDMA设计53:如何测试队列管理功能
730 浏览 0 评论
4566 浏览 64 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 14:01 , Processed in 0.510856 second(s), Total 37, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3740