前面发了3个帖子实现了SD卡的初始化,获取SD卡容量,及读取,本帖实现SD的写功能,( L7 z8 c6 X% l; N 实现写,就要先实现写的函数,依然是拷贝f767的写代码 u8 SD_WriteDisk(u8*buf,u32 sector,u32 cnt) { u8 sta=SD_OK;' V# M! {7 d2 k- u* u u32 n;# ^+ ~" p- q( {! b/ ~+ t# W+ n0 L long long lsector=sector;1 Y- w0 f2 f9 l/ i- o' G% \& t k if(CardType!=STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;2 W$ c9 c' f) ~' |+ ^+ C6 g if((u32)buf%4!=0). U6 I# }1 n o {" _8 a5 a% V( @" t0 L; Q$ X6 e0 j for(n=0;n<cnt;n++)2 [) O$ V8 s% Z& X { memcpy(SDMMC_DATA_BUFFER,buf,512); sta=SD_WriteBlocks(SDMMC_DATA_BUFFER,lsector+512*n,512,1);//单个sector的写操作3 O6 R, ]( K0 z; j buf+=512; } }else sta=SD_WriteBlocks(buf,lsector,512,cnt); //单个/多个sector 4 X/ `0 s; k: X9 \4 C return sta;4 q! c' i1 U# `1 q( G1 w0 } } 然后写个test_write函数4 [; q4 B$ ]. |' [7 P% ^ void sd_test_write(u32 secaddr,u32 seccnt) { u32 i; u8 *buf; u8 sta=0;; f1 W+ q( A: ]2 Y buf=(u8 *)malloc(512*sizeof(u8)); //从SDRAM申请内存 for(i=0;i<seccnt*512;i++) //初始化写入的数据,是3的倍数.5 b& V2 V1 l2 V* r3 r+ l+ U) v {6 `0 O" j& C0 t# g2 P& o/ c6 Y. ~ buf=0xff;3 d; I0 H% U# e" m& a$ Z' j2 C } sta=SD_WriteDisk(buf,secaddr,seccnt);//从secaddr扇区开始写入seccnt个扇区内容 if(sta==0) / x# [2 y' w) X8 e: l { printf("Write over!\r\n"); }else printf("err:%d\r\n",sta);2 X0 b# Y7 k3 L7 I* P free(buf); //释放内存 }) J0 C6 t7 }. V( W! h; e 本函数也是在f767的代码基础上更改实现的 在while(1)中添加如下代码 sd_test_write(0,1); delay_ms(1000); sd_test_read(0,2); delay_ms(1000); 打印到串口助手内容见图. z% A: @% W* G: C3 l/ R7 S ; }/ _( Q, h9 u. p) | 果然都实现了,今天收获颇丰啊,下周开始移植fatfs文件系统9 J$ S1 Z$ H' Z/ g' o + Q/ L" E% F( f" S7 H" O* Y: d 1 I% b1 r( J8 o4 ~6 u Z% A" b 发帖与2018年3月9日8 K- o( C3 H& \* N4 C2 _/ U# Q |
支持 沙发 |
谢谢支持啊 |