版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、I2C存儲器實驗實驗目的 1、了解I2C總線的工作原理 2、掌握I2C總線驅動程序的設計和調試方法 3、掌握I2C總線存儲器的讀寫方法 實驗儀器 單片機開發(fā)板、穩(wěn)壓電源、計算機 實驗原理 1、 I2C總線常識 I2C總線采用一個雙線式漏極開路接口,可在一根總線上支持多個器件和主控器。所連接的器件只會把總線拉至低電平,而決不會將其驅動至高電平??偩€在外部通過一個電流源或上拉電阻器連接至一個正電源電壓。當總線空閑時,兩條線路均為高電平。在標準模式中,I2C 總線上的數(shù)據(jù)傳輸速率高達100kbit/s
2、,而在快速模式中則高達400kbit/s。 I2C總線上的每個器件均由一個存儲于該器件中的唯一地址來識別,并可被用作一個發(fā)送器或接收器(視其功能而定)。除了發(fā)送器和接收器之外,在執(zhí)行數(shù)據(jù)傳輸時,還可把器件視作主控器或受控器。主控器是負責啟動總線上的數(shù)據(jù)傳輸并生成時鐘信號以允許執(zhí)行該傳輸?shù)钠骷?。同時,任何被尋址的器件均被視作受控器。 CAT24WC01/02/04/08/16是一個1K/2K/4K/8K/16K位串行CMOS EEPROM,內(nèi)部含有128/256/512/1024/2048個8位字節(jié),CATALYST公司的先進CMOS技術實質上減少了器件的功耗,CA
3、T24WC01有一個8字節(jié)頁寫緩沖器,CAT24WC02/04/08/16有一個16字節(jié)頁寫緩沖器,該器件通過I2C總線接口進行操作,有一個專門的寫保護功能,并且器件能與400KHzI2C總線兼容。 引腳名稱和功能如圖1所示。 圖1 24系例I2C存儲器引腳說明通過器件地址輸入端A0、A1和A2可以實現(xiàn)將最多8個24WC01和24WC02器件4個24WC04器件,2個24WC08器件和1個24WC16器件連接到總線上。 2、I2C總線協(xié)議 (1)只有在總線空閑時才允許啟動
4、數(shù)據(jù)傳送。 (2)在數(shù)據(jù)傳送過程中,當時鐘線為高電平時,數(shù)據(jù)線必須保持穩(wěn)定狀態(tài),不允許有跳變。時鐘線為高電平時,數(shù)據(jù)線的任何電平變化將被看作總線的起始或停止信號。 (3)起始信號 時鐘線保持高電平期間,數(shù)據(jù)線電平從高到低的跳變作為I2C 總線的起始信號。(4) 停止信號 時鐘線保持高電平期間,數(shù)據(jù)線電平從低到高的跳變作為I2C 總線的停止信號。 I2C 總線時序:
5、; I2C 總線時序圖I2C總線啟動停止信號波形:SCL為高電平,SDA降沿為啟動信號;SCL為高電平,SDA上升沿為停止信號。 I2C 總線啟動停止信號I2C總線寫周期波形:SCL正脈沖鎖存數(shù)據(jù),或SCL為高電平數(shù)據(jù)有效。SCL高電平期間SDA數(shù)據(jù)應保持不變。 I2C 總線寫時序波形I2C總線應答信號波形:I2C總線數(shù)據(jù)傳送時,每成功地傳送一個字節(jié)數(shù)據(jù)后,接收器都必須
6、產(chǎn)生一個應答信號。應答的器件在第9個時鐘周期時將SDA線拉低,表示其已收到一個8 位數(shù)據(jù)。 I2C 總線讀時序3、24C系列存儲器讀寫操作 (1)24系列常用存儲器器件地址安排 24系例存儲器器件地址安排 (2)字節(jié)寫操作 在字節(jié)寫模式下,主器件發(fā)送起始命令和從器件地址信息(R/W位置零)給從器件,在從器件產(chǎn)生應答信號后,主器件發(fā)送CAT24WC01/02/04/08/
7、16的1字節(jié)地址(存儲容量大的存儲器字節(jié)地址兩字節(jié)),主器件在收到從器件的另一個應答信號后,再發(fā)送數(shù)據(jù)到被尋址的存儲單元。CAT24WC01/02/04/08/16再次應答,并在主器件產(chǎn)生停止信號后,開始內(nèi)部數(shù)據(jù)的擦寫,在內(nèi)部擦寫過程中從器件不再應答主器件的任何請求(10ms)。如圖所示。 字節(jié)寫操作數(shù)據(jù)幀結構 (3)頁寫操作(提高寫入速度) 根據(jù)頁緩沖區(qū)的大小,頁寫的字節(jié)數(shù)不能超過緩沖區(qū)大小。如果在發(fā)送停止信號之前主器件發(fā)送超過緩沖區(qū)大小,地址計數(shù)器將自動翻轉,先前寫入的數(shù)據(jù)被覆蓋。如圖所示。
8、0; 頁寫操作數(shù)據(jù)幀結構(4)當前地址讀操作 當讀取一個字節(jié)數(shù)據(jù)后,存儲器內(nèi)部地址計數(shù)器加1。當讀到最后一字節(jié)時,計數(shù)器將翻轉到0且繼續(xù)輸出數(shù)據(jù)。CAT24WC01/02/04/08/16 接收到從器件地址信號后(R/W 位置1),它首先發(fā)送一個應答信號,然后發(fā)送一個8位字節(jié)數(shù)據(jù)。主器件產(chǎn)生一個非應答信號(這里是主器件發(fā)送的非應答信號),再產(chǎn)生一個停止信號。如圖所示。當前地址讀操作數(shù)據(jù)幀結構(5)任意地址讀操作、連續(xù)讀操作 任意地址讀、連續(xù)讀操作數(shù)據(jù)幀結構4、 I2C總線存儲
9、讀寫程序設計 I2C總線存儲器讀寫程序分為兩層:硬件接口程序和存儲器讀寫程序。其中硬件接口程序有:總線啟動、停止、發(fā)數(shù)據(jù)、收數(shù)據(jù)、發(fā)響應、發(fā)非響應、讀從器件響應狀態(tài)等。存儲器讀寫程序有:單字節(jié)寫數(shù)據(jù)、頁寫數(shù)據(jù)、當前地址讀數(shù)據(jù)、任意地址讀數(shù)據(jù)、連續(xù)讀數(shù)據(jù)等。 參考上面的時序圖設計硬件接口相關子程序。 I2C總線接口程序流程圖 I2C總線數(shù)據(jù)讀寫
10、流程圖 存儲器讀寫程序設計。這里以單字節(jié)讀、寫程序為例說明,其它子程序由讀者自行設計。 I2C存儲器單字節(jié)讀寫流程圖 實驗參考程序:/* 普中科技-* 實 驗 名 : 24C02EEPROM存儲試驗* 實驗說明 : 使用LCD1602顯示寫入的數(shù)據(jù)和讀出的數(shù)據(jù)* 連接方式 : 見連接圖* 注
11、意 : */#include<reg51.h>#include"i2c.h"#include"lcd.h"/-定義使用的IO口-/數(shù)碼管IO#define GPIO_DIGP0sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;/按鍵IOsbit K1=P30;sbit K2=P31;sbit K3=P32;sbit K4=P33;/-定義全局變量-/unsigned char wordCode06 = "write:"unsigned char wordCode16 = " read:
12、" /-聲明全局函數(shù)-/void At24c02Write(unsigned char ,unsigned char );unsigned char At24c02Read(unsigned char );void Delay10ms(unsigned int c); /誤差 0us/* 函數(shù)名 : main* 函數(shù)功能 : 主函數(shù)* 輸入 : 無* 輸出 : 無*/void main()unsigned int num0 = 0,num1 = 0,n;LcdInit();LcdWriteCom(0x80);for(n=0; n<6; n+)LcdWriteData(wordC
13、ode0n);LcdWriteCom(0x80 + 0x40);for(n=0; n<6; n+)LcdWriteData(wordCode1n);while(1)if(K1 = 0) /按鍵1按下Delay10ms(1);if(K1 = 0)At24c02Write(2,num0);while(n < 50)&&(K3=0)n+;Delay10ms(1);n=0;n=0;if(K2 = 0) /按鍵2按下Delay10ms(1);if(K2 = 0)num1 = At24c02Read(2);while(n < 50)&&(K2 = 0)n+
14、;Delay10ms(1);n=0;if(K3 = 0) /按鍵3按下Delay10ms(1);if(K3 = 0)num0+;while(n < 50)&&(K3 = 0)n+;Delay10ms(1);n=0;if(num0=256)num0=0;if(K4 = 0) /按鍵4按下Delay10ms(1);if(K4 = 0)num0 = 0;while(n < 50) && (K4 = 0)n+;Delay10ms(1);n=0;LcdWriteCom(0x87);LcdWriteData('0' + (num0/1000);/
15、千位LcdWriteData('0' + (num0%1000/100);/百位LcdWriteData('0' + (num0%1000%100/10);/十位LcdWriteData('0' + (num0%1000%100%10);/個位LcdWriteCom(0x87 + 0x40);LcdWriteData('0' + (num1/1000);/千位LcdWriteData('0' + (num1%1000/100);/百位LcdWriteData('0' + (num1%1000%100
16、/10);/十位LcdWriteData('0' + (num1%1000%100%10);/個位 /* 函 數(shù) 名 : Delay10ms* 函數(shù)功能 : 延時函數(shù),延時10ms* 輸 入 : 無* 輸 出 : 無*/void Delay10ms(unsigned int c) /誤差 0us unsigned char a, b;/-c已經(jīng)在傳遞過來的時候已經(jīng)賦值了,所以在for語句第一句就不用賦值了-/ for (;c>0;c-)for (b=38;b>0;b-)for (a=130;a>0;a-); /* 函 數(shù) 名 : void At24c02Wri
17、te(unsigned char addr,unsigned char dat)* 函數(shù)功能 : 往24c02的一個地址寫入一個數(shù)據(jù)* 輸 入 : 無* 輸 出 : 無*/void At24c02Write(unsigned char addr,unsigned char dat)I2C_Start();I2C_SendByte(0xa0, 1);/發(fā)送寫器件地址I2C_SendByte(addr, 1);/發(fā)送要寫入內(nèi)存地址I2C_SendByte(dat, 0);/發(fā)送數(shù)據(jù)I2C_Stop();/* 函 數(shù) 名 : unsigned char At24c02Read(unsigned ch
18、ar addr)* 函數(shù)功能 : 讀取24c02的一個地址的一個數(shù)據(jù)* 輸 入 : 無* 輸 出 : 無*/unsigned char At24c02Read(unsigned char addr)unsigned char num;I2C_Start();I2C_SendByte(0xa0, 1); /發(fā)送寫器件地址I2C_SendByte(addr, 1); /發(fā)送要讀取的地址I2C_Start();I2C_SendByte(0xa1, 1); /發(fā)送讀器件地址num=I2C_ReadByte(); /讀取數(shù)據(jù)I2C_Stop();return num;#include"i2c.
19、h"/* 函 數(shù) 名 : Delay1us()* 函數(shù)功能 : 延時* 輸 入 : 無* 輸 出 : 無*/void I2C_Delay10us()uchar a, b;for(b=1; b>0; b-)for(a=2; a>0; a-);/* 函 數(shù) 名 : I2C_Start()* 函數(shù)功能 : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產(chǎn)生一個下降沿* 輸 入 : 無* 輸 出 : 無* 備 注 : 起始之后I2C_SDA和I2C_SCL都為0*/void I2C_Start()I2C_SDA = 1;I2C_Delay10us();I2C_S
20、CL = 1;I2C_Delay10us();/建立時間是I2C_SDA保持時間>4.7usI2C_SDA = 0;I2C_Delay10us();/保持時間是>4usI2C_SCL = 0;I2C_Delay10us();/* 函 數(shù) 名 : I2C_Stop()* 函數(shù)功能 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產(chǎn)生一個上升沿* 輸 入 : 無* 輸 出 : 無* 備 注 : 結束之后保持I2C_SDA和I2C_SCL都為1;表示總線空閑*/void I2C_Stop()I2C_SDA = 0;I2C_Delay10us();I2C_SCL = 1;
21、I2C_Delay10us();/建立時間大于4.7usI2C_SDA = 1;I2C_Delay10us();/* 函 數(shù) 名 : I2cSendByte(uchar num)* 函數(shù)功能 : 通過I2C發(fā)送一個字節(jié)。在I2C_SCL時鐘信號高電平期間,* * 保持發(fā)送信號I2C_SDA保持穩(wěn)定* 輸 入 : num ,ack* 輸 出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0* 備 注 : 發(fā)送完一個字節(jié)I2C_SCL=0, 需要應答則應答設置為1,否則為0*/uchar I2C_SendByte(uchar dat, uchar ack)uchar a = 0,b = 0;/最大255
22、,一個機器周期為1us,最大延時255us。for(a=0; a<8; a+)/要發(fā)送8位,從最高位開始I2C_SDA = dat >> 7; /起始信號之后I2C_SCL=0,所以可以直接改變I2C_SDA信號dat = dat << 1;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/建立時間>4.7usI2C_SCL = 0;I2C_Delay10us();/時間大于4usI2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;while(I2C_SDA && (ack
23、= 1)/等待應答,也就是等待從設備把I2C_SDA拉低b+;if(b > 200) /如果超過200us沒有應答發(fā)送失敗,或者為非應答,表示接收結束I2C_SCL = 0;I2C_Delay10us();return 0;I2C_SCL = 0;I2C_Delay10us(); return 1;/* 函 數(shù) 名 : I2cReadByte()* 函數(shù)功能 : 使用I2c讀取一個字節(jié)* 輸 入 : 無* 輸 出 : dat* 備 注 : 接收完一個字節(jié)I2C_SCL=0*/uchar I2C_ReadByte()uchar a = 0,dat = 0;I2C_SDA = 1;/起始和發(fā)
24、送一個字節(jié)之后I2C_SCL都是0I2C_Delay10us();for(a=0; a<8; a+)/接收8個字節(jié)I2C_SCL = 1;I2C_Delay10us();dat <<= 1;dat |= I2C_SDA;I2C_Delay10us();I2C_SCL = 0;I2C_Delay10us();return dat;#include"lcd.h"/* 函 數(shù) 名 : Lcd1602_Delay1ms* 函數(shù)功能 : 延時函數(shù),延時1ms* 輸 入 : c* 輸 出 : 無* 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。*/vo
25、id Lcd1602_Delay1ms(uint c) /誤差 0us uchar a,b;for (; c>0; c-) for (b=199;b>0;b-) for(a=1;a>0;a-); /* 函 數(shù) 名 : LcdWriteCom* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令* 輸 入 : com* 輸 出 : 無*/#ifndef LCD1602_4PINS /當沒有定義這個LCD1602_4PINS時void LcdWriteCom(uchar com) /寫入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /選擇發(fā)送命令LCD1602_R
26、W = 0; /選擇寫入LCD1602_DATAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待數(shù)據(jù)穩(wěn)定LCD1602_E = 1; /寫入時序Lcd1602_Delay1ms(5); /保持時間LCD1602_E = 0;#else void LcdWriteCom(uchar com) /寫入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /選擇寫入命令LCD1602_RW = 0; /選擇寫入LCD1602_DATAPINS = com;/由于4位的接線是接到P0口的高四位,所以傳送高四位不用改Lcd1602_Delay1ms(
27、1);LCD1602_E = 1; /寫入時序Lcd1602_Delay1ms(5);LCD1602_E = 0;/Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4; /發(fā)送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /寫入時序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 數(shù) 名 : LcdWriteData* 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)* 輸 入 : dat* 輸 出 : 無*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/寫入數(shù)據(jù)LCD1602_E = 0;/使能清零LCD1602_RS = 1;/選擇輸入數(shù)據(jù)LCD1602_RW = 0;/選擇寫入LCD1602_DATAPINS = dat; /寫入數(shù)據(jù)Lcd1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年手機售后服務協(xié)議模板
- 成品油海上運輸服務協(xié)議2024年
- 2023-2024學年之江教育評價高三下階段測試(五)數(shù)學試題
- 2024年企業(yè)勞務服務協(xié)議模板
- 2024辦公電腦集中采購協(xié)議模板
- 2024年反擔保協(xié)議條款示例
- 2024年家居裝飾協(xié)議格式
- 2024年批量錨具采購商務協(xié)議條款
- 文書模板-旅游服務轉讓合同
- 2024年電商管理代運營協(xié)議模板
- NB_T 10339-2019《水電工程壩址工程地質勘察規(guī)程》_(高清最新)
- 繁體校對《太上老君說常清靜經(jīng)》
- 關于統(tǒng)一規(guī)范人民防空標識使用管理的通知(1)
- 電纜振蕩波局部放電試驗報告
- 西門子RWD68說明書
- 針對建筑工程施工數(shù)字化管理分析
- 多品種共線生產(chǎn)質量風險評價
- 【MBA教學案例】從“蝦國”到“國蝦”:國聯(lián)水產(chǎn)的戰(zhàn)略轉型
- Unit-1--College-Life
- 醫(yī)院車輛加油卡管理制度
- 平面四桿機構急回特性說課課件
評論
0/150
提交評論