您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF533对SD卡驱动,遇到JUMP.S __unknown_ex... 
本帖共有575个阅读者
发表帖子 发表投票 回复主题
BF533对SD卡驱动,遇到JUMP.S __unknown_exception_occurred 问题
hnwxc00(论坛新手)
hnwxc00
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:124
积分:4
注册时间:2013/4/24
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF533对SD卡驱动,遇到JUMP.S __unknown_exception_occurred 问题

大家好,

我在尝试用BF533驱动SD卡,使其工作在SPI模式,SD卡是4GB的SDHC卡。初始化的步骤都正确,如:发送cmd0,收到正确回复0x01,即SD卡进入空闲状态;发送CMD8,查询SD卡支持的电压;发送cmd55+acmd41,收到正确回复0x00,即SD已经激活,可以读写了。



遇到的问题是:以上的函数都是写在SD_Initialize()中的,点step into或run to cursor去一点一点调试,往下运行,都没问题,发送命令后都能得到预期的回复。但是运行到SD_Initialize()的最后一行时,就会出现死循环,无法从SD_Initialize()中出来。EMUEXCPT ---IDLE---CSYNC ---JUMP.S __unknown_exception_occurred ---EMUEXCPT ---IDLE等等。OUTPUT WINDOW里显示:Target halted due to software breakpoint but no breakpoint found at address: 0xffa01a48。

程序看起来没有问题,不知道错误在哪里,求大神指导~~我的工程在附件里,求查错~~


上传的附件
   2013424113907.rar [ 91.02 KB ]


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/24 11:06:44
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPI对容量大的卡支持的不是很好,你尝试将SPI波特率配置值550,试试看能通过不。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/4/24 12:45:59
hnwxc00(论坛新手)
hnwxc00
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:124
积分:4
注册时间:2013/4/24
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢啦~    您是说在SD卡激活之前SPI_BAUD设置为550么?   我看网上的资料说,SD卡在激活之前,时钟频率要尽量低,激活之后,时钟频率要调高。激活之前,我设置的
SPI_BAUD 是0x141=321,这是老师给我的参考值,我就这么设置了。激活之后,我设置的
SPI_BAUD是3。我也不知道这两个值设置的合不合适。        我明天去实验室试一下您说的方法。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/24 17:02:45
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
建议你先找一个2G以下的卡试试,调通了再换大卡。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/4/24 20:57:04
hnwxc00(论坛新手)
hnwxc00
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:124
积分:4
注册时间:2013/4/24
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
今天调通了,没有改波特率。找到了一处不合适的地方,把那个改了,就好了。   有一个函数:uint8 SD_SendCmd(uint8 cmd, uint8 *param, uint8 resptype, uint8 *resp)。
在发CMD8的时候,接收回复出现了不妥的地方。
错误的写法:
uint8 param[4] = {0xAA,0x01,0,0},resp;
SD_SendCmd(CMD8, param, CMD8_R, &resp);
正确的写法:
uint8 param[4] = {0xAA,0x01,0,0},resp[5];
SD_SendCmd(CMD8, param, CMD8_R, resp);
之前没注意到这个问题,因为发其他CMD的时候,都是这么接收回复的。如CMD0,CMD55等等的回复都是1个字节,但是这里,CMD8的回复不是一个字节,而是5个字节。这么写貌似不对。虽然能收到正确的回复,但是最后会出现JUMP.S __unknown_exception_occurred的问题。总之改了这个地方,程序就通了。。。。。。
这个地方通了,但往下又遇到了新问题。我用WINHEX事先查好了一个图像所在的扇区,读数据的时候,我用CMD17,命令参数写成逻辑扇区号,读出一堆0;我又尝试写成物理扇区号,重新编译,运行,还是读出一堆0;但是下面,奇怪的事情发生了,我把参数再改成逻辑扇区号,重新编译,运行,竟然读出了那个图像。。。。。后来我发现,只有使用红色字体这个流程,才能读出正确的数据,太奇怪了,如果单独读一次,不论写什么逻辑扇区号,还是物理扇区号,读出来都是0,不知道为什么。。。。唉,又被卡住了,不知道错哪了。。。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/27 21:39:30
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159944 Call, 1 Queries, Processed in 0.019531 second(s),