中的rSDIDAT寄存器地址定义有误.
最近想在2440a的一个bootloader中增加SD卡的读写功能,该bootloader的原始代码是官方的u2440amon,由于官方的2440a test程序中包含了SD Card的测试代码sdi.c和sdi.h,直接将这两个文件加进工程中,运行时确出现了问题。后来直接对官方的2440a_fw_testcode_rev06_040607和u2440amon_rev03_20040315进行了测试,将sdi.c和sdi.h从前者复制到后者,且加入到工程中,及增加测试调用,结果是前者测试正常,后者出现了问题,如图: https://bbs.21ic.com/upfiles/img/200711/2007112322516528.jpg 将相关的时钟、GPIO口、中断等所有能想到的都找了,还是没找出原因!后来没办法,只能对照数据手册上的寄存器说明,跟踪、分析代码,查看运行过程中有关的寄存器值。 程序死循环在Wt_Block函数中的Chk_DATend函数里,如下图: https://bbs.21ic.com/upfiles/img/200711/2007112322836630.jpg 原因是“Data Transfer Finish”位一直都没有置位,即写数据没有完成。原先以为是和时钟、I/O口等有关,但没找到原因,只好单步跟踪写数据的过程,分别跟踪test和mon两个工程的Wt_Block函数,查看寄存器值,后来发现他们有些不一样,特别是每次将数据写入rSDIDAT(SDI数据寄存器)时,umon中的0x5A00003C值就加1,后来终于在反汇编代码中发现,在umon中,rSDIDAT地址居然是0x5A00003C,而test中是0x5A000040,如下图: https://bbs.21ic.com/upfiles/img/200711/20071123221043789.jpg 请看图中的649行的最后一句反汇编代码,就是将数据写入rSDIDAT,在umon中,rSDIDAT地址为r3(0x5a000000)+0x3c;在test中为r3+0x40。所以就分别在mon、test该部分的源程序中双击选rSDIDAT,点右键的”go to macro declaration of rSDIDAT”跳到2440addr.h文件中的该定义出,发现如下图: https://bbs.21ic.com/upfiles/img/200711/2007112322141245.jpg 此时将该寄存器地址修改过来,再编译运行就正常了。 |