Eclipse開(kāi)發(fā)調(diào)試ARM裸機(jī)程序(六)關(guān)于裸機(jī)調(diào)試i2c記錄
1.整體的規(guī)劃
既然是學(xué)習(xí)某個(gè)硬件的功能,我覺(jué)得就應(yīng)該能用最簡(jiǎn)的代碼來(lái)在不涉及其它硬件的情況下,做出來(lái)。所以我的規(guī)劃是在僅有的:中斷,IIC,再順便加一個(gè)LED就來(lái)實(shí)現(xiàn)。不加SDRAM,不設(shè)置clock,不涉及NandFlash,不涉及NorFlash,不涉及MMU重映射。就用S3C2440內(nèi)部的4K SRAM來(lái)完成。
2.現(xiàn)有資源
從零寫(xiě)太難了,就先找找現(xiàn)有資源。1,有韋東山的代碼:操作的是一個(gè)時(shí)鐘芯片,而我的mini2440用的是AT24C08,一個(gè)EEPROM,還有一個(gè)不一樣的NandFlash。2,有一個(gè)以前從國(guó)嵌MDK下移植到RVDS下代碼:是針對(duì)AT24C08的,沒(méi)有啟動(dòng)代碼,只可以借助JLINK等工具,在SDRAM中調(diào)試。并且底層都是SUNSAMG的代碼。
3.自己的工作
結(jié)合思路,韋東山的底層(中斷了,堆棧指針)的做的比較透明。再次看了它的按鍵中斷的完整實(shí)現(xiàn)代碼。結(jié)合國(guó)嵌的初始化代碼開(kāi)始了我的探索之路。分三塊a:init(初始化);b:read(讀); c:write(寫(xiě))。先是在原來(lái)的按鍵中斷的main函數(shù)中添加了init部分。然后調(diào)試查看,初始化用的寄存器都有沒(méi)有按照要求設(shè)置(改動(dòng)之處就是把原來(lái)的以PCLK為50MHz做的I2C頻率設(shè)置改為了12MHz匹配的)。然后就是read,到一定的位置,是一定會(huì)進(jìn)入中斷的。然后,調(diào)試能不能進(jìn)入中斷(中間很曲折)。中斷能進(jìn)之后就在中斷中將全局變量變?yōu)?,但是就在這里也出現(xiàn)了問(wèn)題,就是這個(gè)全局變量不能改變。這使我郁悶了一下午,最后想起來(lái),全局變量是存在BSS段中的,而我的全裸的程序沒(méi)有操作系統(tǒng)來(lái)幫忙設(shè)置這個(gè)東西。自己不做就沒(méi)人幫忙做。結(jié)合韋東山的IIC代碼,u-boot中的代碼。知道了要清理一下BSS段就可以用了,所謂清理現(xiàn)在說(shuō)來(lái)就是清零。
明白了原因,解決就相比順利多了,添加一個(gè)lds鏈接腳本,弄一個(gè)bss_start bss_end,然后在程序中把bss_start到bss_end內(nèi)存清零就OK了。這個(gè)還要專(zhuān)門(mén)總結(jié)一個(gè)文章。再然后就是遇到了。再后來(lái)遇到的問(wèn)題調(diào)試的時(shí)候,在不關(guān)機(jī)的時(shí)候連著讀兩次就出第二次讀出來(lái)的就是FF,我還以為是延時(shí)時(shí)間不恰當(dāng)造成了,來(lái)回調(diào)試好久不能解決。不過(guò)一直是周期性的,假如0地址處內(nèi)容為0x12,第一次讀是0x12,第二次0xff,第三次0x12,第四次0xff。。。如果我調(diào)試一次關(guān)機(jī)重啟一次就不會(huì)出現(xiàn)這個(gè)問(wèn)題。這說(shuō)明是內(nèi)在中殘留了什么東西影響第二次的結(jié)果。這個(gè)也不好說(shuō)。
在最后想起來(lái)這個(gè)FF也很有代表性,為什么就是FF而不是其它呢?因?yàn)榫拖胫浪降渍`讀了哪里的數(shù)據(jù)。就想起來(lái)在在AT24C08中每個(gè)地址處寫(xiě)入不同的數(shù)據(jù),看讀到哪個(gè)數(shù)據(jù)了,就能確定位置了。就燒寫(xiě)linux系統(tǒng),運(yùn)行了開(kāi)發(fā)板上帶的軟件,依次寫(xiě)入了0x00 ---> 0xff ,就是每個(gè)值都不一樣。
再回到裸機(jī)運(yùn)行時(shí)候,破綻就暴露出來(lái)了,讀1地址處的1后,再讀1地址處值時(shí)變?yōu)榱?地址處的值。這個(gè)說(shuō)明IICDS中的值引起的。在進(jìn)行第二次運(yùn)行時(shí)候,把第一次殘留的在IICDS中的值,當(dāng)作了第二次讀發(fā)送的地址值。
調(diào)整了一下賦值發(fā)送順序,解決了這個(gè)問(wèn)題。然后就擴(kuò)展一個(gè)寫(xiě)入10個(gè)數(shù),再讀出來(lái)。最后就定版本為這個(gè)了。下邊是最后調(diào)試截圖:
代碼:http://download.csdn.net/detail/kangear/5264969
本文引用地址:http://m.butianyuan.cn/article/201611/318232.htm
評(píng)論