|
Начал работать с I2C.Нашёл в инете процедурки для PIC16f873, включил передача байтов НОРМАЛЬНО, а приём ... не работает :(( процедура приёма байта. Не могу понять почему????. На осциле после отправки байта адреса SLAVE отвечает(ACK), потом генерятся импульсы на SCL а на SDA=1(должно быть 00000011)и всё ($): на SDA=1 SCL=0. Заранее БЛАГОДАРЕН за помощь!!!! goto Begin banksel PORTA banksel TRISA banksel OPTION_REG call SetupI2C movlw b'10100001' call I2CNRecv ; приём байта без подтверждения call I2CStop ;Установка шины в режим I2C banksel SSPCON ; banksel SSPSTAT banksel TRISC^80h banksel SSPSTAT bcf STATUS,RP0 banksel SSPCON return ;--------------------------------------------------------------------- ;Выдача START banksel SSPSTAT ; Wait for bus i2css: ;--------------------------------------------------------------------- ;Выдача STOP ;--------------------------------------------------------------------- ;Пересылка байта с аккумулятора (с W) movwf SSPBUF ; W -> buf return ;--------------------------------------------------------------------- ;Получение байта с подтверждением (АСК). bcf STATUS,RP0 return ; Exit from proc. ;--------------------------------------------------------------------- ;Получение байта без подтверждения (NOАСК). bcf STATUS,RP0 Pause
E-mail:
info@telesys.ru
#include
cblock 20H
ResultH
Registr1
Registr2
WREGsave
STATUSsave
PCLATHsave
FSRsave
endc
org 0x00
Begin
clrf PORTA
clrf PORTB
clrf PORTD
clrf PORTE
clrf ADCON0 ; выключить модуль ADC
movlw B'00000000' ; все выходы
movwf TRISA
movwf TRISD
movwf TRISE
movwf TRISB
movlw B'10000000'
movwf OPTION_REG
START
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
;----------
; ПРИНИМАЕМ
;----------
call I2CStart
call I2CSend ; отправка адреса
movwf ResultH
goto START
SetupI2C:
; Setup I2C:
clrf SSPCON ; Disable SSP
clrf SSPSTAT^80h
bsf TRISC^80h,3 ;exit
bsf TRISC^80h,3 ;exit
movlw b'10000000'
movwf SSPSTAT^80h
banksel SSPADD
bsf STATUS,RP0 ; >bank1
movlw .49
movwf SSPADD^80h ; 100KHz (= 20MHz/(4*(49+1)) )
banksel PIE1
bcf PIE1^80h,SSPIE
bcf PIE2^80h,BCLIE
bcf PIR1,SSPIF
movlw b'00101000'
movwf SSPCON ;
;I2CStart- Starts I2C, waits for operation complete
;
I2CStart:
banksel PORTC
bsf PORTC,3 ; (will be controlled by SSP)
bsf PORTC,4 ; (will be controlled by SSP)
i2cwfb: btfsc SSPSTAT^80h,P
goto i2css
btfsc SSPSTAT^80h,S
goto i2cwfb
bsf SSPCON2^80h,SEN ; generate Start Condition
i2cs0: btfsc SSPCON,SEN ;Sen cleared?
goto i2cs0
bcf STATUS,RP0 ; > select bank 0
i2cs1: btfss PIR1,SSPIF
goto i2cs1
bcf PIR1,SSPIF
return
;End I2CStart
;I2CStop- Stops I2C, waits for operation complete
;
I2CStop:
banksel SSPCON2
bsf SSPCON2^80h,PEN ; generate Stop Condition
i2cp0: btfsc SSPCON2^80h,PEN ;stop cleared?
goto i2cp0
bcf STATUS,RP0 ; > select bank 0
i2cp1: btfss PIR1,SSPIF ; Wait
goto i2cp1
bcf PIR1,SSPIF
nop
return
;End I2CStop
;Результат тоже в W
;Если принят АСК - результат W=0
;Если не принят - W=1
;I2CSend- Sends W register to I2C shift register
; waits for opration complete
; Result W = 0 : OK, W <> 0 : Error (No Ack)
;
I2CSend:
bcf STATUS,RP0 ; > select bank 0
bcf PIR1,SSPIF
i2ss1: btfss PIR1,SSPIF
goto i2ss1
bsf STATUS,RP0 ; > select bank 1
movlw 0x0 ; Set OK condition
btfsc SSPCON2^80h,ACKSTAT
movlw 0x1 ;Set error condition
banksel PORTD
movwf PORTD
banksel PIR1
bcf PIR1,SSPIF
nop
;End I2CSend
;Полученый байт записываеться в W.
;I2CRecv- Receives data from bus to W register with ACK
; Result: W - Data
I2CRecv:
bcf STATUS,RP0
bcf PIR1,SSPIF
bsf STATUS,RP0 ; >bank1
bsf SSPCON2^80h,RCEN ; Enable receiving
bcf STATUS,RP0 ; >bank0
i2rc1: btfss PIR1,SSPIF ; Wait for INT
goto i2rc1 ; on receive byte
movf SSPBUF,0 ; store buffer
bsf STATUS,RP0 ; >bank 1
bcf SSPCON2^80h,ACKDT ; Acknowledge!
bsf SSPCON2^80h,ACKEN ; Send ACK
bcf STATUS,RP0 ; >bank0
i2rc2: btfss PIR1,SSPIF ; Wait for INT
goto i2rc2 ; on sent ack
bsf STATUS,RP0 ; >bank1
bcf SSPCON2^80h,RCEN ; Clear receiving if it not clear
;End I2CRecv
;Полученый байт записываеться в W.
;I2CNRecv- Receives data from bus to W register with NO ACK
; Result: W - Data
I2CNRecv:
bcf STATUS,RP0
bcf PIR1,SSPIF
bsf STATUS,RP0 ; банк1
bsf SSPCON2^80h, RCEN
bcf STATUS,RP0
i2nrc1: btfss PIR1,SSPIF
goto i2nrc1
movf SSPBUF,0
bsf STATUS,RP0
bsf SSPCON2^80h,ACKDT
bsf SSPCON2^80h,ACKEN
bcf STATUS,RP0
i2nrc2: btfss PIR1,SSPIF
goto i2nrc2
bsf STATUS,RP0
bcf SSPCON2^80h,RCEN
return ;
;End I2CNRecv
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
Return
End
Ответы