開始弄2440的裸機編程,爭取盡快從最底層把這些硬件都熟悉掌握。
最初始從配置裸機開發環境開始的,本來想用jlink+ADS來進行下載,結果用ADS的調試器AXD通過jlink進行下載的時候,軟件總是出現各種問題,這個問題折騰了有10天的時間,浪費了很長時間,最后重裝了系統,都沒有搞定。最后決定還是通過ADS來編譯,然后用supervivi來進行下載了。現在經常出現的問題是 usb下載器總是識別不到,而且有時會導致電腦重啟,應該是友善之臂提供的usb的驅動的問題,這些問題經常導致我折騰很長時間,心情很沮喪。有碰到并解決了類似問題的同學可以給我留個言。閑話少敘。
最開始寫了uart的驅動試驗,然后做了iic和iis的試驗。先記錄iic的試驗,以后再補上uart的部分。
IIC(Inter-Integrated Circuit,I2C)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微處理器及其外圍設備,它只需要數據線SDA和時鐘線SCL,就能夠實現CPU與被控IC之間、IC與IC之間進行雙向傳送。
s3c2440內部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設備提供了便利。它具有四種操作模式:主設備發送模式、主設備接收模式、從設備發送模式和從設備接收模式。在這里我們只把s3c2440當做IIC總線的主設備來使用,因此只介紹前兩種操作模式。
在主設備發送模式下,它的工作流程為:
1. 配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xF0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要繼續發送數據,那么在接收到應答信號后,再把待發送的數據寫入寄存器IICDS中,清除中斷標志后,再次等待應答信號;如果不想再發送數據了,那么把0x90寫入寄存器IICSTAT中,清除中斷標志并等待停止條件后,即完成了一次主設備的發送。
在主設備接收模式下,它的工作流程為:
1. 配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xB0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要接收數據,那么在應答信號后,讀取寄存器IICDS,清除中斷標志;如果不想接收數據了,那么就向寄存器IICSTAT寫入0x90,清除中斷標志并等待停止條件后,即完成了一次主設備的接收。
數據手冊中有兩個流程圖,非常清晰。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態寄存器IICSTAT和發送接收數據移位寄存器IICDS。由于我們只把s3c2440當做主設備來用,并且系統的IIC總線上只有這么一個主設備,因此用來設置從設備地址的地址寄存器IICADD,和用于仲裁總線的多主設備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設置IIC的時鐘頻率,因為IIC的時鐘線SCL都是由主設備提供的。s3c2440的IIC時鐘源為PCLK,當系統的PCLK為50MHz,而從設備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設置是否發出應答信號,第5位用于是否使能發送和接收中斷,第4位用于中斷的標志,當接收或發送數據后一定要對該位進行清零,以清除中斷標志。寄存器IICSTAT的高2位用于設置是哪種操作模式,當向第5位寫0或寫1時,則表示結束IIC或開始IIC通訊,第4位用于是否使能接收/發送數據。
由于通訊是雙方的事情,在了解了主設備的操作模式后,還要清楚從設備的運行機制,兩者要達到完美地結合,才能實現彼此的通訊。在這里,從設備是EEPROM——AT24C08。在看到的趙老師的博客中,他是對AT24c02a進行的讀寫。我覺得這兩個eeprom基本上是一樣的。
要想讓s3c2440能夠正確地對AT24C02A讀寫,就必須讓s3c2440的時序完全按照AT24C02A的時序。AT24C02A的寫操作有兩種模式:字節寫和頁寫。字節寫是先接收帶有寫命令的設備地址信息,如果符合就應答,再接收設備內存地址信息,發出應答后,再接收要寫入的數據,這樣就完成了字節寫過程。頁寫與字節寫的區別就是,頁寫可以一次寫多個數據,而字節寫只能一次寫一個數據。但由于AT24C02A的一頁才8個字節,所以頁寫也最多寫8個數據,而且只能在該頁內寫,不會發生一次頁寫同時寫兩頁的情況。AT24C02A的讀操作有三種模式:當前地址讀、隨機讀和序列讀。當前地址讀是只能讀取當前地址內的數據,它的時序是先接收帶有讀命令的設備地址信息,如果符合就應答,然后發送當前地址內的數據,在沒有接收從主設備發來的應答信號的情況下終止該次操作。隨機讀的時序是,連續接收帶有寫命令的設備地址信息和設備內存地址信息,然后主設備重新開啟IIC通信,AT24C02A再次接收到帶有讀命令的設備地址信息,在發出應答信號以后,發送該內存地址的數據,在沒有接收到任何應答信號的情況下結束該次通信。當前地址讀和隨機讀一次都只能讀取一個數據,而序列讀一次可以讀取若干個數據,它的時序就是在當前地址讀或隨機讀發出數據后,接收到了應答信號,那么AT24C02A會把下一個內存地址中的數據送出,除非AT24C02A接收不到任何應答信號,否則它會一直把下一個內存地址中的數據送出。序列讀沒有一頁8個字節的限制。
這里是趙老師寫的注意事項:
⑴清IIC中斷標志語句rIICCON &= ~0x10;一定要在讀寫寄存器IICDS的后面,不能放到它的前面;
⑵在等待應答的死循環while內,一定要加上延時的程序;
⑶在讀取AT24C02A數據時,當讀到最后一個數據時,一定不能讓s3c2440發送應答信號,否則以后會無法再讀取AT24C02A數據,除非關電重啟;
⑷在真正對AT24C02A進行讀取數據時,在發送帶有讀命令的從設備地址后,AT24C02A會再返回一個從設備地址信息或從設備內存地址信息作為應答,所以一定要把該字節讀取后拋棄,因為它不是我們所要讀取的信息;(這里在看at24c08的數據手冊中,并沒有看到有這個。)
⑸按照AT24C02A的時序,在發送從設備地址字節時,它的最低位是0表示寫,1表示讀。但對于s3c2440來說,不用人為設置這一位,即是0是1都無所謂,因為這一位是由s3c2440根據是主設備發送模式還是主設備接收模式來自動設置。
我把趙老師的源程序,修改了一下,經過反復試驗,剛開始弄錯了i2c地址,結果只實現了eeprom的寫入,讀數據時,讀出來的都是0xff。
趙老師的程序中,讀取數據的函數如下
void rd24c02a(unsigned char wordAddr,unsigned char *buffer,int sizeofdate )
{
int i;
unsigned char temp;
flag =1;
rIICDS = devAddr; //
rIICCON &= ~0x10; //清中斷標志
rIICSTAT = 0xf0; //主設備發送模式
while(flag)
delay(100);
flag = 1;
rIICDS = wordAddr;
rIICCON &= ~0x10;
while(flag)
delay(100);
flag = 1;
rIICDS = devAddr; //
rIICCON &= ~0x10;
rIICSTAT = 0xb0; //主設備接收模式
while (flag)
delay(100);
flag = 1;
temp = rIICDS; //讀取從設備地址, 這小段程序按照24c08的手冊,我覺得是完全沒必要的。
rIICCON &= ~0x10;
while(flag)
delay(100);
//連續讀
for(i=0;i flag = 1; if(i==sizeofdate-1) //如果是最后一個數據 rIICCON &= ~0x80; //不再響應 *(buffer+i) = rIICDS; rIICCON &= ~0x10; while(flag) delay(100); } rIICSTAT = 0x90; //結束該次通訊 rIICCON = 0xe0; // delay(100); } 后來我修改了i2c地址之后,程序可以實現正確的讀寫。令我不解的是,為什么當i2c地址是錯誤時,mcu仍然可以收到ack信號,并且進入中斷函數呢?下面附上我的源程序。 #include #include #include "def.h" #include "option.h" #include "2440addr.h" #include "2440lib.h" #include "2440slib.h" #include "mmu.h" #include "led.h" unsigned char flag; //應答標志 unsigned char comm; //命令 //unsigned char devAddr=0x10 << 1; //從設備AT24C02A的地址 unsigned char devAddr=0xa0 << 1; //從設備AT24C02A的地址 //IIC通信中斷 void __irq IicISR(void) { // rSRCPND |= 0x1<<27; // rINTPND |= 0x1<<27; ClearPending(BIT_IIC); flag = 0; //清標志 led_toggle(2); } //AT24C02A頁寫,當sizeofdate為1時,是字節寫 //輸入參數依次為設備內存地址、IIC數據緩存數組和要寫入的數據個數 void wr24c02a(char wordAddr, char *buffer,int len ) { int i; char mbuf[4]; while(1) { i = rIICSTAT; if(i & (0x01<<5)){ Uart_Send("bus busy",10); delay(100); } else break; } flag =1; //應答標志 rIICDS = devAddr; rIICCON &= ~0x10; //清中斷標志 rIICSTAT = 0xf0; //主設備發送模式 while(flag == 1) //等待從設備應答, delay(100); //一旦進入IIC中斷,即可跳出該死循環 Uart_Send("a",1); flag = 1; rIICDS = wordAddr; //寫入從設備內存地址 rIICCON &= ~0x10; while(flag) delay(100); Uart_Send("b",1); //連續寫入數據 for(i=0;i flag = 1; rIICDS = *(buffer+i); rIICCON &= ~0x10; while(flag) delay(100); mbuf[0] = *(buffer + i); mbuf[1] = '.'; Uart_Send(mbuf, 2); } rIICSTAT = 0xd0; //發出stop命令,結束該次通訊 rIICCON = 0xe0; //為下次IIC通訊做準備 delay(100); //等待 } //AT24C02A的序列讀,當sizeofdate為1時,是隨機讀 //輸入參數依次為設備內存地址、IIC數據緩存數組和要讀取的數據個數 void rd24c02a(char wordAddr,char *buffer,int len ) { int i; unsigned char temp; char mbuf[12]; while(1) { i = rIICSTAT; if(i & (0x01<<5)){ Uart_Send("bus busy",10); delay(100); } else break; } flag =1; rIICDS = devAddr ; // rIICCON &= ~0x10; //清中斷標志 rIICSTAT = 0xf0; //主設備發送模式 while(flag)
上一篇:mini2440裸機編程--------LCD驅動
下一篇:mini2440上dm9000驅動分析(三)
推薦閱讀
史海拾趣
為了進一步提升競爭力,ABL公司開始實施國際化發展戰略。公司首先在海外市場設立了銷售分支機構,積極開拓國際市場。隨后,ABL公司又在海外建立了生產基地,利用當地資源和優勢降低生產成本。通過國際化發展,ABL公司不僅擴大了市場份額,還提高了品牌的國際影響力。
在MLCC領域取得顯著成就的同時,宇陽科技也在積極拓展其他業務領域。公司利用在MLCC領域積累的技術和經驗,成功研發了多款新型電子元器件,并為移動通信、計算機及外設、數字視聽產品等領域提供元器件方案設計、選型和配套綜合服務。此外,宇陽科技還積極進軍移動手機市場,通過參股、合作等方式,成功涉足移動手機軟件及硬件設計、制造和銷售等領域。
在辰頤電子公司的發展歷程中,品質和創新一直是其核心競爭力。公司始終堅持對產品品質的嚴格把控,從原材料采購到生產流程,再到售后服務,都力求做到精益求精。同時,公司還注重技術創新和研發投入,不斷推出具有競爭力的新產品,滿足市場不斷變化的需求。這種品質與創新的雙輪驅動模式,使辰頤電子在激烈的市場競爭中脫穎而出。
在辰頤電子公司的發展歷程中,品質和創新一直是其核心競爭力。公司始終堅持對產品品質的嚴格把控,從原材料采購到生產流程,再到售后服務,都力求做到精益求精。同時,公司還注重技術創新和研發投入,不斷推出具有競爭力的新產品,滿足市場不斷變化的需求。這種品質與創新的雙輪驅動模式,使辰頤電子在激烈的市場競爭中脫穎而出。
經過多年的努力和發展,承興公司已經成為一家具有全球影響力的電子企業。除了在中國市場保持領先地位外,承興還積極拓展海外市場,并在美國、新加坡等地設立了分公司和研發中心。通過與全球合作伙伴的緊密合作和資源共享,承興不斷提升其全球競爭力,并努力實現國際化的發展目標。
請注意,由于承興(CX)公司的具體發展歷程和細節可能因時間和市場變化而有所不同,以上故事僅為虛構示例,旨在展示承興公司在電子行業中的發展脈絡和關鍵事件。
面對未來,科山芯創有著清晰的規劃和展望。他們將繼續加大研發投入,不斷推出更多高性能、高品質的芯片產品;同時,他們還將積極拓展國際市場,提升品牌影響力;此外,科山芯創還將加強與產業鏈上下游企業的合作,共同推動電子行業的創新與發展。
以上五個故事概述了科山芯創在電子行業中的發展歷程和成就。作為一家專注于高性能、高品質射頻及模擬集成電路芯片研發與設計的創新型企業,科山芯創以其強大的技術實力和優質的服務贏得了市場的認可和尊重。
是不是AT24C02直接接到主器件上就可以工作了,需要編程嗎,要的話怎么編 接線圖如下, [ 本帖最后由 zxbwewe 于 2009-4-20 13:48 編輯 ]… 查看全部問答∨ |
|
芯片是三星s3c2440的,目前有開發板一塊,電腦系統是XP,無串口,無并口,只有USB。 我想把PB生成wince系統的nk.bin燒到板子上去。求個比較簡單、經濟的方法。… 查看全部問答∨ |
|
一直以來接觸到的資料都是這么講的:在配置完GPRS模塊之后,要向模塊發送一個ATD*99***1#指令,完成與移動的GGSN的連接。 可是最近拿到了一個程序,是SIM300上網的,它的上網大致流程是這樣的: 1.配置SIM300模塊 2.通過AT+CIPSTART指定IP,建立T ...… 查看全部問答∨ |
我用的是cortex m0的lpc1114,發現最短的時鐘中斷太長了,于是想修改一個apb的clk,但是找不到此寄存器 看到有的手冊說是apb的頻率是ahb的四分之一,請問一下該如何修改,謝謝了… 查看全部問答∨ |
本帖最后由 ddllxxrr 于 2016-1-7 16:58 編輯 誰有多余的啊 仍給我吧 非常感謝! 舍不得賣的話,借我玩幾天也行啊! EK_LM3S8962需要帶LMS2110小板, 本站強薦:185娛樂T城.足球T真_人.彩票齊全T手機可投T注任何游戲. 首次開 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- Linux系統編程篇丨迅為IMX6ULL-對應視頻講解
- 嵌入式學習丨4412開發板-uboot源碼-匯編-源碼分析(一)嵌入式學習丨4412開發板-uboot源碼-匯
- 迅為IMX6ULL開發板-主頻和時鐘配置例程(二)
- 迅為IMX6ULL開發板-主頻和時鐘配置例程
- 迅為IMX6ULL開發板安裝VMware Tool工具
- i.MX6ULL終結者Debian文件系統的構建i.MX6ULL 移植Debian文件系統
- 迅為i.MX6ULL開發板按鍵例程編譯及運行
- 迅為-i.MX6開發板手冊更新-非設備樹uboot-修改默認環境變量
- 迅為-IMX6ULL-QT應用_在開發板上移植ssh
- 迅為-i.MX6ULL開發板-QT實戰項目DHT11&網絡編程實戰練習(一)