前面发了3个帖子实现了SD卡的初始化,获取SD卡容量,及读取,本帖实现SD的写功能, 实现写,就要先实现写的函数,依然是拷贝f767的写代码: O6 c( r/ q% I# p4 t u8 SD_WriteDisk(u8*buf,u32 sector,u32 cnt)- a! Z$ d) J9 u- J( { {9 a, t$ U) x" R" |4 U. g0 v0 y u8 sta=SD_OK;# b9 w/ Z( w4 z; }. Y2 S u32 n; long long lsector=sector;9 G% o) G/ w8 @( b9 w if(CardType!=STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;8 _) f0 O' p0 c. j9 S if((u32)buf%4!=0) { for(n=0;n<cnt;n++) { e) L$ T/ i/ a" H memcpy(SDMMC_DATA_BUFFER,buf,512); sta=SD_WriteBlocks(SDMMC_DATA_BUFFER,lsector+512*n,512,1);//单个sector的写操作+ g+ n: I9 |# C2 W: {, D; W buf+=512;4 D% _% O6 D- p: o- J: g+ g } 1 m# ?) a% A4 T+ J9 S3 q3 G }else sta=SD_WriteBlocks(buf,lsector,512,cnt); //单个/多个sector {9 ?8 g0 C- S return sta; }* T1 q$ }* O3 `7 `& Y& u( s) |0 v 然后写个test_write函数/ S" |( c6 I) o9 ~ void sd_test_write(u32 secaddr,u32 seccnt) { u32 i;7 N3 ?% l: s6 K3 s! U" B6 C( \ u8 *buf; u8 sta=0; buf=(u8 *)malloc(512*sizeof(u8)); //从SDRAM申请内存7 n3 V) w$ j# V+ `0 b, F" l for(i=0;i<seccnt*512;i++) //初始化写入的数据,是3的倍数. { buf=0xff;. H5 e0 y1 M3 | }: n/ y- E' ? g5 k sta=SD_WriteDisk(buf,secaddr,seccnt);//从secaddr扇区开始写入seccnt个扇区内容+ \/ C" U# o' z- n if(sta==0) * O# l/ F g4 m; |6 _% [ { printf("Write over!\r\n"); 0 `2 q0 T6 b8 N5 _7 [: x }else printf("err:%d\r\n",sta); free(buf); //释放内存 }0 [$ ]) x M$ q* }0 d, B1 J: C 本函数也是在f767的代码基础上更改实现的 在while(1)中添加如下代码 sd_test_write(0,1);/ e1 i6 S0 H$ E: F delay_ms(1000); sd_test_read(0,2);. D- ~4 D" i+ A5 R- s8 R delay_ms(1000); 打印到串口助手内容见图 V( k4 ~) v/ `; v 果然都实现了,今天收获颇丰啊,下周开始移植fatfs文件系统 发帖与2018年3月9日: v: E* Y/ e l: {$ X7 a |
支持 沙发 |
谢谢支持啊 |