1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本人用的芯片是dsPIC33EP256MC504,程序如下,可是给SD卡写入CMD0后,返回的值为何是0x00,不是0x01;
/*配置SPI1端口寄存器(主模式)*/ void Spi1Init(void) { TRISAbits.TRISA4 = 1; //SPIDO输出 TRISAbits.TRISA9 = 0; //SPIDI输入 TRISCbits.TRISC3 = 0; //SPICK为输出 TRISBbits.TRISB0 = 0; //SPISS为输出 // IFS0bits.SPI1IF = 0; // IEC0bits.SPI1IE = 0; SPI1CON1 = 0x0460; //使用内部SPI时钟 //SDO1引脚由模块控制 //采用字宽通信 //在数据输出时间的末端采样输入数据 //串行输出数据在时钟从空闲状态转变为工作状态时变化 //空闲状态时时钟信号为高电平,工作状态时为低电平 //辅助预分频比8:1 //主预分频比64:1 //主模式 // IFS0bits.SPI1IF = 0; // IEC0bits.SPI1IE = 1; SPI1STATbits.SPIEN = 1; //使能SPI1模块 } /*写一个字节函数*/ void SpiWriteByte(u8 TxData) { SPI1BUF = TxData; //待发送数据装载待发送寄存器中 while(!SPI1STATbits.SPIRBF); //等待接收完成 //IFS0bits.SPI1IF = 0; //清零中断标志 } /*读一个字节函数*/ u8 SpiReadByte(void) { /*读取数据前必须先向SPIBUF中写入一个空数据*/ SPI1BUF = 0xFF; while(!SPI1STATbits.SPIRBF); //等待接收数据 return SPI1BUF; } /*发送命令函数*/ u8 SdSendCommand(u8* cmd) { u8 num, r = 0; while(SpiReadByte() == 0xFF); //等待SD卡准备好 SpiWriteByte(cmd[0]); //写入序列号 SpiWriteByte(cmd[1]); //数据段第4个字节 SpiWriteByte(cmd[2]); //数据段第3个字节 SpiWriteByte(cmd[3]); //数据段第2个字节 SpiWriteByte(cmd[4]); //数据段第1个字节 SpiWriteByte(cmd[5]); //CRC校验和 num = 0; do { r = SpiReadByte(); num ++; }while((r == 0xFF) && (num < 200)); //等待响应 return r; //返回状态位 } /*发送命令函数*/ u8 SdSendCommand(u8* cmd) { u8 num, r = 0; while(SpiReadByte() == 0xFF); //等待SD卡准备好 SpiWriteByte(cmd[0]); //写入序列号 SpiWriteByte(cmd[1]); //数据段第4个字节 SpiWriteByte(cmd[2]); //数据段第3个字节 SpiWriteByte(cmd[3]); //数据段第2个字节 SpiWriteByte(cmd[4]); //数据段第1个字节 SpiWriteByte(cmd[5]); //CRC校验和 num = 0; do { r = SpiReadByte(); num ++; }while((r == 0xFF) && (num < 200)); //等待响应 return r; //返回状态位 } /*SD卡的初始化*/ u8 SdInit(void) { u8 i, time, r1 = 0; /*初始化SPI的IO口和SPI模式*/ Spi1Init(); u8 cmd0[6] ={0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0,将SD卡从默认上电后的SD模式切换到SPI模式,使SD卡进入IDLE状态 /*SD卡复位,进入SPI模式,使用CMD0*/ cs = 1; //发送74个时钟之前要禁止SD卡 for(i = 0; i < 10; i ++) //在向SD卡发送数据之前,必需先SD发送至少74个时钟 { SpiWriteByte(0xFF); //发送了80个时钟 } /*发送CMD0进行复位*/ time = 0; cs = 0; do { r1 = SdSendCommand(cmd0); //写入CMD0 time ++; //用来计时是否超时 }while((r1 != 0x01) && (time < 200)); if(time >= 200) { return (INIT_CMD0_ERROR); //CMD0写入失败 } cs = 1; SpiWriteByte(0xFF); //写入指令后附加8个填充时钟 } 求大神帮助…… |
|
相关推荐
5个回答
|
|
发现还是IO口的连接问题,在这里提醒大家,单片机的IO一定要连接到SD卡的OI……当时大意了
|
|
|
|
我现在也遇到了类似的问题。。我用的是PIC18F46K22,SD卡发送cmd0后,收到的返回值总是不对的!返回值原来是0x13后来变成0x33,现在又成了0x40.。不知道哪里有问题啊!!烦死了都!!
|
|
|
|
SPI分频多少啊??估计是频率太高了……400KHz一下,一般我都是128kHZ |
|
|
|
|
|
你好,我先在遇到另一个问题,我发送CMD0.CMD8,CMD55都能都收到回复0X01,这表示SD卡处在空闲状态是吧,但是,发动ACMD41就收不到正确的回复值,不知道为什么,不知道你有没有遇到过这种问题!!!求指教!!万分感谢
|
|
|
|
只有小组成员才能发言,加入小组>>
4018 浏览 0 评论
8603 浏览 0 评论
5994 浏览 0 评论
4161 浏览 1 评论
5227 浏览 0 评论
请问一下qspi mtsr引脚传输一次32bit后引脚不拉低怎么解决?
438浏览 2评论
688浏览 2评论
4832浏览 2评论
最近UJA1023开发遇到问题了,各位大神有谁知道可以替代这颗芯片的
615浏览 1评论
851浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 22:41 , Processed in 0.603908 second(s), Total 86, Slave 70 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号