娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

s3c2440的IIC控制

發布者:SereneSoul55最新更新時間:2024-08-29 來源: cnblogs關鍵字:s3c2440  IIC控制  EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

在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。


關鍵字:s3c2440  IIC控制  EEPROM 引用地址:s3c2440的IIC控制

上一篇:u-boot之ARM920T的start.S分析
下一篇:s3c2440的網卡接口擴展DM9000

推薦閱讀最新更新時間:2025-04-17 07:50

linux2.6.32.2 mini2440平臺移植-- 串口驅動移植、I2C-EEPROM 驅動移植、看門狗驅動移植
1.7.1 把 UART2 改為普通串口驅動 S3C2440 芯片具有 3 個串口:UART0,1,2,我們下載的 Linux-2.6.32.2 已經具備完善的 UART0,1 的驅動,但對UART2 卻用作了紅外通訊(Irda),因此我們需要把 UART2 驅動稍微調整一下,以便作為普通串口來用。 先看看 S3C2440 串口部分寄存器的說明,如下圖 接下來我們修改內核中關于 UART2 的配置,打開 mach-mini2440.c 文件,找到,如下紅色代碼為修改后的: static struct s3c2410_uartcfg mini2440_uartcfgs __initdata = { = {
[單片機]
linux2.6.32.2 mini2440平臺移植-- 串口驅動移植、I2C-<font color='red'>EEPROM</font> 驅動移植、看門狗驅動移植
linux 2.6.32 在arm9(s3c2440)平臺的移植2 -- Kconfig和Makefile
在ubuntu上按照無數帖子無數文檔搞了半天qt環境還有eclipse,最后才發現這些都是無關緊要的東西,首先能在ARM核心板上移植linux才是應該先實現的,自己瞎搞了半天移植,對著make menuconfig的復雜樹型選項和添加代碼迷糊不已,到了晚上下班才猛然醒悟一切都是因為自己kconfig和makefile的關系不明白,才在原地犯迷糊的。 自己的理解 + 網摘, 參考: http://www.cnblogs.com/sirsunny/archive/2004/12/15/77506.html http://blog.csdn.net/windriver_hf/archive/2010/04/16/5493622.as
[單片機]
S3C2440的地址空間
S3C2440是32位的,2的32次方得知該CPU的地址空間為4G,即該CPU可訪問4G大小的范圍。 1、綠色那部分為外設地址空間,大小為1G,存在于CPU外部,由于存放數據與程序用的,CPU可通過地址線和數據線從中讀取數據。 2、黃色那部分為功能部件寄存器,大小為3G,存在于CPU內部,即在這些寄存器上寫入一些數據,則可控制相應功能部件的行為。 其中的各功能部件的寄存器地址范圍如表下: 其中的各外設的訪問地址如下表:
[單片機]
<font color='red'>S3C2440</font>的地址空間
s3c2440實驗---定時器
 時鐘是同步工作系統的同步節拍。  一、時鐘的獲得有很多種方式   1、外部直接輸入時鐘信號   2、外部晶振+內部時鐘發生器(低頻單片機)   3、外部晶振+內部時鐘發生器+PLL+內部分頻器 二、定時器內部結構   1、總時鐘系統        詳細說明:在2440剛剛開機的時候,由于PLL尚未開啟,FCLK即等于外部輸入時鐘(12MHz),如果想提供時鐘頻率,則要開啟PLL。PLL分為 MPLL和UPLL。其中UPLL是控制USB的,這與本實驗無關。MPLL分為三種時鐘FCLK(CPU核時鐘)、HCLK(AHB總線設備時鐘)、PCLK(APK總線設備時鐘)。        2、實驗內容:用定時器0實現led燈
[單片機]
<font color='red'>s3c2440</font>實驗---定時器
基于S3c2440的I2C驅動與測試程序追蹤交叉分析
VMware虛擬機+Fedora10, 硬件平臺TQ2440, 內核2.6.30.4 對應的驅動程序豁然開朗, 然后自己添加了一些dev_dbg后, 對于不理解的地方也有了一定的參考提示, 記錄下來與大家分享。 測試程序如下: /*i2c_test.c * hongtao_liu */ #include #include #include #include #include #include #include #include #define I2C_RETRIES 0x0701 #define I2C_ TI MEOUT 0x0702 #define I2C_RDWR 0x0707 /*********定義struct i
[單片機]
S3C2440開發板學習——如何燒寫裸板程序
S3C2440的裸板燒錄的方法有:并口,OpenJTAG口,nor flash的u-boot,J-link,TFTP。 并口:不常用。 OpengJTAG口:裸板燒錄u-boot時,起關鍵的作用。通過oflash命令將u-boot燒錄到nor flash,當u-boot燒錄OK之后,開 發板可以進行正常的啟動。 Nor flash 的u-boot:此種方法的前提是,已經使用OpenJTAG口將u-boot燒錄到開發板的nor flash中。通過menu中的 down to NAND Flash 等選項,配合配合Dnw程序,可以完成USB傳輸kernel和root到開發板的過程。注意:USB 驅動的安裝,參
[單片機]
S3C2440 開發板實戰(1): 燒錄程序篇(純Ubuntu環境)
為了學習方便就買了韋老師的JZ2440開發板,因為有做過關于STM32以及51單片機的項目,并且參加過三次電子設計大賽。但是感覺自己都是只學了個皮毛(學習嵌入式之后感覺自己真的只學了個皮毛),這里建議如果要往這個方向發展的大學生在校期間應該把微機學好(真的很有用),廢話不多說,直接開始第一次簡單的復習。 1.使用oflash燒寫程序(慢) 插線方式:EOP和serial連上計算機。 oflash主要應用于2440和2410的程序燒寫,他利用了JPAG口進行燒寫,我是用了一個專門的電腦,裝了一個Ubuntu 20.4系統,(我超推薦電腦裝單系統,在之后的學習中超方便,就算是看完這一篇你都會覺得:去TM的
[單片機]
四、s3c2440 裸機開發 通用異步收發器UARN
UART(Universal AsynchronousReceiver/Transmitter,通用異步接收/發送裝置)用于異步通信,可以實現全雙工發送和接收。2440有三個UART:UART0,UART1,UART2其結構圖如下所示: 通過上圖可以看到UART包含baud-rate generator波特率發生器,transmitter發送器,receiver 接收器and a control unit控制單元。在UART使用FIFO模式的時候,其中發送器和接收器分別有一個大小為64字節的發送緩存器寄存器和接收緩存寄存器FIFO(先進先出),通過上圖還可以看到,假如不使用FIFO模式,接收器分別使用的發送保存寄存器和接收保存
[單片機]
四、<font color='red'>s3c2440</font> 裸機開發 通用異步收發器UARN
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 浑源县| 那曲县| 仁布县| 玉龙| 繁峙县| 阜新| 平山县| 吉林省| 浦县| 长海县| 淮滨县| 尼勒克县| 沾益县| 会昌县| 深泽县| 昆明市| 河南省| 海兴县| 龙陵县| 黄骅市| 新兴县| 泗阳县| 大化| 江门市| 寻甸| 东乌珠穆沁旗| 曲阜市| 读书| 惠安县| 锦屏县| 曲阳县| 左权县| 剑川县| 专栏| 丹阳市| 新乡县| 石泉县| 枣强县| 宝山区| 黄冈市| 绥宁县|