■ Послано в RU.EMBEDDED ■ Также послано в RU.RADIO.SAMOPAY ■ Также послано в TALKS.ASM ■ Также послано в RU.ASM.CHAINIK ■ Также послано в SU.HARDW.SCHEMES ■ Также послано в SU.HARDW.OTHER ■ Также послано в PC.CODING
Yo All!
Есть контроллер и 2 расширителя портов. Связаны по i2c. Резисторами линни подтянуты Пытаюсь реализовать запись/чтение, но ни чего не получается. Применяю схему из книги Майкла Предко, схожую с той, что в дукументации по контроллеру. Hе приходит бита подтверждения от адресуемого устройства. Что делать? Кда смотреть, что читать? Вот кусочек прошивки. Отладко на PICSTART (MPLAB IDE).
include "p16f877.inc" errorlevel -302 ;suppress "not in bank 0" message #define BAUD D'100' ; Desired Baud Rate in kbps
#define FOSC D'4000' ; Oscillator Clock in kHz
;----------------------------------------------------------------------- ;Macros to select the register bank ;Many bank changes can be optimized when only one STATUS bit changes
Bank0 MACRO ;macro to select data RAM bank 0 bcf STATUS,RP0 bcf STATUS,RP1 ENDM
Bank1 MACRO ;macro to select data RAM bank 1 bsf STATUS,RP0 bcf STATUS,RP1 ENDM
Bank2 MACRO ;macro to select data RAM bank 2 bcf STATUS,RP0 bsf STATUS,RP1 ENDM
Bank3 MACRO ;macro to select data RAM bank 3 bsf STATUS,RP0 bsf STATUS,RP1 ENDM ;------------------------------------------------------------------------ Main ;1 Указываем направление линий SDA, SCL на вход Bank1 MOVLW B'00011000' MOVWF TRISC
;2 Разрешаем режим I2C модуля SSP Bank0 BSF SSPCON, SSPEN
BSF SSPCON, SSPM3 BCF SSPCON, SSPM2 BCF SSPCON, SSPM1 BCF SSPCON, SSPM0
; без номера добавляю RCEN Bank1 ; Configure Baud Rate ; BANKSEL SSPADD bsf SSPSTAT,7 movlw (FOSC / (4 * BAUD)) - 1 ; Calculates SSPADD Setting for movwf SSPADD ; desired Baud rate and sets up SSPADD
; BSF SSPCON2, RCEN
;3 Стартовые условия Bank1 BSF SSPCON2, SEN ; Этот бит должен перидически ;опрашиваться до сброса ;POS3 ; BTFSC SSPCON2, SEN ; GOTO POS3
; BANKSEL PIR1 ; BANK 0 Bank0 btfss PIR1,SSPIF ; Check if done with I2C operation goto $-1 ; I2C module is not ready yet bcf PIR1,SSPIF
;4 Загружаем адрес устройства, к которому нужен доступ Bank0 MOVLW b'0100000' MOVWF SSPBUF Bank1 BSF SSPSTAT, 2 ; бит R/-W -> 1 - задаётся операция чтения ; дальше он опрашивается до сброса - окончания чтения POS4 BTFSC SSPSTAT, 2 GOTO POS4
;5 Бит ACK принимающего усторойства должен контролироваться ; считыванием бита ACKDT (bit 5) в регистере SSPCON2 POS5 BTFSS SSPCON2, ACKDT GOTO POS5
;6 адресс считываемого устройства -> SSPBUF Bank0 MOVLW B'00000000' MOVWF SSPBUF
;7 Если передаётся вторичный адрес, проверяем бит ACK ;Проверяем бит ACKDT в SSPCON2 Bank1 POS7 BTFSC SSPCON2, ACKDT GOTO POS7
;8 Можно инициировать новые стартовые условия bsf SSPCON2, SEN ;и дальше он обрабатывается до сброса POS8 BTFSC SSPCON2, SEN GOTO POS8
;9 для подтверждения или нет контроллером надо установить ;устанавливатся бит ACKEN Bank0 POS9 BSF SSPCON, ACKEN
;10 Бит RCEN регистра SSPCON2 должен инициировать операцию ;приёма байта данных Bank1 bsf SSPCON2, RCEN POS10 BTFSC SSPSTAT, BF ; опрашивается до приёма данных GOTO POS10
;11 (9) и (10) повторяются до приёма всех данных ;GOTO POS9
;12 условия остановки инициируются установкой бита PEN ;регистра SSPCON2 в дальнейшем этот бит опрашивается до сброса BSF SSPCON2, PEN POS12 BTFSC SSPCON2, PEN GOTO POS9
GOTO Main
END
ЗАРАHЕЕ БЛАГОДАРЕH.
WBR, Serg. ... WinNT Uptime: 1 day(s), 3 hour(s), 55 min.