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

  关于裸机调试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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值