I2C на PIC16F877(MASTER) ПОМОГИТЕ ПЛИЗ.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Коля 13 января 2003 г. 15:36

Начал работать с I2C.Нашёл в инете процедурки для PIC16f873, включил передача байтов НОРМАЛЬНО, а приём ... не работает :(( процедура приёма байта. Не могу понять почему????. На осциле после отправки байта адреса SLAVE отвечает(ACK), потом генерятся импульсы на SCL а на SDA=1(должно быть 00000011)и всё ($): на SDA=1 SCL=0. Заранее БЛАГОДАРЕН за помощь!!!!
#include
cblock 20H
ResultH
Registr1
Registr2
WREGsave
STATUSsave
PCLATHsave
FSRsave
endc

org 0x00

goto Begin

Begin

banksel PORTA
clrf PORTA
clrf PORTB
clrf PORTD
clrf PORTE
clrf ADCON0 ; выключить модуль ADC

banksel TRISA
movlw B'00000000' ; все выходы
movwf TRISA
movwf TRISD
movwf TRISE
movwf TRISB

banksel OPTION_REG
movlw B'10000000'
movwf OPTION_REG

call SetupI2C

START
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
call Pause
;----------
; ПРИНИМАЕМ
;----------
call I2CStart

movlw b'10100001'
call I2CSend ; отправка адреса

call I2CNRecv ; приём байта без подтверждения
movwf ResultH

call I2CStop

goto START

;Установка шины в режим I2C
SetupI2C:
; Setup I2C:

banksel SSPCON ;
clrf SSPCON ; Disable SSP

banksel SSPSTAT
clrf SSPSTAT^80h

banksel TRISC^80h
bsf TRISC^80h,3 ;exit
bsf TRISC^80h,3 ;exit

banksel SSPSTAT
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 STATUS,RP0
bcf PIR1,SSPIF

banksel SSPCON
movlw b'00101000'
movwf SSPCON ;

return

;---------------------------------------------------------------------

;Выдача START
;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)

banksel SSPSTAT

; Wait for bus
i2cwfb: btfsc SSPSTAT^80h,P
goto i2css
btfsc SSPSTAT^80h,S
goto i2cwfb

i2css:
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

;---------------------------------------------------------------------

;Выдача STOP
;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
;Если принят АСК - результат 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

movwf SSPBUF ; W -> buf
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

return
;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

bcf STATUS,RP0

return ; Exit from proc.
;End I2CRecv

;---------------------------------------------------------------------

;Получение байта без подтверждения (NOАСК).
;Полученый байт записываеться в 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

bcf STATUS,RP0

return ;
;End I2CNRecv

Pause
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
Return
End

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru