<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

由于工作需要,用計算機來(lái)讀寫(xiě)AT24C01A,用VC語(yǔ)言實(shí)現并口模擬I2C 。

(一)試驗前的準備知識:

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

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

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

數據線(xiàn)(SDA)上的信號:讀時(shí),從機在SCL的上升沿將數據放到SDA上,寫(xiě)時(shí),遇到SCL的上升沿,從機將接收SDA上的數據。

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

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

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

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

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


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


(二)制作試驗電路:

實(shí)驗用電路

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

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


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

(四)編程:通過(guò)上面分析,要用并口來(lái)模擬I2C總線(xiàn)來(lái)讀寫(xiě) AT24C01 ,程序需有以下幾部分:

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

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

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

主機(并口)發(fā)送應答:I2C總線(xiàn),主機發(fā)送應答用在連續讀時(shí)序中,每讀取一字節(8位)后,主機使SDA
保持一個(gè)時(shí)鐘周期的低電平??梢杂脤?xiě)端口函數先將SDA、SCL置為 0,然后將SCL變高,SDA保持低電平,一個(gè)應答信號既被發(fā)送,最后將SCL置低,完成一個(gè)時(shí)鐘。

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

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

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

程序代碼:

/***************************************/
//控制的地址是0x378
//SDA信號: PIN13 模擬作為主機的輸入;
// PIN3 模擬作為主機的輸出;
//SCL信號: PIN15 模擬作為主機的輸入;
// PIN5 模擬作為主機的輸出;
/***************************************/
/*************************************/
//函數名稱(chēng):IIC start 函數
//開(kāi)始信號:在時(shí)鐘線(xiàn)(SCL)為高電平其間,
//數據線(xiàn)(SDA)由高變低,將產(chǎn)生一個(gè)開(kāi)始信號。
/*************************************/
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;
}
/*************************************/
//函數名稱(chēng):IIC stop 函數
//停止信號:在時(shí)鐘線(xiàn)(SCL)為高電平其間,
//數據線(xiàn)(SDA)由低變高,將產(chǎn)生一個(gè)停止信號
/*************************************/
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*/
}
/*************************************/
//函數名稱(chēng):IIC 寫(xiě)一個(gè)字節函數
/*************************************/
int port2iicbase::i2c_writebyte(char c)
{
short int count=7;
char temp;
DWORD dwPortVal;
char e;

while(count>=0)
{
temp=c>>count;
temp=temp7; //確定傳輸的字節
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ā)送錯誤",MB_OKCANCEL);
return 1;
}
/*************************************/
//函數名稱(chēng):IIC 讀一個(gè)字符函數
/*************************************/
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); //組合成字節
count--;
}
return f;
}
/*************************************/
//函數名稱(chēng):主機(并口)的發(fā)送應答
/*************************************/
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ā)送數據按鈕
/////////////////////////////////
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;
//寫(xiě)一頁(yè)
//啟動(dòng)開(kāi)始信號;
port2iic.i2c_start();
//發(fā)送控制信息
//"xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 寫(xiě)
//"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 寫(xiě)128個(gè)字節,調試寫(xiě)16個(gè)字;
c=20;
e='x0';
d='x0';
while(c>0)
{
//啟動(dòng)開(kāi)始信號;
port2iic.i2c_start();
//發(fā)送控制信息
//"xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 寫(xiě)
//"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);
//任意讀;
//讀寫(xiě)入的數據
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ā)送結束");
return;
}

//////////////////////////////////
//在定時(shí)器里接收數據按鈕
/////////////////////////////////
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
//讀寫(xiě)入的數據
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
//順序讀
//讀寫(xiě)入的數據
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)過(guò)了驗證能夠正確運行。

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


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


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




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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>