新會員
Joined
: 2005/12/23 17:20 最後登入時間
: 2006/10/28 21:31
Group:
註冊會員
Level : 2 HP : 0 / 28 MP : 3 / 1548 EXP : 12
|
我參考了範例程式寫出來的主端和從端的程式..但是我在ICE2000裡一步一步慢慢執行時..就卡在I2C_BYTE_WRITE裡發出起始狀態候等待SSPIF為HI的迴圈...我參考了[PIC16F87X快速上手]一書中I2C章節各種模式設定..我看不出哪裡有錯誤 ......................................................以下是我改的程式(如果不接受貼程式發問的話也希望建議一下可能是哪裡出錯了,我會去找板主介紹的書在試試) (主控端) LIST P=16F873A #INCLUDE <P16F873A.INC> I2C_Data equ 0x21 org 0x00 nop goto Prog_Main nop nop Prog_Main: BANKSEL TRISB ; Select Bank 1 movlw b'11000000' ; setup PORTB movwf TRISB BSF OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups call InitI2C Main: BANKSEL I2C_Data ; Bank Switching, in case its bank is differ than I2C_Addr !! movlw 0x99 movwf I2C_Data ; 設定欲寫入的資料 call I2C_BYTE_WRITE ; Write to I2C Device when Address & Data are set OK call I2C_BYTE_READ nop ; 將中斷點設定於此 , 應該看到 W 暫存器的值 nop ; 等於剛才寫入的資料 goto $ I2C_BYTE_WRITE: ; Write a Byte to I2C_Addr with I2C_Data call StartI2C ; Set SSPCON2.SEN call WaitI2C ; Wait PIR1,SSPIF BANKSEL SSPBUF movlw B'10001110' ; Write Command................ movwf SSPBUF call WaitI2C BANKSEL I2C_Data movf I2C_Data,W BANKSEL SSPBUF movwf SSPBUF call WaitI2C call StopI2C ; Initial STOP Condition call WaitI2C ; Wait Until STOP Condition Terminated return I2C_BYTE_READ: ; Read a Byte @ I2C_Addr to Buffer I2C_Data call StartI2C ; Set SSPCON2.SEN call WaitI2C ; Wait PIR1,SSPIF BANKSEL SSPBUF movlw B'10001111' ; Write Read Command.......... movwf SSPBUF call WaitI2C call RecI2C ; Enable I2C Receive call WaitI2C ; Wait Until Buffer Received BANKSEL SSPBUF movf SSPBUF,W ; Save to I2C_Data First !! BANKSEL I2C_Data movwf I2C_Data call NACKI2C ; Initial NACK Response !! call WaitI2C ; Wait until NACK sent out call StopI2C ; Initial STOP Condition call WaitI2C ; Wait Until STOP Condition Terminated return InitI2C: ; The subroutine of I2C Initialization BANKSEL TRISC movlw B'00011000' ; Initial PortC,bit 3 & 4 as Input movwf TRISC ; RC3 = SCL , RC4 = SDA BANKSEL PORTC movlw 0xff movwf PORTC movlw 0x09 ; This gives 100KHz I2C clock @ 4MHz...... banksel SSPADD movwf SSPADD movlw b'10000000' ; Disable slew rate control. banksel SSPSTAT movwf SSPSTAT movlw b'00000000' ; movwf SSPCON2 ; Setup MSSP for continuous reception. movlw b'00101000' ; Enable MSSP and setup for I2C master banksel SSPCON ; mode. movwf SSPCON return StartI2C: ; Initiate the I2C START condition. banksel SSPCON2 bsf SSPCON2,SEN return StopI2C: ; Initiate the I2C STOP condition. banksel SSPCON2 MOVLW B'00000001' MOVWF SSPCON2 return RstartI2C: ; Initiate the I2C restart condition. banksel SSPCON2 bsf SSPCON2,RSEN return NACKI2C: banksel SSPCON2 bsf SSPCON2,ACKDT ; Set the ACK bit bsf SSPCON2,ACKEN ; Initiate the NACK sequence. return ACKI2C: banksel SSPCON2 bcf SSPCON2,ACKDT ; Clear the ACK bit bsf SSPCON2,ACKEN ; Initiate the NACK sequence. return
RecI2C: banksel SSPCON2 ; bsf SSPCON2,RCEN ; Set the receive enable bit. return
WaitI2C: ; Poll for SSPIF banksel PIR1 FLoop: btfss PIR1,SSPIF goto FLoop bcf PIR1,SSPIF return end _________________________________________ (從屬端) #INCLUDE <P16C62A.INC> TEMP EQU 20H ORG 0000H GOTO START ORG 0004H BANKSEL SSPSTAT BTFSC SSPSTAT,R GOTO WAS_READ WAS_WRITE: BTFSC SSPSTAT,D GOTO WRITE2 BANKSEL SSPBUF MOVFW SSPBUF ;CLEAR BF GOTO CLRIF WRITE2: BANKSEL SSPBUF MOVFW SSPBUF ;CLEAR BF MOVWF PORTB MOVWF TEMP BCF PIR1,SSPIF ;CLEAR SSPIF GOTO END_INT WAS_READ: MOVLW B'10101010' BANKSEL SSPBUF MOVWF SSPBUF ;SET BF BSF SSPCON,CKP ;RELEASE CLOCK LINE CLRIF: BCF PIR1,SSPIF ;CLEAR SSPIF END_INT: RETFIE START: BANKSEL TRISA MOVLW B'11111111' MOVWF TRISA MOVWF TRISB MOVWF TRISC BANKSEL SSPCON MOVLW B'00111110' ;I2C SLAVE, 7-BIT WITH INTERRUPT MOVWF SSPCON MOVLW B'00000000' MOVWF PIR1 BANKSEL SSPADD MOVLW B'10001110' ;I2C ADDRESS SETTING MOVWF SSPADD MOVLW B'11000000' MOVWF INTCON MOVLW B'00001000' MOVWF PIE1 LOOP: GOTO LOOP END
發表於: 2006/4/27 23:47
|