马潮老师紧急求助!!!关于SD卡的问题
马老师您好,我正在学习您的第二版书里关于wave播放器的程序,是那个报站的,demo19—2里的程序,情况是这样,我用的时候SD卡初始化的成功率极低,50次可能才有一次两个灯都常亮,读卡正不正确的那个灯老是闪,有的时候可以有的时候不可以,成功概率低是什么问题麻烦您解答一下!!!我用的是网上直接可以买的SD卡模块,解法肯定正确,就是判断卡里有没有卡的PB.0我直接接的低,每次都是卡插好了才上电打开单片机。
SD卡我选用的两种:一张4G的SD;一张2G的mini SD 接的SD adapter
两张卡情况一样,初始化成功机率低。
我用的8m的内部RC时钟,程序未做任何修改。
情况就是这样
麻烦老师了! 马潮老师,在吗?麻烦了 我测试了一下,在FRESULT pf_mount ( FATFS *fs /* Pointer to new file system object (NULL: Unmount) */
)
这个函数中,if (disk_initialize() & STA_NOINIT) /* Check if the drive is ready or not */
{
return FR_NOT_READY;
}
跳到这个判断里了
然后再看 disk_initialize() 这个函数,
执行这个判断时 if (send_cmd(CMD0, 0) == 1) 条件不成立
再看执行 send_cmd(CMD0, 0) 时
这个判断 if (cmd & 0x80) 不成立
虽然我不知道是什么原因,但请问是不是 晶振 的问题
我用的是内部 8M的RC
我对SD的通信原理还不懂,请帮帮我!!!谢谢了 难道是模块不行?因为有几次成功了~~~
1.马潮老师用的晶振不是8M的 ,而是根据需要算出来的 11.2896M... 用12M的可以
2.SD卡模块 一般只用了四个引脚 马潮老师上面还用到了卡套上的10引脚 用来判断是否插入卡,楼主程序没做什么修改 应该是直接把PB.0 引脚拉低
3.FAT32文件系统楼主要不不懂,还是学习一下吧
4.马老师如果要是来的话 可能会建议你从基础学起,如果连一些基本的原理都不懂只做伸手党的话 马老师可能会说 把你手上的书烧了吧
男小北 发表于 2014-1-6 19:28
1.马潮老师用的晶振不是8M的 ,而是根据需要算出来的 11.2896M... 用12M的可以
2.SD卡模块 一般只用了四个引脚 马潮老师上面还用到了卡套上的10引脚 用来判断是否插入卡,楼主程序没做什么修改 应该是直接把PB.0 引脚拉低
3.FAT32文件系统楼主要不不懂,还是学习一下吧
4.马老师如果要是来的话 可能会建议你从基础学起,如果连一些基础的东西不懂只做伸手党的话 马老师可能会说 把你手上的书烧了吧
我的回复:
你好,谢谢你的回复,我是初学者,想一步一步的看懂老师的代码,
现在我想先解决的问题是怎样让SD卡初始化正常,我反复傻傻的试有几次让SD初始成功,肯定是碰巧啦
对于第一个问题是这样,老师用11.2896M的晶振,而我用8M的内部,也能成功是不是说,其实对于SD卡的数据传输
晶振的差别只在传输速率上,在成功与否上没有差别?在这里我的晶振慢应该是导致播放音乐时不好听,拖。对吗?
对于您说的第二点,我是把引脚拉低,但是看程序,我感觉这样应该没有问题吧?
最后我想弄懂的问题是,我在三楼说的,我自己试了一下程序,是什么原因导致问题这样发生的?
希望您能予以帮助,谢谢!!!
本帖最后由 machao 于 2014-1-7 09:00 编辑
你首先检查硬件连接是否正确。买的SD卡模块要注意它使用5V还是3.3V的电压。SD卡只能工作在3.3V,如果采用5V供电,需要对相应的接口进行分压处理。
要注意,电压不对会损坏SD卡的。
sd卡里的文件请拷贝使用我参考里面的文件,因为我的例子读取文件名是特定的,不是任何文件名都读
另外我的代码中有采用USART输出信息进行调试的,开关在H文件中,你可以参考,在相应的地方加上USART输出一些调试信息,看看具体处理到哪步出问题。
如果真是初学者,这个例子还是有点难度的。 wzh20042005 发表于 2014-1-6 19:45
男小北 发表于 2014-1-6 19:28
1.马潮老师用的晶振不是8M的 ,而是根据需要算出来的 11.2896M... 用12M ...
也许Lz真需要补一些基础,否则你看代码再翻译回 sd的基本原理,难度可想而知 machao 发表于 2014-1-6 21:45
你首先检查硬件连接是否正确。买的SD卡模块要注意它使用5V还是3.3V的电压。SD卡只能工作在3.3V,如果采用5V ...
谢谢老师回复,是这样,我的模块是5v和3v供电均可的,连线没有问题,
程序里我把USART的那个给不要了,读文件名的程序做了修改,原来是必须要有报站的文件才会正常
现在不需要了,昨晚用普通的mini SD卡2G的格式化成 文件系统FAT ,分配单元大小:32kb
这时候一切正常,完全可以正常使用,后来我把别的mini SD卡2G的格式化成 文件系统FAT ,分配单元大小:32kb却不能使用,只有之前的那一块认得到
我使用能认得到的卡来播放,声音很拖,我想问一下这是晶振的原因吗,是读卡速度因为我8M的时钟不够?
还是因为8M的时钟在更新PWM波时速度不够?可是我改过它的中断速度了,源程序是时钟1 不分频 比较用0CR1A=0xFE;
我从0x7e试到0x2e 声音都没变化几乎~~~~
myxiaonia 发表于 2014-1-6 23:24
也许Lz真需要补一些基础,否则你看代码再翻译回 sd的基本原理,难度可想而知 ...
确实,我本身学习能力也不强,不过对这个内容很感兴趣,想好好学习!
看了FAT 的内容确实感觉有些吃力 数据线有加上拉电阻了吗,我以前就碰到过忘加上拉电阻,低容量的卡使用正常,高容量的不正常的情况! bujie8010 发表于 2014-1-7 10:29
数据线有加上拉电阻了吗,我以前就碰到过忘加上拉电阻,低容量的卡使用正常,高容量的不正常的情况! ...
请问您是买的模块还需要上拉电阻,还是自己焊的呢?
我买的是这样的模块:看原理图应该本身已经接了吧,我不知道是不是
您看看
bujie8010 发表于 2014-1-7 10:29
数据线有加上拉电阻了吗,我以前就碰到过忘加上拉电阻,低容量的卡使用正常,高容量的不正常的情况! ...
模块要是没焊错的话应该是加了的 wzh20042005 发表于 2014-1-7 10:22
确实,我本身学习能力也不强,不过对这个内容很感兴趣,想好好学习!
看了FAT 的内容确实感觉有些吃力 ...
有时间的话学一下没时间的话拿来用得了毕竟搞这种驱动还是很麻烦的usb的特恶心我上次光是搞usb的msc类就搞了一个月 还是对照例程库学习的 值得研究。 wzh20042005 发表于 2014-1-7 10:21
谢谢老师回复,是这样,我的模块是5v和3v供电均可的,连线没有问题,
程序里我把USART的那个给不要了, ...
基础是非常重要的,没有牢固和广泛的基础,关拿个代码参考是不行的。
播放WAW音频,首先PWM的频率应该与WAV音频的采样频率相同,比如WAV音频是8K的,PWM就应该8K,如果WAV是44.1K,那么PWM频率就必须是44.1K.
使用8M系统时钟的话,根本不能产生44.1K的PWM波,因为8位PWM频率最高是8M/256 = 31.25K.
如果你播放44.1K的WAV音频,那么首先保证PWM频率是44.1K,另外还必须保证程序能及时读出SD卡的数据,并进行处理(比如双声道16位的数据,转化成单声道8位数据),然后每44.1K更换PWM的占空比数据,如果跟不上声音肯定变粗变慢。
采用8位的MCU作这个DD,需要比较高的系统设计能力,包括硬件和软件。如果没有一定的能力,就是使用32位的MCU,作出的效果也很难达到商用的程度。
我的代码实际还可以优化的。在我的例程代码中,使用SPI的硬件接口,已经设置SPI时钟工作在最高频率了,就是要保证能最快的读SD卡,但是SPI的操作中还是采用了轮询等待的方式,这样MCU的效率就打了折扣。
如果能使用SPI中断方式操作,效率会更好,但程序设计要求更难了。
这个也是属于特种兵训练的项目。 wzh20042005 发表于 2014-1-7 10:59
请问您是买的模块还需要上拉电阻,还是自己焊的呢?
我买的是这样的模块:看原理图应该本身已经接了吧, ...
这个模块的电路非常清除,SD卡工作电压是3.3V。
如果你的MCU系统也是3.3V,可以直接连接SD卡的数据口,电压直接连接3.3V的输入。
如果你的MCU系统是5V,要连接是要注意,电源连接SD卡的5V端(模块上有5-3V的转换),但MCU的I/O口不能直接连接SD卡的数据口,需要分压。
这个分压电路在这个模块上有,旁边有一组连接接口,应该对照电路,正确连接,如果出错,会损坏SD卡的。千万注意。
页:
[1]