新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Eclipse開發(fā)調(diào)試ARM裸機(jī)程序(六)關(guān)于裸機(jī)調(diào)試i2c記錄

Eclipse開發(fā)調(diào)試ARM裸機(jī)程序(六)關(guān)于裸機(jī)調(diào)試i2c記錄

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
關(guān)于裸機(jī)調(diào)試i2c記錄,遇到了不少的問題?,F(xiàn)在都已經(jīng)解決了。記錄一下。

1.整體的規(guī)劃

既然是學(xué)習(xí)某個(gè)硬件的功能,我覺得就應(yīng)該能用最簡的代碼來在不涉及其它硬件的情況下,做出來。所以我的規(guī)劃是在僅有的:中斷,IIC,再順便加一個(gè)LED就來實(shí)現(xiàn)。不加SDRAM,不設(shè)置clock,不涉及NandFlash,不涉及NorFlash,不涉及MMU重映射。就用S3C2440內(nèi)部的4K SRAM來完成。

2.現(xiàn)有資源

從零寫太難了,就先找找現(xiàn)有資源。1,有韋東山的代碼:操作的是一個(gè)時(shí)鐘芯片,而我的mini2440用的是AT24C08,一個(gè)EEPROM,還有一個(gè)不一樣的NandFlash。2,有一個(gè)以前從國嵌MDK下移植到RVDS下代碼:是針對(duì)AT24C08的,沒有啟動(dòng)代碼,只可以借助JLINK等工具,在SDRAM中調(diào)試。并且底層都是SUNSAMG的代碼。

3.自己的工作

結(jié)合思路,韋東山的底層(中斷了,堆棧指針)的做的比較透明。再次看了它的按鍵中斷的完整實(shí)現(xiàn)代碼。結(jié)合國嵌的初始化代碼開始了我的探索之路。分三塊a:init(初始化);b:read(讀); c:write(寫)。先是在原來的按鍵中斷的main函數(shù)中添加了init部分。然后調(diào)試查看,初始化用的寄存器都有沒有按照要求設(shè)置(改動(dòng)之處就是把原來的以PCLK為50MHz做的I2C頻率設(shè)置改為了12MHz匹配的)。然后就是read,到一定的位置,是一定會(huì)進(jìn)入中斷的。然后,調(diào)試能不能進(jìn)入中斷(中間很曲折)。中斷能進(jìn)之后就在中斷中將全局變量變?yōu)?,但是就在這里也出現(xiàn)了問題,就是這個(gè)全局變量不能改變。這使我郁悶了一下午,最后想起來,全局變量是存在BSS段中的,而我的全裸的程序沒有操作系統(tǒng)來幫忙設(shè)置這個(gè)東西。自己不做就沒人幫忙做。結(jié)合韋東山的IIC代碼,u-boot中的代碼。知道了要清理一下BSS段就可以用了,所謂清理現(xiàn)在說來就是清零。
明白了原因,解決就相比順利多了,添加一個(gè)lds鏈接腳本,弄一個(gè)bss_start bss_end,然后在程序中把bss_start到bss_end內(nèi)存清零就OK了。這個(gè)還要專門總結(jié)一個(gè)文章。再然后就是遇到了。再后來遇到的問題調(diào)試的時(shí)候,在不關(guān)機(jī)的時(shí)候連著讀兩次就出第二次讀出來的就是FF,我還以為是延時(shí)時(shí)間不恰當(dāng)造成了,來回調(diào)試好久不能解決。不過一直是周期性的,假如0地址處內(nèi)容為0x12,第一次讀是0x12,第二次0xff,第三次0x12,第四次0xff。。。如果我調(diào)試一次關(guān)機(jī)重啟一次就不會(huì)出現(xiàn)這個(gè)問題。這說明是內(nèi)在中殘留了什么東西影響第二次的結(jié)果。這個(gè)也不好說。
在最后想起來這個(gè)FF也很有代表性,為什么就是FF而不是其它呢?因?yàn)榫拖胫浪降渍`讀了哪里的數(shù)據(jù)。就想起來在在AT24C08中每個(gè)地址處寫入不同的數(shù)據(jù),看讀到哪個(gè)數(shù)據(jù)了,就能確定位置了。就燒寫linux系統(tǒng),運(yùn)行了開發(fā)板上帶的軟件,依次寫入了0x00 ---> 0xff ,就是每個(gè)值都不一樣。
再回到裸機(jī)運(yùn)行時(shí)候,破綻就暴露出來了,讀1地址處的1后,再讀1地址處值時(shí)變?yōu)榱?地址處的值。這個(gè)說明IICDS中的值引起的。在進(jìn)行第二次運(yùn)行時(shí)候,把第一次殘留的在IICDS中的值,當(dāng)作了第二次讀發(fā)送的地址值。
調(diào)整了一下賦值發(fā)送順序,解決了這個(gè)問題。然后就擴(kuò)展一個(gè)寫入10個(gè)數(shù),再讀出來。最后就定版本為這個(gè)了。下邊是最后調(diào)試截圖:


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

本文引用地址:http://butianyuan.cn/article/201611/318232.htm


評(píng)論


技術(shù)專區(qū)

關(guān)閉