Сразу хочу предупредить, с PIC процессорами опыта маловато, возможно именно из-за этого возникла проблема.
Суть ее в следующем, написал код мастера шины I2C для процессора PIC16F1823, вот фрагмент, генерирующий СТАРТ:
Код
;//////////////////////////////////////////////////////////////
;// ПЕРЕДАЕМ ИМПУЛЬС СТАРТ
BANKSEL SSP1CON2
clrf SSP1CON2
bsf SSP1CON2,SEN ;ПЕРЕДАЕМ ИМПУЛЬС СТАРТА
;//////////////////////////////////////////////////////////////
;// ЖДЕМ ПЕРЕДАЧИ ИМПУЛЬСА СТАРТ
BANKSEL PIR1
read_i2c_wait_start:
BANKSEL PIR1
btfss PIR1,SSP1IF
goto read_i2c_wait_start
bcf PIR1,SSP1IF
;// ПЕРЕДАЕМ ИМПУЛЬС СТАРТ
BANKSEL SSP1CON2
clrf SSP1CON2
bsf SSP1CON2,SEN ;ПЕРЕДАЕМ ИМПУЛЬС СТАРТА
;//////////////////////////////////////////////////////////////
;// ЖДЕМ ПЕРЕДАЧИ ИМПУЛЬСА СТАРТ
BANKSEL PIR1
read_i2c_wait_start:
BANKSEL PIR1
btfss PIR1,SSP1IF
goto read_i2c_wait_start
bcf PIR1,SSP1IF
Цикл read_i2c_wait_start становится бесконечным, т.е. почему-то флаг SSP1IF не устанавливается.
Не могу понять почему!
На всякий случай привожу фрагмент инициализации I2C
Код
BANKSEL SSP1STAT
clrf SSP1STAT ; HIGH SPEED MODE (400 kHz), SMBus disabled
BANKSEL SSP1CON1
movlw (BIT(SSPEN) | BIT(SSPM3)); I2C MASTER ENABLED (CLOCK = FOSC / (4 * (SSP1ADD+1)))
movwf SSP1CON1
BANKSEL SSP1CON2
clrf SSP1CON2
BANKSEL SSP1CON3
clrf SSP1CON3
BANKSEL SSP1MSK
clrf SSP1MSK
BANKSEL SSP1ADD
movlw ClockValue ;СКОРОСТЬ РАБОТЫ I2C
movwf SSP1ADD
clrf SSP1STAT ; HIGH SPEED MODE (400 kHz), SMBus disabled
BANKSEL SSP1CON1
movlw (BIT(SSPEN) | BIT(SSPM3)); I2C MASTER ENABLED (CLOCK = FOSC / (4 * (SSP1ADD+1)))
movwf SSP1CON1
BANKSEL SSP1CON2
clrf SSP1CON2
BANKSEL SSP1CON3
clrf SSP1CON3
BANKSEL SSP1MSK
clrf SSP1MSK
BANKSEL SSP1ADD
movlw ClockValue ;СКОРОСТЬ РАБОТЫ I2C
movwf SSP1ADD