打印
[8/16-bit MCU]

单片机SPI模块读取SD卡

[复制链接]
2014|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hello_zkp|  楼主 | 2015-12-10 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在研究用飞思卡尔MC9S12XEP100单片机研究SPI读取SD卡,在SD卡初始化时,程序卡在接收不到SD卡的信息,程序如下:
byte SPI_Byte(byte value)
{
        while (!SPI0SR_SPTEF); //等待发送
        SPI0DR = value;
        while(!(SPI0SR_SPIF)); //等待接收
        return SPI0DR;
}
程序一直停在“while(!(SPI0SR_SPIF)); //等待接收”这一步,跳不出来;SD卡是好使的,是Kingston的2G SD卡;目前还未找到原因:'(

相关帖子

沙发
FSL_TICS_Jeremy| | 2015-12-10 11:14 | 只看该作者
SPI读取SD模式,更多是问题出自于时序步骤,建议楼主可以百度一下SPI 读取SD 卡步骤

使用特权

评论回复
板凳
hello_zkp|  楼主 | 2015-12-10 15:35 | 只看该作者
其实我是移植了开发板的演示代码,理论上没啥问题,我再分析分析

使用特权

评论回复
地板
李香兰| | 2015-12-10 20:38 | 只看该作者
这个操作和sd卡没有关系吧

使用特权

评论回复
5
hello_zkp|  楼主 | 2015-12-11 08:47 | 只看该作者
李香兰 发表于 2015-12-10 20:38
这个操作和sd卡没有关系吧

这个是SD卡模块初始化里的,该函数功能是往SD卡发送一个字节,并收到SD卡的返回值,关键就是卡在那个 while(!(SPI0SR_SPIF))处,跳不出来

使用特权

评论回复
6
NXP_TICS_Jeremy| | 2015-12-11 08:55 | 只看该作者
hello_zkp 发表于 2015-12-10 15:35
其实我是移植了开发板的演示代码,理论上没啥问题,我再分析分析

4楼的小伙伴提了个醒,在确认时序步骤正确的情况之前,必须保证你调用的函数是可行的

使用特权

评论回复
7
大头BB| | 2015-12-11 09:29 | 只看该作者
应该是SPI的问题,首先全部SPI函数是可用的。

使用特权

评论回复
8
hello_zkp|  楼主 | 2015-12-11 09:34 | 只看该作者
大头BB 发表于 2015-12-11 09:29
应该是SPI的问题,首先全部SPI函数是可用的。

楼主意思是SPI模块的硬件问题吗?我觉得有可能,因为使用开发板的出厂SD卡源程序也是会停在那一步。话说这开发板好贵啊:'(

使用特权

评论回复
9
hello_zkp|  楼主 | 2015-12-11 14:45 | 只看该作者
本帖最后由 hello_zkp 于 2015-12-11 14:48 编辑

补充一下,我是通过单步调试查到程序一直卡在 “while(!(SPI0SR_SPIF)); //等待接收” 的,查过一个论坛,有这种说法:
Hello,

When processing a single byte at a time, such as with the previous code snippet, the period that SPTEF flag remains low will be very short, typically a few bus cycles only.  During debug, it is therefore unlikely  that you would ever observe the flag being cleared.

However, you should not single step through the function for another reason.  The monitoring of the SPISR and SPIDR registers by the debugger can inadvertently cause the SPIF flag to be cleared prior to  the wait loop being exited.  The function will then never exit.

Regards,
Mac

以前很多其他程序也是用单步调试来排错的,现在有些困惑了

使用特权

评论回复
10
风的样子| | 2015-12-12 17:36 | 只看该作者
我觉得你这个程序还没有到初始化sd的步骤,还是SPI有没有调试好的问题

使用特权

评论回复
11
hello_zkp|  楼主 | 2015-12-14 11:33 | 只看该作者
风的样子 发表于 2015-12-12 17:36
我觉得你这个程序还没有到初始化sd的步骤,还是SPI有没有调试好的问题

谢谢你的建议!

使用特权

评论回复
12
hello_zkp|  楼主 | 2015-12-14 11:40 | 只看该作者
我现在解决了此问题,把问题的过程总结给大家,希望有帮助:
之前分别怀疑SD卡和飞思卡尔(现在叫恩智浦)XEP100单片机SPI的问题,我首先利用万用表测试XEP100开发板的SD卡硬件电路,没有发现问题,再使用SPI1模块替代SPI0模块,结果还是出现“一直卡在while(!(SPI0SR_SPIF)); //等待接收”的问题,怀疑是SPI的问题,后使用XS128的开发板,并借用XEP100开发板的SD卡硬件模块,调试后能正常读写SD卡;最后将XS128的SPI初始化移植给XEP100,也能够实现正常读写SD卡。
比较2种单片机SPI初始化程序,问题出在“SPI0CR2 = 0x10;”之前一直是“SPI0CR2 = 0x00;”所以其中MODFEN位要置1,SSOE也要置1。此外,此处用单步调试不行,会导致程序一直卡在“while(!(SPI0SR_SPIF)); //等待接收”处,至于为什么还不是很清楚。
最后,谢谢大家给我的建议和讨论。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

29

帖子

2

粉丝