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