今天调通了,没有改波特率。找到了一处不合适的地方,把那个改了,就好了。 有一个函数: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,不知道为什么。。。。唉,又被卡住了,不知道错哪了。。。