; 4. 如果为高电平,设置错误状态,返回
; 5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行
;---------------------------------------
BSF STATUS,RP0
BCF TRISC,SCL
BSF TRISC,SDA
NOP
NOP
BSF TRISC,SCL
NOP
BCF STATUS,RP0
BTFSC RC,SDA
GOTO TX_ERR
BSF STATUS,RP0
BCF TRISC,SCL
BCF STATUS,RP0
BCF BUSSTA,TX_PROGRESS
BSF BUSSTA,TX_SUCCESS
BCF BUSSTA,ACK_ERROR
GOTO TX_END
TX_ERR BCF BUSSTA,TX_PROGRESS
BCF BUSSTA,TX_SUCCESS
BSF BUSSTA,ACK_ERROR
TX_END RETURN
;=======================================
;从EEPROM中读出 8 位的数据,并发送发送ACK信号
;入口: EEPROM 存储器
; BUSCON 寄存器
;出口: RXBUF 寄存器
; BUSSTA 寄存器
;=======================================
I2CRXB BCF STATUS,RP0
BSF BUSSTA,RX_PROGRESS
BCF BUSSTA,RX_SUCCESS
MOVLW 0X08
MOVWF BCOUNT
RXLOOP CLRWDT
BSF STATUS,RP0
BCF TRISC,SCL ;定义TRISC<SCL>为输出
BSF TRISC,SDA ;定义TRISC<SDA>为输入
NOP
NOP
BSF TRISC,SCL ;TRISC<SCL>输出高电平
NOP
BCF STATUS,RP0
BCF STATUS,C
BTFSC RC,SDA ;原指令为BTFSC TRISC,SDA
BSF STATUS,C
RLF RXBUF,F
DECFSZ BCOUNT,F
GOTO RXLOOP
;---------------------------------------
;发送ACK信号到EEPROM
;判断接收的是否为最后一个字节
;LAST_BYTE_RX为1,是 SDA发送一个高电平,结束
;LAST_BYTE_RX为0,不是 SDA发送一个低电平ACK,继续接收
;---------------------------------------
BSF STATUS,RP0
BCF TRISC,SCL
BCF TRISC,SDA
BTFSC BUSCON,LAST_BYTE_RX ;检测是否是最后一个字节
BSF TRISC,SDA ;是最后一个字节
NOP ;发送ACK信号
BSF TRISC,SCL
NOP
NOP
NOP
NOP
BCF TRISC,SCL
BCF STATUS,RP0
BCF BUSSTA,RX_PROGRESS
BSF BUSSTA,RX_SUCCESS
RETURN
;=======================================
;I2C 开始信号
;输入: 无
;输出: BUFSSTA<BUS_BUSY>
;=======================================
I2CSTART
BSF STATUS,RP0
BSF TRISC,SDA ;1US
NOP ;1US
上一页 [1] [2] [3] [4] [5] [6] 下一页
本文关键字:单片机 程序 PIC单片机,单片机-工控设备 - PIC单片机