專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
十年專注單片機(jī)方案開(kāi)發(fā)的方案公司英銳恩,分享PIC16F877單片機(jī)完成i2c通訊程序。英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類(lèi)運(yùn)算放大器等。
用PIC16F877完成的I2C通訊
W_TEMP EQU 72H ;W的臨時(shí)寄存器
STATUS_TEMP EQU 73H
DATA_W EQU 74H ;數(shù)據(jù)寫(xiě)入寄存器
DATA_R EQU 75H ;數(shù)據(jù)讀出寄存器
SCL EQU 3 ;時(shí)鐘的位地址
SDA EQU 4
WP EQU 2 ;寫(xiě)保護(hù)線
ADDRESS EQU 26H ;定義地址常數(shù)
VALUE EQU 55H ;計(jì)劃寫(xiě)入的值
;----------------------------------------
ORG 0000H
NOP
CLRF PCLATH ;確保頁(yè)選位為0
CALL INIT_I2C ;I2C的初始化程序
CLRF DATA_R ;清數(shù)據(jù)讀取寄存器
MOVLW VALUE
MOVWF DATA_W
CALL WRITE ;調(diào)用寫(xiě)子程序
CALL DELAY10MS ;延時(shí)
CALL READ ;調(diào)用讀子程序
GOTO $
;-------------------------------------------------------------------------
WRITE
WETSTART
CALL I2C_IDLE ;I2C的初始化程序
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN 建立啟動(dòng)時(shí)序
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF 啟動(dòng)時(shí)序是否完成
GOTO $-1
SENDWRTCOMM
MOVLW B'10100000' ; 7位地址+1位寫(xiě)控制位
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST ;檢測(cè)應(yīng)答信號(hào)
SENDADDRESS
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測(cè)寄存器滿標(biāo)志位
GOTO $-1
MOVLW ADDRESS ;寫(xiě)一個(gè)單元地址字節(jié)
BANKSEL SSPBUF
MOVWF SSPBUF ;開(kāi)始一次字節(jié)寫(xiě)操作
CALL WRTACKTEST ;檢測(cè)應(yīng)答信號(hào)
SENDDATA ;發(fā)送數(shù)據(jù)字節(jié)
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測(cè)寄存器滿標(biāo)志位
GOTO $-1
MOVF DATA_W,0 ;寫(xiě)一個(gè)數(shù)據(jù)字節(jié)
BANKSEL SSPBUF
MOVWF SSPBUF ;開(kāi)始一個(gè)字節(jié)寫(xiě)操作
CALL WRTACKTEST ;檢測(cè)應(yīng)答信號(hào)
BANKSEL PIR1
BCF PIR1,3 ;SSPIF 清除MSSP的中斷標(biāo)志位
WRTSTOP
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN 停止
BANKSEL PIR1
BCF PIR1,3
RETURN
;-----------------------------------------------------------------------
READ
READSTART
CALL I2C_IDLE
BANKSEL PIR1
BCF PIR1,3
BANKSEL SSPCON2
BSF SSPCON2,0
BSF SSPCON2,RSEN
BANKSEL PIR1
BTFSS PIR1,3
GOTO $-1
WRTWRITE
MOVLW 0A0H
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
WRTADDRESS
MOVLW ADDRESS
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
CALL DELAY10MS
RESTART
CALL I2C_IDLE
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF
GOTO $-1
WRTREAD
MOVLW 0A1H
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
BANKSEL PIR1
BCF PIR1,3 ; SSPIF
STARTREAD
BANKSEL SSPCON2
BSF SSPCON2,3 ;RCEN
READDATA
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BTFSS PIR1,3 ;SSPIF
GOTO $-1
BANKSEL SSPBUF
MOVF SSPBUF,0
MOVWF DATA_R
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
SENDREADNACK
BANKSEL SSPCON2
BSF SSPCON2,5 ;ACKDT
BSF SSPCON2,4 ;ACKEN
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF
GOTO $-1
READSTOP
BANKSEL SSPCON2
BSF SSPCON2,2 ;PEN
BANKSEL PIR1
BTFSS PIR1,3 ; SSPIF
GOTO $-1
BCF PIR1,3 ;SSPIF
RETURN
;----------------------------------------------------------------------
WRTACKTEST
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BTFSS PIR1,3
GOTO $-1
RETURN
;-----------------------------------------------------------------------------
I2C_IDLE
BANKSEL SSPSTAT
BTFSC SSPSTAT,2 ;R_W
GOTO $-1
MOVF SSPCON2,0
ANDLW 1FH
BTFSS STATUS,2 ;Z
GOTO $-3
RETURN
;------------------------------------------------------------------------
INIT_I2C
BANKSEL TRISC
BSF TRISC,SDA
BSF TRISC,SCL
BCF TRISE,WP
BANKSEL PORTE
BCF PORTE,WP
BANKSEL SSPADD
MOVLW 9
MOVWF SSPADD
BCF SSPSTAT,6
BSF SSPSTAT,7
BANKSEL SSPCON
MOVLW 38H
MOVWF SSPCON
RETURN
;------------------------------------------------------------------------
DELAY10MS
MOVLW 0FFH
MOVWF 7FH
L1 MOVLW 0FFH
MOVWF 7EH
L2 DECFSZ 7EH,1
GOTO L2
DECFSZ 7FH,1
GOTO L1
RETURN
END