前面发了3个帖子实现了SD卡的初始化,获取SD卡容量,及读取,本帖实现SD的写功能,7 y1 U' E8 x6 z! ? 实现写,就要先实现写的函数,依然是拷贝f767的写代码, `5 A9 y4 n/ Y% O, y u8 SD_WriteDisk(u8*buf,u32 sector,u32 cnt) {" p, \2 b' s A" A u8 sta=SD_OK; u32 n;' x7 \4 U+ W. [ long long lsector=sector;# \# \1 a. Z' d% I! b if(CardType!=STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;/ M0 ` g1 k. n2 N+ s. g9 q5 J if((u32)buf%4!=0) { for(n=0;n<cnt;n++) { }3 P7 k1 B$ F9 D+ f memcpy(SDMMC_DATA_BUFFER,buf,512);, X, p! ?: ]9 [ sta=SD_WriteBlocks(SDMMC_DATA_BUFFER,lsector+512*n,512,1);//单个sector的写操作9 ^7 r6 F; u) L buf+=512; } }else sta=SD_WriteBlocks(buf,lsector,512,cnt); //单个/多个sector " Z# e4 C8 p5 z return sta;; [ ~# _5 O1 o4 e2 l- p( ]- k } 然后写个test_write函数 void sd_test_write(u32 secaddr,u32 seccnt)- y3 W8 h4 o- P. W { u32 i;3 I* h: U" Z; t( q6 J u8 *buf; u8 sta=0; y/ l% S: }0 E: j buf=(u8 *)malloc(512*sizeof(u8)); //从SDRAM申请内存 for(i=0;i<seccnt*512;i++) //初始化写入的数据,是3的倍数. { buf=0xff;# A2 n5 n J/ Y! H# E9 u9 D% ] }. \: D- V. N9 \! v; ?6 k sta=SD_WriteDisk(buf,secaddr,seccnt);//从secaddr扇区开始写入seccnt个扇区内容 q8 [" N; h. R" r+ M if(sta==0) ; I& p& _+ n" h' L& y0 Z { printf("Write over!\r\n"); }else printf("err:%d\r\n",sta); free(buf); //释放内存 } 本函数也是在f767的代码基础上更改实现的 在while(1)中添加如下代码3 j1 _& Y" l- p- t4 z sd_test_write(0,1); delay_ms(1000); sd_test_read(0,2);5 F* R3 I/ ]9 @: R" a/ k7 t% Y delay_ms(1000);0 g) m( s/ e6 D3 h/ I* X+ U 打印到串口助手内容见图 果然都实现了,今天收获颇丰啊,下周开始移植fatfs文件系统 发帖与2018年3月9日 |
支持 沙发 |
谢谢支持啊 |