您的位置 首页 模拟

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

关于裸机调试i2c记录,遇到了不少的问题。现在都已经解决了。记录一下。1.整体的规划既然是学习某个硬件的功能,我觉得就应…

关于裸机调试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了。这个还要专门总结一个文章。再然后便是遇到了。再后来遇到的问题调试的时分,在不关机的时分连着读两次就出第2次读出来的便是FF,我还以为是延时时刻不恰当造成了,来回调试良久不能处理。不过一直是周期性的,假设0地址处内容为0x12,第一次读是0x12,第2次0xff,第三次0x12,第四次0xff。。。假如我调试一次关机重启一次就不会呈现这个问题。这阐明是内涵中残留了什么东西影响第2次的成果。这个也不好说。
在最终想起来这个FF也很有代表性,为什么便是FF而不是其它呢?由于就想知道它究竟误读了哪里的数据。就想起来在在AT24C08中每个地址处写入不同的数据,看读到哪个数据了,就能确认方位了。就烧写linux体系,运转了开发板上带的软件,顺次写入了0x00 —> 0xff ,便是每个值都不相同。
再回到裸机运转时分,漏洞就暴露出来了,读1地址处的1后,再读1地址处值时变为了2地址处的值。这个阐明IICDS中的值引起的。在进行第2次运转时分,把第一次残留的在IICDS中的值,当作了第2次读发送的地址值。
调整了一下赋值发送次序,处理了这个问题。然后就扩展一个写入10个数,再读出来。最终就定版别为这个了。下边是最终调试截图:

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/265178.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部