现在的位置: 首页 > 综合 > 正文

Eclipse开发调试ARM裸机程序(六)关于裸机调试i2c记录

2013年10月11日 ⁄ 综合 ⁄ 共 1476字 ⁄ 字号 评论关闭
 关于裸机调试i2c记录
        关于裸机调试i2c记录,遇到了不少的问题。现在都已经解决了。记录一下。

1.整体的规划

      既然是学习某个硬件的功能,我觉得就应该能用最简的代码来在不涉及其它硬件的情况下,做出来。所以我的规划是在仅有的:中断,IIC,再顺便加一个LED就来实现。不加SDRAM,不设置clock,不涉及NandFlash,不涉及NorFlash,不涉及MMU重映射。就用S3C2440内部的4K SRAM来完成。

2.现有资源

      从零写太难了,就先找找现有资源。1,有韦东山的代码:操作的是一个时钟芯片,而我的mini2440用的是AT24C08,一个EEPROM,还有一个不一样的NandFlash。2,有一个以前从国嵌MDK下移植到RVDS下代码:是针对AT24C08的,没有启动代码,只可以借助JLINK等工具,在SDRAM中调试。并且底层都是SUNSAMG的代码。

3.自己的工作

      结合思路,韦东山的底层(中断了,堆栈指针)的做的比较透明。再次看了它的按键中断的完整实现代码。结合国嵌的初始化代码开始了我的探索之路。分三块a:init(初始化);b:read(读); c:write(写)。先是在原来的按键中断的main函数中添加了init部分。然后调试查看,初始化用的寄存器都有没有按照要求设置(改动之处就是把原来的以PCLK为50MHz做的I2C频率设置改为了12MHz匹配的)。然后就是read,到一定的位置,是一定会进入中断的。然后,调试能不能进入中断(中间很曲折)。中断能进之后就在中断中将全局变量变为1,但是就在这里也出现了问题,就是这个全局变量不能改变。这使我郁闷了一下午,最后想起来,全局变量是存在BSS段中的,而我的全裸的程序没有操作系统来帮忙设置这个东西。自己不做就没人帮忙做。结合韦东山的IIC代码,u-boot中的代码。知道了要清理一下BSS段就可以用了,所谓清理现在说来就是清零。
       明白了原因,解决就相比顺利多了,添加一个lds链接脚本,弄一个bss_start  bss_end,然后在程序中把bss_start到bss_end内存清零就OK了。这个还要专门总结一个文章。再然后就是遇到了。再后来遇到的问题调试的时候,在不关机的时候连着读两次就出第二次读出来的就是FF,我还以为是延时时间不恰当造成了,来回调试好久不能解决。不过一直是周期性的,假如0地址处内容为0x12,第一次读是0x12,第二次0xff,第三次0x12,第四次0xff。。。如果我调试一次关机重启一次就不会出现这个问题。这说明是内在中残留了什么东西影响第二次的结果。这个也不好说。
      
       在最后想起来这个FF也很有代表性,为什么就是FF而不是其它呢?因为就想知道它到底误读了哪里的数据。就想起来在在AT24C08中每个地址处写入不同的数据,看读到哪个数据了,就能确定位置了。就烧写linux系统,运行了开发板上带的软件,依次写入了0x00 ---> 0xff ,就是每个值都不一样。
       再回到裸机运行时候,破绽就暴露出来了,读1地址处的1后,再读1地址处值时变为了2地址处的值。这个说明IICDS中的值引起的。在进行第二次运行时候,把第一次残留的在IICDS中的值,当作了第二次读发送的地址值。
       调整了一下赋值发送顺序,解决了这个问题。然后就扩展一个写入10个数,再读出来。最后就定版本为这个了。下边是最后调试截图:

代码:http://download.csdn.net/detail/kangear/5264969

抱歉!评论已关闭.