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