?? hi2c_asm.inc
字號:
; P89LPC932硬件I2C軟件包(主)
;
; 1 使用I2C總線軟件包時P1.2,P1.3切勿寫為0,并要設(shè)置為開漏輸出。
; 2 總線定義為P1.2=SCL,P1.3=SDA,需外接上拉電阻2-10k。
; 3 相應寄存器:
; 地址寄存器 I2ADR 用于存放自身從地址(從方式時才有用)
; 數(shù)據(jù)寄存器 I2DAT 接收/發(fā)送數(shù)據(jù)用
; 控制寄存器 I2CON 用于硬件I2C的設(shè)置、使能、啟動、結(jié)束,
; 應答控制,中斷標志等。
; 狀態(tài)寄存器 I2STAT 指示I2C總線的操作狀態(tài)碼,高5位有效,
; 若I2C中斷志置位,可查詢此寄存器判斷
; 總線情況。
; SCL占空比寄存器 I2SCLH、I2SCLL 設(shè)置SCL的頻率發(fā)生。
;
; 此軟件包是以查詢方式完成各種總線操作的,在使用前應對總線進行檢查,并
;使用看門狗,以防等待總線而造成死機。
; 更新時間:2002.11.05
;
;申請總線
;功能:進行I2C總線的初始化--包括時鐘選擇,I2C使能,發(fā)送起始信號等等。
; I2EN為1,設(shè)置為主機;CRSEL位為0,使用內(nèi)部SCL發(fā)生器。
GETBUS:
MOV I2SCLH,#15 ;設(shè)置SCL高電平的PCLK周期數(shù)
MOV I2SCLL,#15 ;設(shè)置SCL低電平的PCLK周期數(shù),6MHz時為100Kbit/S
MOV I2CON,#64H ;使用內(nèi)部SCL發(fā)生器,I2EN和AA置位,起動總線
JNB SI,$ ;等待起始信號的發(fā)送
RET
;發(fā)送數(shù)據(jù)函數(shù)
;功能:用于向總線發(fā)送數(shù)據(jù)
;入口參數(shù):ACC 待發(fā)送的數(shù)據(jù)
SENDBYTE:
MOV I2DAT,A ;發(fā)送數(shù)據(jù)
MOV I2CON,#44H ;清除SI位等等
JNB SI,$ ;等待數(shù)據(jù)的發(fā)送
RET
;===================================================================================
; 用戶接口子程序
;進行無子地址寫單字節(jié)
;入口參數(shù):寫入值在ACC
;出口參數(shù):ACK為1時表明操作正確
;占用ACC,一字節(jié)堆棧
IWRBYTE:
CLR ACK
ACALL GETBUS ;啟動總線
PUSH ACC ;先保護待發(fā)送的數(shù)據(jù)
MOV A,SLA ;器件尋址
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#18H,IWRBEND ;發(fā)送器件地址,若無應答則退出操作(18H是總線狀態(tài)碼)
POP ACC
ACALL SENDBYTE ;發(fā)送數(shù)據(jù)
MOV A,I2STAT
CJNE A,#28H,IWRBEND
SETB ACK ;設(shè)置出口標志位
IWRBEND:MOV I2CON,#54H ;結(jié)束總線
RET
;進行隨機地址多字節(jié)寫
;入口參數(shù):器件從地址SLA 子地址SUBA 發(fā)送數(shù)據(jù)區(qū)MTD 讀入字節(jié)數(shù)NUMBYTE
;出口參數(shù):ACK 為1時操作正確。
;占用R0,R1,ACC
IWRNBYTE:
CLR ACK
MOV R0,#MTD
MOV R1,NUMBYTE
ACALL GETBUS ;啟動總線
MOV A,SLA
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#18H,IWRNEND
MOV A,SUBA
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#28H,IWRNEND ;無應答則退出
IWRN_L1:MOV A,@R0
ACALL SENDBYTE ;發(fā)送數(shù)據(jù)
MOV A,I2STAT
CJNE A,#28H,IWRNEND ;無應答則退出
INC R0
DJNZ R1,IWRN_L1
SETB ACK ;置標志位
IWRNEND:MOV I2CON,#54H
RET
;進行無子地址多字節(jié)寫
;入口參數(shù):器件從地址SLA 發(fā)送數(shù)據(jù)區(qū)MTD 讀入字節(jié)數(shù)NUMBYTE
;出口參數(shù):ACK 為1時操作正確。
;占用R0,R1,ACC
IWRNBYTEEXT:
CLR ACK
MOV R0,#MTD
MOV R1,NUMBYTE
ACALL GETBUS ;啟動總線
MOV A,SLA
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#18H,IWRNEEND
IWRNE_L1:MOV A,@R0
ACALL SENDBYTE ;發(fā)送數(shù)據(jù)
MOV A,I2STAT
CJNE A,#28H,IWRNEEND ;無應答則退出
INC R0
DJNZ R1,IWRNE_L1
SETB ACK ;置標志位
IWRNEEND:MOV I2CON,#54H
RET
;進行立即地址單字節(jié)讀
;出口參數(shù):讀出值在ACC
;出口參數(shù):ACK 為1時操作正確。
;注:SLA要為寫的地址,因為此子程序會自動加1
IRDBYTE:
CLR ACK
ACALL GETBUS
MOV A,SLA
INC A ;讀操作的器件尋址
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#40H,IRDBEND
MOV I2CON,#40H ;接收一字節(jié)數(shù)據(jù)即發(fā)送非應答位
JNB SI,$ ;等待接收數(shù)據(jù)
MOV A,I2STAT
CJNE A,#58H,IRDBEND
MOV A,I2DAT ;讀取數(shù)據(jù)
SETB ACK
IRDBEND:MOV I2CON,#54H
RET
;進行隨機地址多字節(jié)讀
;入口參數(shù):器件從地址SLA 子地址SUBA 接收數(shù)據(jù)區(qū)MRD 讀入字節(jié)數(shù)NUMBYTE
;出口參數(shù):ACK 為1時操作正確。
;占用R0,R1,ACC
IRDNBYTE:
CLR ACK
MOV R0,#MRD
MOV R1,NUMBYTE
ACALL GETBUS
MOV A,SLA
ACALL SENDBYTE ;器件尋址
MOV A,I2STAT
CJNE A,#18H,IRDNEND ;無器件應答即退出
MOV A,SUBA ;寫入器件子地址
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#28H,IRDNEND ;總線出錯即退出
MOV I2CON,#64H ;重新啟動總線
JNB SI,$
MOV A,SLA
INC A ;讀操作的器件尋址
ACALL SENDBYTE
MOV A,I2STAT
CJNE A,#40H,IRDNEND
IRDN_L1: DJNZ R1,IRDN_L2
MOV I2CON,#40H ;取最后一個數(shù)據(jù)后發(fā)送非應答位
JNB SI,$
MOV A,I2STAT
CJNE A,#58H,IRDNEND
MOV A,I2DAT ;將數(shù)據(jù)取出
MOV @R0,A ;數(shù)據(jù)存入MRD區(qū)中(R0指針指向MRD區(qū))
SETB ACK
IRDNEND: MOV I2CON,#54H
RET
IRDN_L2: MOV I2CON,#44H ;接收數(shù)據(jù)并發(fā)送應答位
JNB SI,$
MOV A,I2STAT
CJNE A,#50H,IRDNEND ;總線出錯即退出
MOV A,I2DAT ;取數(shù)據(jù)
MOV @R0,A ;數(shù)據(jù)存入MRD區(qū)
INC R0
SJMP IRDN_L1
;進行無子地址多字節(jié)讀
;入口參數(shù):器件從地址SLA 接收數(shù)據(jù)區(qū)MRD 讀入字節(jié)數(shù)NUMBYTE
;出口參數(shù):ACK 為1時操作正確。
;占用R0,R1,ACC
IRDNBYTEEXT:
CLR ACK
MOV R0,#MRD
MOV R1,NUMBYTE
ACALL GETBUS
MOV A,SLA
INC A
ACALL SENDBYTE ;器件尋址
MOV A,I2STAT
CJNE A,#40H,IRDNEEND
IRDNE_L1:DJNZ R1,IRDNE_L2
MOV I2CON,#40H ;取最后一個數(shù)據(jù)后發(fā)送非應答位
JNB SI,$
MOV A,I2STAT
CJNE A,#58H,IRDNEEND
MOV A,I2DAT
MOV @R0,A ;數(shù)據(jù)存入MRD區(qū)中(R0指針指向MRD區(qū))
SETB ACK
IRDNEEND:MOV I2CON,#54H
RET
IRDNE_L2:MOV I2CON,#44H ;接收數(shù)據(jù)并發(fā)送應答位
JNB SI,$
MOV A,I2STAT
CJNE A,#50H,IRDNEEND ;總線出錯即退出
MOV A,I2DAT ;取數(shù)據(jù)
MOV @R0,A ;數(shù)據(jù)存入MRD區(qū)
INC R0
SJMP IRDNE_L1
;使用前須在你的程序里要做以下定義:
;定義變量: SLA 器件從地址 SUBA器件子地址 NUMBYTE讀/寫的字節(jié)數(shù) ,位變量ACK
;定義常量: MTD 發(fā)送數(shù)據(jù)緩沖區(qū)首址 MRD 接收數(shù)據(jù)緩沖區(qū)首址
;
;定義LPC932的I2C相關(guān)寄存器的定義
;I2ADR DATA 0DBH
;I2DAT DATA 0DAH
;I2CON DATA 0D8H
;I2STAT DATA 0D9H
;I2SCLH DATA 0DDH
;I2SCLL DATA 0DCH
;STA BIT I2CON.5
;SI BIT I2CON.3
;
;軟件包接口
;(1)IRDBYTE 立即地址讀單字節(jié)子程序
; 入口:器件從地址SLA
; 出口:讀出數(shù)據(jù)ACC,應答位ACK。
; 占用資源:ACC,CY
;
;(2)IRDNBYTE 隨機地址讀多字節(jié)子程序
; 入口:器件從地址SLA,器件子地址SUBA,讀出字節(jié)數(shù)NUMBYTE
; 出口:讀出數(shù)據(jù)依次放在MRD區(qū),應答位ACK。
; 占用資源:R0,R1,ACC,CY
;
;(3)IWRBYTE 立即地址寫單字節(jié)子程序
; 入口: 器件從地址SLA,寫入的數(shù)據(jù)ACC
; 出口: 應答位ACK。
; 占用資源:ACC,CY,一字節(jié)堆棧
;
;(4)IWRNBYTE 立即地址寫多字節(jié)子程序
; 入口: 器件從地址SLA,寫入的數(shù)據(jù)依次放在MTD區(qū)
; 出口: 應答位ACK。
; 占用資源:R0,R1,ACC,CY
;(ACK為調(diào)試/測試位,ACK為0時表示無器件應答或總線出錯)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -