<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 并口模擬IIC的經(jīng)驗(yàn)之談

          并口模擬IIC的經(jīng)驗(yàn)之談

          作者: 時(shí)間:2011-11-25 來源:網(wǎng)絡(luò) 收藏

          由于工作需要,用計(jì)算機(jī)來讀寫AT24C01A,用VC語言實(shí)現(xiàn)并口模擬I2C 。

          (一)試驗(yàn)前的準(zhǔn)備知識(shí):

          一、I2C總線:i2c總線是 Philips 公司首先推出的一種兩線制串行傳輸總線。它由一根數(shù)據(jù)線(SDA)和一根
          時(shí)鐘線(SDL)組成。i2c總線的數(shù)據(jù)傳輸過程如圖3所示,基本過程為:
          1、主機(jī)發(fā)出開始信號(hào)。
          2、主機(jī)接著送出1字節(jié)的從機(jī)地址信息,其中最低位為讀寫控制碼(1為讀、0為寫),高7位為從機(jī)器件地址
          代碼。
          3、從機(jī)發(fā)出認(rèn)可信號(hào)。
          4、主機(jī)開始發(fā)送信息,每發(fā)完一字節(jié)后,從機(jī)發(fā)出認(rèn)可信號(hào)給主機(jī)。
          5、主機(jī)發(fā)出停止信號(hào)。

          I2C總線上各信號(hào)的具體說明:
          開始信號(hào):在時(shí)鐘線(SCL)為高電平其間,數(shù)據(jù)線(SDA)由高變低,將產(chǎn)生一個(gè)開始信號(hào)。
          停止信號(hào):在時(shí)鐘線(SCL)為高電平其間,數(shù)據(jù)線(SDA)由低變高,將產(chǎn)生一個(gè)停止信號(hào)。
          應(yīng)答信號(hào):既認(rèn)可信號(hào),主機(jī)寫從機(jī)時(shí)每寫完一字節(jié),如果正確從機(jī)將在下一個(gè)時(shí)鐘周期將數(shù)據(jù)線(SDA)拉
          低,以告訴主機(jī)操作有效。在主機(jī)讀從機(jī)時(shí)正確讀完一字節(jié)后,主機(jī)在下一個(gè)時(shí)鐘周期同樣也要將數(shù)據(jù)線(S
          DA)拉低,發(fā)出認(rèn)可信號(hào),告訴從機(jī)所發(fā)數(shù)據(jù)已經(jīng)收妥。(注:讀從機(jī)時(shí)主機(jī)在最后1字節(jié)數(shù)據(jù)接收完以后不
          發(fā)應(yīng)答,直接發(fā)停止信號(hào))。
          注意:在I2C通信過程中,所有的數(shù)據(jù)改變都必須在時(shí)鐘線SCL為低電平時(shí)改變,在時(shí)鐘線SCL為高電平時(shí)必須保 持?jǐn)?shù)據(jù)SDA信號(hào)的穩(wěn)定,任何在時(shí)鐘線為高電平時(shí)數(shù)據(jù)線上的電平改變都被認(rèn)為是起始或停止信號(hào)。

          下面以AT24C01A為例,對(duì)幾個(gè)主要工作時(shí)序做詳細(xì)說明。
          (1)AT24LC01A的控制字(節(jié))格式:發(fā)送時(shí)緊跟開始信號(hào)后的4位是器件選擇位,通常為‘1010',它和后面的3位器件地址碼(由AT24C01的A0、A1、A2上的電平?jīng)Q定)共同構(gòu)成了7位的從機(jī)地址。從機(jī)地址后緊跟1位讀/寫控制位,該位為1表示讀,為0表示寫。最后1位是應(yīng)答位,這里它由從機(jī)給出。
          (2)AT24LC01A寫時(shí)序:主機(jī)發(fā)送開始信號(hào),接著發(fā)出從機(jī)地址和寫控制碼,主機(jī)接收從機(jī)發(fā)出的應(yīng)答,主發(fā)送1字節(jié)的地址信息,主機(jī)接收應(yīng)答,主機(jī)寫1字節(jié)數(shù)據(jù)到從機(jī),主機(jī)接收應(yīng)答,主機(jī)發(fā)出停止信號(hào)。寫操作 完成,1字節(jié)數(shù)據(jù)被寫入AT24C01內(nèi)指定地址。AT24C01提供一種頁寫的方式,每次最多可連續(xù)寫入8字節(jié)數(shù)據(jù)再發(fā)送停止信號(hào),當(dāng)寫入數(shù)據(jù)多時(shí)可采用這種方式以加快速度。
          (3)AT24CO1隨機(jī)讀時(shí)序:主機(jī)發(fā)送開始信號(hào),接著發(fā)送從機(jī)地址和寫控制碼,主機(jī)接收應(yīng)答,主機(jī)發(fā)送1字節(jié)的的地址信息,主機(jī)接收應(yīng)答(注意:前面的時(shí)序?yàn)閷懖僮?,目的把起始地址寫入AT24C01A緩沖中,以告知隨后的讀操作從哪個(gè)地址開始,這個(gè)步驟在讀時(shí)序中有時(shí)被稱為"偽寫"),主機(jī)發(fā)送開始信號(hào),主機(jī)發(fā)送從機(jī)地址和讀控制碼,主機(jī)接收應(yīng)答,主機(jī)讀取1字節(jié)數(shù)據(jù),主機(jī)不發(fā)應(yīng)答,主機(jī)發(fā)送停止信號(hào)。完成上面步驟,主機(jī)已從AT24CO1中讀出指定地址內(nèi)1字節(jié)數(shù)據(jù)。
          (4)AT24LC01讀時(shí)序:與隨機(jī)讀時(shí)序相比,主機(jī)沒有給從機(jī)寫入起始地址,所以這種方式用于讀取當(dāng)前地址內(nèi)的數(shù)據(jù)。另,AT24C01也可以采用連續(xù)讀的方式,這樣每次最多可以讀取8字節(jié)。注意:連續(xù)讀時(shí)每讀完1字節(jié)后主機(jī)要發(fā)應(yīng)答給主機(jī),但在最后1字節(jié)后(即停止信號(hào)前)主機(jī)不發(fā)應(yīng)答。

          數(shù)據(jù)線(SDA)上的信號(hào):讀時(shí),從機(jī)在SCL的上升沿將數(shù)據(jù)放到SDA上,寫時(shí),遇到SCL的上升沿,從機(jī)將接收SDA上的數(shù)據(jù)。

          二、并行口:它包含了一批輸入/輸出端口,在PC機(jī)上它是一個(gè)25針的 D 型插口,一般用于連接打印機(jī),因此
          有時(shí)也稱為打印口。

          并行口信號(hào):以打印機(jī)為例,并口I/0信號(hào)中有些是專門用來把數(shù)據(jù)傳送給打印機(jī)的,有些則是用來對(duì)傳
          送過程給以控制的,還有將打印機(jī)的各種工作狀態(tài)信息發(fā)送給CPU的。詳細(xì)如表1所示。表中所有信號(hào)用低電平
          (0V)表示邏輯0,用高電平(5V)表示邏輯1(電壓都是相對(duì)于18-25腳上的接地電勢(shì)而言),凡是前綴用符號(hào)‘-'表示的信號(hào)均指低電平為現(xiàn)役信號(hào)。

          可以看出,編號(hào)為2-9針腳上的信號(hào)是傳遞實(shí)際數(shù)的信號(hào),而其它線上的信號(hào)則是用在對(duì)打印機(jī)進(jìn)行初始化處理和對(duì)打印機(jī)動(dòng)作進(jìn)行同步上。下面簡(jiǎn)單介紹一下打印過程以加深對(duì)并口的理解,CPU通過并口中16和17腳上
          的信號(hào)來選擇打印機(jī),并給以初始化處理。且用13腳上的信號(hào)給以響應(yīng)。在打印機(jī)已準(zhǔn)備好接收數(shù)據(jù)時(shí),就將
          11腳置為低電平(表示可以接收),CPU把數(shù)據(jù)放到并口的數(shù)據(jù)線(2-9)上,并通過1腳上的選通信號(hào)對(duì)打印機(jī)的數(shù)據(jù)進(jìn)行選通。打印機(jī)在收到選通信號(hào)時(shí)將忙信號(hào)(11)置為高電平,表示正在接收數(shù)據(jù)。數(shù)據(jù)接收完畢后,打印機(jī)在短時(shí)間內(nèi)把現(xiàn)役的確認(rèn)信號(hào)(10腳低電平)發(fā)送出去,然后再把忙信號(hào)(11)置成低電平(既非現(xiàn)役)并準(zhǔn)備好接收更多數(shù)據(jù)。

          并行口硬件:并口行現(xiàn)在通常被集成在系統(tǒng)板上,25針插口上的信號(hào)可通過數(shù)據(jù)鎖存器、打印狀態(tài)和打印
          機(jī)控制三個(gè)寄存器(也就是三個(gè)輸入/輸出端口)進(jìn)行程序設(shè)計(jì)和控制。計(jì)算機(jī)系統(tǒng)中通常有多個(gè)并行端口,
          表2列出了它們?cè)谳斎?輸出系統(tǒng)中的地址。需要注意的是這些地址是由系統(tǒng) BIOS 給出的,并不是硬件的物理
          地址,所以可以通過設(shè)置 BIOS 來改變當(dāng)前端口的配置。

          端口寄存器:表3列出了并行端口寄存器各位的意義。這些信號(hào)也是在外部插頭上出現(xiàn)的主要信號(hào)。不過
          寄存器中有些信號(hào)的極性與插頭上相應(yīng)信號(hào)的極性正好相反。比如,選通信號(hào)在插頭上為低電平時(shí),信號(hào)是現(xiàn)
          役的,而在打印機(jī)控制寄存器中則為高電平是現(xiàn)役的。


          通過上面的準(zhǔn)備知識(shí),應(yīng)有以下理解,1、可以把并口的25個(gè)針腳理解為三個(gè)寄存器對(duì)外的映射,除了傳
          送8位實(shí)際數(shù)據(jù)的引腳外,還有用于控制打印機(jī)和取得打印機(jī)當(dāng)前狀態(tài)的引腳,這些引腳有的為輸入,有的為
          輸出,因此可以像用單片機(jī)I/O一樣靈活的運(yùn)用它們。2、I2C總線在通訊過程中,數(shù)據(jù)線(SDA)上的信號(hào)流
          動(dòng)方向是不斷變化的,如:主機(jī)正在寫AT24C01時(shí),SDA的方向?yàn)橹鳈C(jī)到從機(jī),SDA為輸出,寫完一字節(jié)后,要接收應(yīng)答時(shí),SDA的方向變?yōu)閺臋C(jī)到主機(jī),SDA為輸入(對(duì)于主機(jī))。3、并口模擬I2C總線,其實(shí)是用軟件控制并口的 I/O 來輸入輸出 I2C 總線需要的高、低電平信號(hào),從而產(chǎn)生I2C總線的各種時(shí)序。


          (二)制作試驗(yàn)電路:

          實(shí)驗(yàn)用電路

          相對(duì)于并口,P1的13腳接SDA 的輸入,P1的3腳接SDA的輸出,P1的15腳接SCL的輸入,P1的5腳接SCL的輸出。試驗(yàn)用的電路,分析如后:P1的5腳接IC1的SCL端,用做I2C總線的串行時(shí)鐘信號(hào)輸出。因I2C總線中數(shù)據(jù)線(SDA)在不同的時(shí)間可能是輸入也可能是輸出,所以接在IC1 SDA端上的信號(hào)也有兩路,輸出時(shí),P13腳輸出低電平T1導(dǎo)通,SDA被置為低電平,P13 腳輸出高電平T1截止,因 R1的作用SDA被置為高電平。輸入時(shí),P1 通過判斷 13 腳上的電平高低,來讀取SDA上的數(shù)據(jù)。要注意的是用于輸入時(shí)T1必須是截止的,以免SDA被箝位。

          這個(gè)電路具有通用性,AT24C01、AT24CO2、24LC64等24系列的I2C EEPROM 均可按這個(gè)電路與并口連接,所以 不妨把它當(dāng)作實(shí)用工具來認(rèn)真制作。先找一條并口電纜,看電纜插頭的形式,找一個(gè)與之配套的25針插座,購買一個(gè)撥動(dòng)式的IC插座,將IC插座按圖中IC1的連接方法與找來的并口插座相連,然后按圖將T1、R1、C1、直接焊在IC插座或并口插座上,要盡量作的緊湊些。最后將電路固定在一個(gè)合適的小塑料盒內(nèi),好了,現(xiàn)在它是我們的試驗(yàn)器材,等看過后面的內(nèi)容,你會(huì)發(fā)現(xiàn)只要為其配上軟件,它就是一個(gè)用于讀寫I2C EEPROM 的好工具。


          (三)試驗(yàn)程序編寫:
          和其它高級(jí)語言相比,C 更適合于對(duì)硬件編程。但是由于要求工作界面要美觀,目前實(shí)驗(yàn)用到的是VC++。但是在VC條件編制并口程序需要相關(guān)的I/O庫進(jìn)行配置。

          (四)編程:通過上面分析,要用并口來模擬I2C總線來讀寫 AT24C01 ,程序需有以下幾部分:

          發(fā)送I2C開始信號(hào):SCL和 SDA都為高電平,延時(shí)一段時(shí)間后,向378H寫入"0XFD"(其它腳狀態(tài)不變,只是將位 1 置為低電平),使SDA由高電平變?yōu)榈碗娖?,即產(chǎn)生了I2C的開始信號(hào)。最后將在378H中寫入"0XFC"(即其它腳不變,將位0和位1置為低電平)使SCL為低電平,以完成一個(gè)時(shí)鐘,也為后面的讀寫作準(zhǔn)備。

          發(fā)送I2C停止信號(hào):I2C的停止信號(hào)是在SCL為高時(shí),SDA由低變高。程序可按下面步驟來寫,用寫端口函數(shù)
          向378H寫入"0XFC",使SCL和SDA為低電平,延時(shí)一段時(shí)間,向378H寫入"0XFD",使SCL變?yōu)楦唠娖?,SDA為低電平,延時(shí),向378H寫入"0XFF"SCL保持不變,使SDA由原來的低電平變?yōu)楦唠娖?,即產(chǎn)生了一個(gè)停止信號(hào)。延時(shí)一段時(shí)間,最后向378H寫入"0XFE",使SCL為低電平,以完成一個(gè)時(shí)鐘。

          發(fā)送數(shù)據(jù):先把要發(fā)送的數(shù)據(jù)放在一個(gè)變量里,然后按位發(fā)送。方法為,通過位運(yùn)算求得欲發(fā)送位的值(
          1或0),然后用寫端口函數(shù)模擬出SCL和SDA,并按I2C的寫時(shí)序?qū)⒁晃粩?shù)據(jù)發(fā)送出去,程序中可用while循環(huán)語句來控制發(fā)送的位數(shù)和字節(jié)數(shù)。

          主機(jī)(并口)發(fā)送應(yīng)答:I2C總線,主機(jī)發(fā)送應(yīng)答用在連續(xù)讀時(shí)序中,每讀取一字節(jié)(8位)后,主機(jī)使SDA
          保持一個(gè)時(shí)鐘周期的低電平??梢杂脤懚丝诤瘮?shù)先將SDA、SCL置為 0,然后將SCL變高,SDA保持低電平,一個(gè)應(yīng)答信號(hào)既被發(fā)送,最后將SCL置低,完成一個(gè)時(shí)鐘。

          接收數(shù)據(jù):并口讀取I2C總線的數(shù)據(jù)時(shí),必須讓 T1截止,使用并口的13腳來接收SDA上的數(shù)據(jù)??砂聪旅娌?
          驟操作,先用寫端口函數(shù)使SCL為低電平,同時(shí)在并口3腳輸出高電平使 T1 截止。然后用寫端口函數(shù)單獨(dú)將SCL置1,其它位保持不變,模擬出時(shí)鐘上升沿,IC1 將把一位數(shù)據(jù)放到數(shù)據(jù)線SDA上,用讀端口函數(shù) 讀
          取‘打印機(jī)狀態(tài)'寄存器379H當(dāng)前的值,將結(jié)果賦值給一個(gè)變量,然后對(duì)這個(gè)變量進(jìn)行先右移4位,再左移7位
          的運(yùn)算(用以獲得13 腳電平狀態(tài),即打印機(jī)狀態(tài)寄存器的位 4 的值),判斷該變量是否為0,最后將判斷結(jié)果
          移入另外的一個(gè)用于存放‘已讀取數(shù)據(jù)'的變量中,完成讀取一位數(shù)據(jù)的操作,用寫端口函數(shù)使SCL為低電平,
          在下一個(gè)SCL的上升沿,同樣用上面的方法將一位數(shù)據(jù)加入‘已讀取數(shù)據(jù)'變量中??捎脀hile循環(huán)控制要讀的
          位數(shù)和字節(jié)數(shù)。注意以上過程都是在 T1 為截止態(tài)時(shí)進(jìn)行的。

          主機(jī)(并口)接收應(yīng)答:接收應(yīng)答用于寫 I2C 時(shí),每寫一字節(jié)數(shù)據(jù)到從機(jī)后,如果操作成功,從機(jī)在下一
          個(gè)時(shí)鐘內(nèi)使 SDA 為低。主機(jī)查詢應(yīng)答可以加強(qiáng)操作的可靠性。接收應(yīng)答和上面說的接收數(shù)據(jù)大致相同,只是僅 接收一位數(shù)據(jù)并且不存儲(chǔ),直接判斷其值是否為 0,不為 0 時(shí)(即沒有收到應(yīng)答)轉(zhuǎn)錯(cuò)誤處理程序,為 0則繼
          續(xù)后面的操作。在實(shí)際編程時(shí)將這個(gè)步驟合并到寫I2C的操作中。

          有關(guān)延時(shí):I2C器件對(duì)SDA和SCL上的高、低電平信號(hào)需保持的時(shí)間是有規(guī)定的。如:開始信號(hào)的高、低電平
          要保持多長(zhǎng)時(shí)間,數(shù)據(jù)信號(hào)的高、低電平最低要保持多長(zhǎng)時(shí)間等。不同的器件對(duì)這個(gè)時(shí)間有不同的規(guī)定。查找
          24LO02的數(shù)據(jù)手冊(cè),可以知道,它在不同的電壓下對(duì)各信號(hào)要保持的時(shí)間分別在幾百納秒到幾微秒之間。這個(gè)
          時(shí)間也體現(xiàn)了I2C器件的讀寫速度。因?yàn)橛?jì)算機(jī)的速度不同,要用計(jì)算機(jī)并口來模擬I2C很難將這個(gè)時(shí)間精確到
          微秒。為了能夠在不同的計(jì)算機(jī)上可靠的操作I2C總線,試驗(yàn)程序用了C語言的延時(shí)函數(shù)delay();這個(gè)函數(shù)能產(chǎn)
          生的最小延時(shí)為1毫秒。雖然這樣做降低了I2C的讀寫速度,但可以保證操作的可靠性。

          程序代碼:

          /***************************************/
          //控制的地址是0x378
          //SDA信號(hào): PIN13 模擬作為主機(jī)的輸入;
          // PIN3 模擬作為主機(jī)的輸出;
          //SCL信號(hào): PIN15 模擬作為主機(jī)的輸入;
          // PIN5 模擬作為主機(jī)的輸出;
          /***************************************/
          /*************************************/
          //函數(shù)名稱:IIC start 函數(shù)
          //開始信號(hào):在時(shí)鐘線(SCL)為高電平其間,
          //數(shù)據(jù)線(SDA)由高變低,將產(chǎn)生一個(gè)開始信號(hào)。
          /*************************************/
          void port2iicbase::i2c_start()
          {
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);
          SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
          delay(1);
          SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
          delay(1);
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          return;
          }
          /*************************************/
          //函數(shù)名稱:IIC stop 函數(shù)
          //停止信號(hào):在時(shí)鐘線(SCL)為高電平其間,
          //數(shù)據(jù)線(SDA)由低變高,將產(chǎn)生一個(gè)停止信號(hào)
          /*************************************/
          void port2iicbase::i2c_stop()
          {
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);
          SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
          delay(1);/***/
          SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
          delay(1);/**/
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          }
          /*************************************/
          //函數(shù)名稱:IIC 寫一個(gè)字節(jié)函數(shù)
          /*************************************/
          int port2iicbase::i2c_writebyte(char c)
          {
          short int count=7;
          char temp;
          DWORD dwPortVal;
          char e;

          while(count>=0)
          {
          temp=c>>count;
          temp=temp7; //確定傳輸?shù)淖止?jié)
          if (temp=='x80') //傳輸"1"
          {
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          delay(1);
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);
          SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
          delay(1);
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);
          }
          else //傳輸"0"
          {
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          delay(1);
          SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
          delay(1);
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          delay(1);
          }
          count--;
          }
          /**ask**/
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);/***/
          SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
          delay(1);
          // SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          // delay(1);/***/

          GetPortVal(PORT2, dwPortVal, 1);
          e = (char)dwPortVal;
          temp=e>>4;
          temp=temp7;

          if (temp=='x0')
          return 0;
          else
          MessageBox(NULL,"Not Acknowledge!!","發(fā)送錯(cuò)誤",MB_OKCANCEL);
          return 1;
          }
          /*************************************/
          //函數(shù)名稱:IIC 讀一個(gè)字符函數(shù)
          /*************************************/
          char port2iicbase::i2c_readbyte()
          {
          unsigned short count=8;
          char d,e,f='x0';
          DWORD dwPortVal;

          while(count>0)
          {
          SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
          delay(1);/***/
          SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
          delay(1);

          GetPortVal(PORT2, dwPortVal, 1);
          e = (char)dwPortVal;
          d=e>>4;
          d=d7;

          if(d=='x80')
          d='x1';
          f=f1;
          f=(f+d); //組合成字節(jié)
          count--;
          }
          return f;
          }
          /*************************************/
          //函數(shù)名稱:主機(jī)(并口)的發(fā)送應(yīng)答
          /*************************************/
          void port2iicbase::i2c_ask()
          {
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          delay(1);/**/
          SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
          delay(1);
          SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
          delay(1);
          }

          //////////////////////////////////
          //發(fā)送數(shù)據(jù)按鈕
          /////////////////////////////////
          void Cport2iicdlg1::OnWriteok()
          {
          // TOD Add your control notification handler code here
          port2iicbase port2iic;
          char s[100];
          char temp[3];
          int len;
          int i;
          char m_cValue;
          unsigned int WriValue=0;
          int time = 0;

          unsigned short c;
          char d,e;

          #ifdef _PORT2IIC
          SetDlgItemText(IDC_WRITE_STATUS,"正在發(fā)送....");
          GetDlgItem(IDC_EDIT_WRITE)->GetWindowText(s, 100);
          len = strlen(s);
          c = len/2;
          e='x0';
          d='x0';
          i = 0;
          c = 5;
          //寫一頁
          //啟動(dòng)開始信號(hào);
          port2iic.i2c_start();
          //發(fā)送控制信息
          //"xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 寫
          //"xa1" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 1 讀
          port2iic.i2c_writebyte('xa0');
          //發(fā)送地址
          port2iic.i2c_writebyte(e);
          while(c>0)
          {
          temp[0] = s[i];
          temp[1] = s[i+1];
          temp[2] = 0x0;
          sscanf(temp,"%x",WriValue);
          m_cValue = (char)WriValue;
          port2iic.i2c_writebyte(m_cValue);
          c = c-1;
          i+=2;
          }
          port2iic.i2c_stop();
          #if 0
          //24c01 寫128個(gè)字節(jié),調(diào)試寫16個(gè)字;
          c=20;
          e='x0';
          d='x0';
          while(c>0)
          {
          //啟動(dòng)開始信號(hào);
          port2iic.i2c_start();
          //發(fā)送控制信息
          //"xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 寫
          //"xa1" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 1 讀
          port2iic.i2c_writebyte('xa0');
          //發(fā)送地址
          port2iic.i2c_writebyte(e);
          port2iic.i2c_writebyte(d);
          port2iic.i2c_stop();
          d = c/5;
          c = c-1;
          e = e+1;
          }
          Sleep(50);
          //任意讀;
          //讀寫入的數(shù)據(jù)
          b = 0;
          i = 0;
          a = 20;
          while(a > 0)
          {
          //任意讀;
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa0');
          d = char(b);
          port2iic.i2c_writebyte(d);
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa1');
          d = port2iic.i2c_readbyte();
          port2iic.i2c_stop();
          buff[i] = d;
          i++;
          b= b+1;
          a = a - 1;
          }
          #endif
          #else
          len = strlen(s);
          for(i = 0; i len; i+=2)
          {
          temp[0] = s[i];
          temp[1] = s[i+1];
          temp[2] = 0x0;
          sscanf(temp,"%x",WriValue);
          m_nValue = (DWORD)WriValue;
          SetPortVal(0x378,m_nValue,1);
          }
          #endif
          SetDlgItemText(IDC_WRITE_STATUS,"發(fā)送結(jié)束");
          return;
          }

          //////////////////////////////////
          //在定時(shí)器里接收數(shù)據(jù)按鈕
          /////////////////////////////////
          void Cport2iicdlg1::OnTimer(UINT nIDEvent)
          {
          // TOD Add your message handler code here and/or call default
          port2iicbase port2iic;
          DWORD m_nValue = 0;
          CString temp1,temp2;
          CEdit* pReadEdit;
          unsigned short buff[100];

          unsigned short a,b;
          char d;
          int i;
          pReadEdit = (CEdit*) GetDlgItem(IDC_EDIT_READ);
          memset(buff,0x0,100);
          #ifdef _PORT2IIC
          //任意讀;
          #if 0
          //讀寫入的數(shù)據(jù)
          b = 0;
          a = 5;
          i = 0;
          while(a > 0)
          {
          //任意讀;
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa0');
          d = char(b);
          port2iic.i2c_writebyte(d);
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa1');
          d = port2iic.i2c_readbyte();
          port2iic.i2c_stop();
          b= b+1;
          a = a - 1;
          buff[i] = (unsigned short)d;
          buff[i] = buff [i] 0x00ff;
          temp1 = " ";
          temp2.Format(_T("%.2x"),buff[i]);
          if(m_read != _T(""))
          m_read = m_read + temp1;
          m_read = m_read + temp2;
          i++;
          SetDlgItemText(IDC_EDIT_READ,m_read);
          DWORD dwSel = pReadEdit->GetSel();
          pReadEdit->SetSel(HIWORD(dwSel), -1);
          }
          #endif
          #if 1
          //順序讀
          //讀寫入的數(shù)據(jù)
          b = 0;
          a = 5;
          i = 0;
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa0');
          d = char(b);
          port2iic.i2c_writebyte(d);
          port2iic.i2c_start();
          port2iic.i2c_writebyte('xa1');
          while(a > 0)
          {
          d = port2iic.i2c_readbyte();
          a = a - 1;
          if(a > 0)
          port2iic.i2c_ask();
          buff[i] = (unsigned short)d;
          buff[i] = buff [i] 0x00ff;
          temp1 = " ";
          temp2.Format(_T("%.2x"),buff[i]);
          if(m_read != _T(""))
          m_read = m_read + temp1;
          m_read = m_read + temp2;
          i++;
          SetDlgItemText(IDC_EDIT_READ,m_read);
          DWORD dwSel = pReadEdit->GetSel();
          pReadEdit->SetSel(HIWORD(dwSel), -1);
          }
          port2iic.i2c_stop();
          #endif
          #else
          GetPortVal(0x378, m_nValue,1);
          m_nValue = m_nValue 0x000000ff;
          temp1 = " ";
          temp2.Format(_T("%.2x"),m_nValue);
          if(m_read != _T(""))
          m_read = m_read + temp1;
          m_read = m_read + temp2;
          SetDlgItemText(IDC_EDIT_READ,m_read);
          DWORD dwSel = pReadEdit->GetSel();
          pReadEdit->SetSel(HIWORD(dwSel), -1);
          #endif
          CDialog::OnTimer(nIDEvent);
          return;
          }

          以上程序已經(jīng)經(jīng)過了驗(yàn)證能夠正確運(yùn)行。

          模擬信號(hào)相關(guān)文章:什么是模擬信號(hào)


          51單片機(jī)相關(guān)文章:51單片機(jī)教程


          c語言相關(guān)文章:c語言教程




          關(guān)鍵詞: 模擬IIC

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();