Re: [大問題]麻煩各位幫忙指導一下我的I2C
|
||||
---|---|---|---|---|
高級會員
|
bus一直為HIGH是正常的,只有訊號在I2C BUS傳送或接收時,BUS才會有拉LOW的情形。你可以用OSCILLSCOPE的PROBE利用TRIGGER LEVEL的方法去看看你的I2C(SCL、SDA)是否真的有動作,SLAVE的ack是再第九個CLOCK時會回應給MASTER。
發表於: 2007/6/15 15:01
|
|||
|
[大問題]麻煩各位幫忙指導一下我的I2C
|
||||
---|---|---|---|---|
新會員
|
最近開始學I2C,總覺得學的很奇怪,這個程式寫完後不知道要怎樣去看他的執行結果,拿示波器去勾SDA SCL也都是HIGH態,完全呈現一個搞混的狀態,ACK的訊息也不知道去哪裡看,真的要麻煩各位指導一下了,謝謝。以下是我的程式,是抓MICROCHIP 範例改的:
LIST P=16F877A #INCLUDE <P16F877A.INC> ;************************** EQU ADDRESS ************************ BANK0 EQU 0X01 BANK1 EQU 0X81 BANK2 EQU 0X101 BANK3 EQU 0X181 DATA_INT EQU 0X20 DATA_OUT EQU 0X21 POLL_TEMP EQU 0X22 ;************************** EQU 數值 *************************** WRITE_ADDR EQU B'10100000' READ_ADDR EQU B'10100001' ;***************** START PORTC為輸入 PORTD為輸出 *************** ORG 0X00 NOP BANKSEL BANK1 MOVLW 0XFF MOVWF TRISC CLRF TRISD BANKSEL BANK0 CLRF PORTD ;************************* MAIN ******************************** MAIN: CALL CONFIGURE CALL DATA_WRITE CALL DATA_READ GOTO $ ;************************ 設定I2C起始條件 ********************** CONFIGURE: BANKSEL BANK1 CLRF SSPSTAT BSF SSPSTAT,SMP MOVLW 0X0A MOVWF SSPADD CLRF SSPCON2 BANKSEL BANK0 MOVLW B'00101000' MOVWF SSPCON BCF PIR1,SSPIF BCF PIR2,BCLIF RETURN ;************************ 寫入ADDR AND DATA ******************** DATA_WRITE: CALL B_START BANKSEL BANK0 MOVLW WRITE_ADDR MOVWF DATA_OUT CALL SEND_DATA BANKSEL BANK0 MOVLW 0X27 MOVWF DATA_OUT CALL SEND_DATA BANKSEL BANK0 MOVLW 0X12 MOVWF DATA_OUT CALL SEND_DATA CALL B_STOP CALL POLL_DATA RETURN ;******************** 讀取 ADDR AND DATA *********************** DATA_READ: CALL B_START BANKSEL BANK0 MOVLW WRITE_ADDR MOVLW DATA_OUT CALL SEND_DATA BANKSEL BANK0 MOVLW 0X27 MOVWF DATA_OUT CALL SEND_DATA CALL B_RESTART BANKSEL BANK0 MOVLW READ_ADDR MOVWF DATA_OUT CALL SEND_DATA BANKSEL BANK1 BSF SSPCON2,ACKDT CALL READ_DATA CALL READ_DATA CALL B_STOP RETURN ;************************ B_START 開始傳送 ********************* B_START: BANKSEL BANK0 BCF PIR1,SSPIF BANKSEL BANK1 BSF SSPCON2,SEN MOVLW B'10001100' MOVWF SSPSTAT BANKSEL BANK0 B_START_WAIT: BTFSS PIR1,SSPIF GOTO B_START_WAIT RETURN ;******************* B_RESTART 重新確認 START ****************** B_RESTART: BANKSEL BANK0 BCF PIR1,SSPIF BANKSEL BANK1 BSF SSPCON2,RSEN BANKSEL BANK0 B_RESTART_WAIT: BTFSS PIR1,SSPIF GOTO B_RESTART_WAIT RETURN ;******************* SEND_DATA 傳送資料 ************************ SEND_DATA: BANKSEL BANK0 BCF PIR1,SSPIF MOVFW DATA_OUT MOVWF SSPBUF SEND_DATA_WAIT: BTFSS PIR1,SSPIF GOTO SEND_DATA_WAIT RETURN ;************************ B_STOP 停止 ************************** B_STOP: BANKSEL BANK0 BCF PIR1,SSPIF BANKSEL BANK1 BSF SSPCON2,PEN BANKSEL BANK0 B_STOP_WAIT: BTFSS PIR1,SSPIF GOTO B_STOP_WAIT RETURN ;********************* POLL_DATA 確認寫入 ********************** POLL_DATA: BANKSEL BANK0 MOVLW .100 MOVWF POLL_TEMP POLLING: CALL B_RESTART BANKSEL BANK0 MOVLW WRITE_ADDR MOVWF DATA_OUT CALL SEND_DATA BANKSEL BANK1 BTFSS SSPCON2,ACKSTAT GOTO EXIT_POLL BANKSEL BANK0 DECFSZ POLL_TEMP,F GOTO POLLING EXIT_POLL: CALL B_STOP RETURN ;********************* READ_DATA 讀取資料 ********************* READ_DATA: BANKSEL BANK0 BCF PIR1,SSPIF BANKSEL BANK1 BSF SSPCON2,RCEN BANKSEL BANK0 READ_DATA_WAIT: BTFSS PIR1,SSPIF GOTO READ_DATA_WAIT MOVFW SSPBUF MOVWF DATA_INT BCF PIR1,SSPIF BANKSEL BANK1 BSF SSPCON2,ACKEN BANKSEL BANK0 READ_DATA_WAIT_2: BTFSS PIR1,SSPIF GOTO READ_DATA_WAIT_2 RETURN END
發表於: 2007/6/14 11:23
|
|||
|