[an error occurred while processing this directive]
Помогите разобраться с эмуляцией SSP в MPLAB
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Boolat 11 января 2005 г. 13:44

Доброго времени суток!
Привожу фрагмент проги, за вычетом не относящегося к делу. Эта часть должна была тянуть байт из 24LC256 по I2C.
код частично сдёрнут с microchip.com (с английскими комментариями).
При отладке в MPLAB 6.62 процесс зацикливается на ожиданиях:
WakeSlave
bsf SSPCON2,SEN ;
btfsc SSPCON2,SEN ;
goto $-2 ; И вот здесь крутимся
...
rWakeSlave
movwf SSPBUF
btfss PIR1,SSPIF
goto $-2 ; Это место следующего зависания, если "ручками" прошел предыдущее

и т.п.
Что я натворил не так?

list p=18F2525, n=28, t=ON, st=OFF
#include "p18f2525.inc"
;------------------- Variables ------------------------------
CommandAddrL equ 0x084 ; Текущий адрес в EEPROM, мл. байт
CommandAddrH equ 0x085 ;
EESLAVE equ 0x088 ; Device address (1010xxxy)
;------------------VECTORS--------------------------------------------
ORG 0x000000 ; rest vector
GOTO START
ORG 0x000008 ; high priority interrupt vector
GOTO IntVector
ORG 0x000018 ; low priority interrupt vector
GOTO TmrVector
;--------------------PROGRAM-----------------------------------
org 00020h ; Beginning of program EPROM
Start
bsf INTCON,PEIE ; Enable peripheral interrupts
bsf INTCON,GIE ; Enable global interrupts
clrf CommandAddrL ; Начальный адрес в EEPROM
clrf CommandAddrH
movlw 0x52 ; Команда в EEPROM + адрес чипа
movwf EESLAVE
Main
rCall InitI2C ; Инициализация протокола
rCall RdEEPROM ; Поиметь байт из EEPROM
rCall StopI2C ;
infsnz CommandAddrL ; Переход к следующему адресу
inc CommandAddrH
goto Main

; Заглушки прерываний (на самом деле висят свои обработчики)
IntVector ; ---- Прерывания придут сюда
retfie
TmrVector ; ---- И сюда
retfie

; Чтение байта из I2C EEPROM
InitI2C
; configure SSP for hardware master mode I2C
bsf SSPSTAT,SMP ; I2C slew rate control disabled
clrf SSPADD ; Скорость передачи=Fosc/4
bsf SSPCON1,SSPM3 ; I2C master mode in hardware
bsf SSPCON1,SSPEN ; enable SSP module
bsf TRISC,3 ; I2C SCL pin is input
bsf PORTC,3 ; (will be controlled by SSP)
bsf TRISC,4 ; I2C SDA pin is input
bsf PORTC,4 ; (will be controlled by SSP)
return

RdEEPROM
bcf EESLAVE,0 ; write mode
rcall WakeSlave ; посылка СТАРТ-условия, команды и адреса устройтсва
rcall WrADDR ; Посылка адреса в памяти
bsf EESLAVE,0 ; read mode
rcall WakeSlave ; посылка СТАРТ-условия, команды и адреса устройтсва
rcall RdDATA ; приём одного байта
rcall STOPI2C ; посылка СТОП-условия
movf DataByte,W ; get data
return

; Формирование стартового бита, slave address
WakeSlave
bsf SSPCON2,SEN ; Send start bit
btfsc SSPCON2,SEN ; Has SEN cleared yet?
goto $-2 ; No, loop back to test.

; Посылка команды и адреса устройства
rWakeSlave
bcf PIR1,SSPIF ; clear interrupt flag
nop
movf EESLAVE,W
movwf SSPBUF ; move slave address to SSPBUF
btfss PIR1,SSPIF ; has SSP completed sending SLAVE Address?
goto $-2 ; no, loop back to test
btfss SSPCON2,ACKSTAT ; was ACK received from slave?
return ; yes, return to calling routine
bsf SSPCON2,RSEN ; send repeated start bit
btfsc SSPCON2,RSEN ; has repeated start been sent yet?
goto $-2 ; no, loop back to test
bra rWakeSlave ; send slave address again

WrADDR
bcf PIR1,SSPIF ; по этому флагу отслеживаем факт ухода байта в линию
movff CommandAddrH,SSPBUF ; отсылка старшей части адреса
btfss PIR1,SSPIF ; ждём отправки
goto $-2 ;
btfsc SSPCON2,ACKSTAT ; Ждём подтверждения
goto $-2 ;
movff CommandAddrL,SSPBUF ; отсылка младшей части адреса
btfss PIR1,SSPIF ; ждём отправки
goto $-2 ;
btfsc SSPCON2,ACKSTAT ; Ждём подтверждения
goto $-2 ;
return

; receive one byte from slave
RdDATA
bcf PIR1,SSPIF ; по этому флагу будем определять факт прихода байта
bsf SSPCON2,RCEN ; начинаем приём
btfss PIR1,SSPIF ; Ждём принятия
goto $-2 ;
bsf SSPCON2,ACKDT ;
bsf SSPCON2,ACKEN ;
btfsc SSPCON2,ACKEN ; Закончилось время ACK?
goto $-2 ; ждём-с
bcf SSPCON2,RCEN ; disable receive mode
return

; Sends stop bit, waits until sent
StopI2C
bsf SSPCON2,PEN ; send stop bit
btfsc SSPCON2,PEN ; has stop bit been sent?
goto $-2 ; no, loop back to test
return

END

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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru