在tq2440和mini2440上都連接著EEPROM 它們作用也不過測試I2C總線能否用。
當中在mini2440上EEPROM型號是 AT24C08,在tq2440上這個型號是 AT24C02A。
它們之間容量不同。地址線也不一樣。
S3C2440A RISC 微處理器能夠支持一個多主控 IIC 總線串行接口。一條串行數據線(SDA)和一條專用時鐘線(SCL) 連接到 IIC 總線的總線主控和外設之間。SDA 和 SCL 線都為雙向的。都連接到GPE14(SCL) GPE15(SDA)。
為了控制多主控 IIC 總線操作,必須寫入值到下面寄存器中:
– 多主控 IIC 總線控制寄存器,IICCON
– 多主控 IIC 總線控制/狀態寄存器,IICSTAT
– 多主控 IIC 總線 Tx/Rx 數據移位寄存器,IICDS
– 多主控 IIC 總線地址寄存器,IICADD
因為我們僅僅把s3c2440當做主設備來用,而且系統的IIC總線上僅僅有這么一個主設備,因此用來設置從設備地址的地址寄存器IICADD無需配置。
S3C2440A 的 IIC 總線接口有 4 種工作模式:
– 主機發送模式
– 主機接收模式
– 從機發送模式
– 從機接收模式
起始和停止條件
當 IIC 總線接口不活動時,其通常在從機模式。
換句話說,該接口在從 SDA 線上檢測到起始條件之前應該處于從機模式(當 SCL 時鐘信號為高時的一個高到低 SDA 的變化可
以啟動一個起始條件)。當接口狀態被改為主機模式時,能夠起始發送數據到 SDA 上而且產生 SCL 信號。
起始條件能夠傳輸 1 字節串行數據到 SDA 線上,而停止條件能夠結束
數據的傳輸。
停止條件是在當 SCL 為高時的 SDA 線低到高的變化。起始和停止條件總由主機產生。當產生了一個起始條件時 IIC 總線變為忙。停止條件將使得 IIC 總線空暇。
當主機發起一個起始條件時,其應該送出一個從機地址來通知從設備。
地址字段的 1 字節由 7 位地址和 1 位傳輸方向標志(表現為讀或寫)組成。
假設位[8]為 0,其表示一個寫操
作(發送操作);假設位[8]為 1,其表示一個數據讀取的請求(接收操作)。
主機將通過發送一個停止條件來完畢傳輸操作。假設主機希望持續發送數據到總線上,其應該在同一個從地址產生再一個起始條件。這樣就能夠運行各種格式的讀寫操作。
注意到在 起始 和 停止 條件之間還有若干個SCL時鐘。 用來發送數據。
傳輸數據格式
放置到 SDA 線上的每一個字節應該以 8 位為長度。
每次傳輸字節能夠無限制的發送。起始條件隨后的第一個字節應該包括地址字段。當 IIC 總線工作在主機模式時能夠由主機
發送該地址字段。
每一個字節都應該尾隨一個應答(ACK)位。
總是最先發送串行數據和地址的 MSB。
上圖勘誤 這里圖例應該反過來 --- 灰色框表示從從機到主機,看來翻譯文檔的人還不夠細心呢。
上面提到了4中工作模式,在這里我們僅僅把s3c2440當做IIC總線的主設備來使用。因此僅僅介紹前兩種操作模式。
首先看下主設備發送流程圖:
首先配置IIC模式,然后把從設備地址寫入 接收發送數據移位寄存器IICDS 中。再把0xF0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號。如果想要繼續發送數據。那么在接收到應答信號后,再把待發送的數據寫入寄存器IICDS中,清除中斷標志后。再次等待應答信號。假設不想再發送數據了,那么
把0x90寫入寄存器IICSTAT中,清除中斷標志并等待停止條件后。即完畢了一次主設備的發送。
代碼例如以下:
//AT24C02A頁寫,當sizeofdate為1時。是字節寫
//輸入參數依次為設備內存地址、IIC數據緩存數組和要寫入的數據個數
void __attribute__((optimize('O0'))) wr24c02a(UINT8 wordAddr,UINT8 *buffer,UINT32 sizeofdate )
{
int i;
i2cflag =1; //應答標志
rIICDS = devAddr;
rIICSTAT = 0xf0; //主設備發送模式
rIICCON &= ~0x10; //清中斷標志
while(i2cflag == 1) //等待從設備應答,
OSTimeDly(2); //一旦進入IIC中斷,就可以跳出該死循環
i2cflag = 1;
rIICDS = wordAddr; //寫入從設備內存地址
rIICCON &= ~0x10;
while(i2cflag)
OSTimeDly(2);
//連續寫入數據
for(i=0;i i2cflag = 1; rIICDS = *(buffer+i); rIICCON &= ~0x10; while(i2cflag) OSTimeDly(2); } rIICSTAT = 0xd0; //發出stop命令,結束該次通訊 rIICCON = 0xe0; //為下次IIC通訊做準備 OSTimeDly(100); } 上面有2點地方須要說明。1點是剛開始的初始化 rIICCON 一定要在 rIICSTAT 后面賦值。 第2點是因為這是在多任務環境下執行的,while后面跟的OSTimeDly有延遲,也就是說假設OSTimeDly(2)延遲10ms,而在1ms的時候中斷發生了。這里 仍然要延遲10ms才干繼續運行,能夠考慮用信號量替代。這樣一旦發生中斷,從中斷出來之后就會馬上繼續運行。 然后就是主設備接收流程圖: 首先配置 IIC 模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xB0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號。假設想要接收數據,那么在應答信號后。讀取寄存器IICDS,清除中斷標志;假設不想接收數據了,那么就向寄存器IICSTAT寫入0x90。清除中斷標志并等待停止條件后,即完畢了一次主設備的接收。 //AT24C02A的序列讀,當sizeofdate為1時,是隨機讀 //輸入參數依次為設備內存地址、IIC數據緩存數組和要讀取的數據個數 void rd24c02a(UINT8 wordAddr,UINT8 *buffer,UINT32 sizeofdate ) { int i; unsigned char temp; i2cflag =1; rIICDS = devAddr; // rIICCON &= ~0x10; //清中斷標志 rIICSTAT = 0xf0; //主設備發送模式 while(i2cflag) OSTimeDly(2); i2cflag = 1; rIICDS = wordAddr; rIICCON &= ~0x10; while(i2cflag) OSTimeDly(2); i2cflag = 1; rIICDS = devAddr; // rIICCON &= ~0x10; rIICSTAT = 0xb0; //主設備接收模式 while (i2cflag) OSTimeDly(2); i2cflag = 1; temp = rIICDS; //讀取從設備地址 rIICCON &= ~0x10; while(i2cflag) OSTimeDly(2); //連續讀 for(i=0;i i2cflag = 1; if(i==sizeofdate-1) //假設是最后一個數據 rIICCON &= ~0x80; //不再響應 *(buffer+i) = rIICDS; rIICCON &= ~0x10; while(i2cflag) OSTimeDly(2); } rIICSTAT = 0x90; //結束該次通訊 rIICCON = 0xe0; // OSTimeDly(100); } s3c2440的 IIC 時鐘源為PCLK。當系統的 PCLK 為50MHz。而從設備最高須要100kHz時,須要配置IICCON寄存器 例如以下圖所看到的: 系統初始化時候配置iic寄存器例如以下: void init_i2c(void) { rGPEUP |= 0xc000; //Pull-up disable rGPECON |= 0xa0000000; //GPE15:IICSDA , GPE14:IICSCL rINTMSK &= ~(1<<27); /// enable i2c rIICCON = 0xe0; //設置IIC時鐘頻率,使能應答信號,并開啟中斷 rIICSTAT = 0x10; pIRQ_IIC = (UINT32)i2c_isr; } 在 i2c_isr 里面也不過把 i2cflag 賦值為0: void i2c_isr(void) { i2cflag = 0; } 詳細的代碼能夠從我的github上clone。
上一篇:u-boot之ARM920T的start.S分析
下一篇:s3c2440的網卡接口擴展DM9000
推薦閱讀最新更新時間:2025-04-17 07:50




設計資源 培訓 開發板 精華推薦
- 屏譜燈珠條遷移標準版
- 使用 Analog Devices 的 LTC1148 的參考設計
- esp32-wroom/wrover ch340c
- 用于窗口檢測的 AD5304 8 位 DAC 的典型應用
- VAR-DVK-MX6_CO,基于 VAR-SOM-MX6 的開發套件,安裝了 Windows Embedded Compact 7
- LTM8008 演示板、72VIN、6 輸出 DC/DC SEPIC 模塊穩壓器
- DEMO56F8014: 56F8014數字信號控制器的演示板
- 【中山大學校賽】 便攜式測溫系統
- 【新疆工程學院】基于NE555呼吸燈
- 使用 MaxLinear, Inc 的 SP6655 的參考設計
- 英特爾攜海信發布端側會議領域垂域模型解決方案,讓商務會議更安全更智能
- 英特爾攜手MAXHUB聯合發布企業級AI PC, 加速AI大模型在端側落地
- 助力低碳數字未來 英飛凌攜多款創新成果亮相2025慕尼黑上海電子展
- ?日清紡微電子科技賦能產業升級,亮相慕尼黑上海電子展
- 泰克閃耀 2025 慕尼黑上海電子展,引領測試技術新變革
- 破局AI眼鏡性能、續航、成本“不可能三角”:芯原推出高集成度參考設計方案
- 人形機器人成下一風口,各大車企紛紛入局,比智能汽車潛力更大?
- 業績最高 TDK為汽車應用推出電容值達100V的MLCC
- 微型柔性機器人:開啟智能救援與精準醫療新紀元
- 人工智能加速芯片設計:動態自適應流程引領高效創新