完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
时序跟程序都对过了,没发现错误,求高手指点,一般SD卡的进入SPI模式都是怎样的啊?网上找过很多程序,试过了,还是不行,还有些是有错误的程序。
下面是我自己写的。 #include "reg51.h" #define uchar unsigned char #define uint unsigned int #include "lcd12864.h" #define reset_ERROR 0x01 #define init_ERROR 0x02 ***it MISO=P2^0; ***it SCK=P2^1; ***it MOSI=P2^2; ***it CS=P2^3; void delayus(uint a) { while(--a); } void SPI_write(uchar dat) { uchar a; for(a=0;a<8;a++) { SCK=0; MOSI=dat&0x80; SCK=1; delayus(5); dat<<=1; } } uchar SPI_read() { uchar a,dat; for (a=0;a<8;a++) { SCK=0; delayus(5); SCK=1; dat<<=1; dat|=MISO; } return dat; } uchar SD_write_cmd(uchar *s) { uchar a,status,time=0; for(a=0;a<6;a++) SPI_write(s[a]); do { status=SPI_read(); time++; } while(time<100&&status!=0x01); return status; } uchar reset_SD() { uchar a,status; uchar restcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};//初始化指令 CS=1; for(a=0;a<10;a++)SPI_write(0xff);//至少74个时钟 ys(10); CS=0; do { status=SD_write_cmd(restcmd);//写初始化指令 a++; if(a==200) { CS=1; return reset_ERROR; //写入超时 } } while(status!=0x01); SPI_write(0xff);//额外加多八个时钟 CS=1; return 0; } void main() { uchar a; initial_lcd(); //初始化液晶屏 clear_screen(); //清屏函数 display_text("reseting...",0,0,2,0); //lcd显示 a=reset_SD(); if(a==0)display_text("OK! ",0,0,2,0); //进入spi模式成功 if(a==reset_ERROR)display_text("reset_ERROR",0,0,2,0);//进入失败 while(1); } 每次都失败! |
|
相关推荐
2个回答
|
|
|
帮顶。
|
|
|
|
|
|
我又改了一下。还是不行,哪里出了问题,用的是SD卡模块插座
#include "reg51.h" #include "delay.h" #define uchar unsigned char #define uint unsigned int #include "lcd12864.h" #define reset_ERROR 0x01 #define init_ERROR 0x02 ***it MISO=P2^0; ***it SCK=P2^1; ***it MOSI=P2^2; ***it CS=P2^3; void SPI_write(uchar dat) { uchar a; for(a=0;a<8;a++) { SCK=0; MOSI=dat&0x80; SCK=1; delayus(5); dat<<=1; } } uchar SPI_read() { uchar a,dat; for (a=0;a<8;a++) { SCK=0; delayus(5); SCK=1; dat<<=1; dat|=MISO; } return dat; } uchar SD_write_cmd(uchar *s) { uchar a,status,time=0; for(a=0;a<6;a++) SPI_write(s[a]); do { status=SPI_read(); time++; } while(time<100&&status!=0x01); return status; } uchar reset_SD() { uchar a,status,time; uchar restcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};//初始化指令 CS=1; for(a=0;a<100;a++) { SCK=0; ys(5); SCK=1; ys(5); } CS=0; for(time=0;time<200;time++) { for(a=0;a<6;a++)SPI_write(restcmd[a]); for(a=0;a<100;a++) { status=SPI_read(); if(status==0x01)break; } if(status==0x01)break; else if(time==199)return reset_ERROR; } CS=1; return 0; } void main() { uchar a; initial_lcd(); //初始化液晶屏 clear_screen(); //清屏函数 display_text("reseting...",0,0,2,0); a=reset_SD(); if(a==0)display_text("OK! ",0,0,2,0); if(a==reset_ERROR)display_text("reset_ERROR",0,0,2,0); while(1); { } } |
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4210浏览 3评论
2379浏览 0评论
3393浏览 0评论
1158浏览 0评论
2843浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 03:56 , Processed in 3.185983 second(s), Total 79, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4334