1. К коду следует давать коментарии (все таки "публичное выступление"). Установку линий в состояния можно было сделать "говорящими" макросами.
Рассмотрим кусочек вашего кода:
movlw 0xAA ; Записываем b'10101010' по заданному адресу movwf Byte call SendByte call ACKTest ; Байт принят? btfsc Err, 0 ; Если не принят то обработка ошибки call OnError
call StopI2C ; Установка ЕЕПРОМ в режим Стоп
При выходе из процедуры SendByte имеем: [B]SCL = L, SDA = L;
Далее вызов ACKTest:
ACKTest clrf Err
clrf PORTA - это лишнее bsf STATUS, RP0 movlw b'00011101' - !!! SCL должен так же быть как вход (подтяжка есть с наружи), так как slave устройство может ужерживать SCL в низком до момента выставления ACK.
movwf TRISA bcf STATUS, RP0
bsf PORTA, SCL - см. выше nop nop nop nop btfsc PORTA, SDA bsf Err, 0 bcf PORTA, SCL
clrf PORTA bsf STATUS, RP0 movlw b'00011100' movwf TRISA bcf STATUS, RP0 return
ВАМ НЕОБХОДИМО ПЕРЕПИСАТЬ ФУНКЦИЮ ОЖИДАНИЯ ACK Пока что имеем - выход при состоянии линий (clrf PORTA ):
SCL=L,SDA=L;
Далее вызов StopI2C:
StopI2C bcf PORTA, SCL bcf PORTA, SDA
bsf PORTA, SCL nop nop nop nop bsf PORTA, SDA return
Вроде все корректно в вызове стопа, за исключением лишних метаний по переводу линий в состояние НИЗКИЙ. Необходимо реализовать все функции так чтобы SCL всегда при выходе был в низком уровне, за исключением функции СТОП.
В общем необходимо разбраться с ACK, потом продолжим. В рекомендациях от микрочипа написано что рулить надо не только уровнями линий, но и их направлением, В пристежке файл исходников для пика, на языке С. Та м в функции i2c_SendByte, тож вроде ошибка, коментарий есть а дела нет, если используется "чистый" пик (не С73 с недоделанным И2С). /* SCL_DIR should be input here */ if(!SCL){
А SCL реально не переводиться на вход (хотя со встроенным модулем оно будет как вход).
|