|
|
  |
I2C EEPROM, проблема. |
|
|
|
Aug 9 2005, 09:42
|

Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 6-08-05
Пользователь №: 7 409

|
Цитата(Major @ Aug 9 2005, 14:01) А больше всего не понятно как вы вообще записываете не генеря СТОП! Без осцилограм или более подробного описания сказать что-то внятное очень трудно. Формирую Stop это переход SDA из 0 в 1 при SCl=1. После чего микросхема не риагирует на START это SDA из 1 в ноль при SCL=1. Попозже могу дать код своей программы для PIC16F84 но код я написал правельно по дата щиту 24C08. (на всякий случай обьясню что я имею опыт в программирования для контроллеров просто интересно почему микросхема на реагирует на START после STOP)
|
|
|
|
|
Aug 9 2005, 10:26
|

Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 6-08-05
Пользователь №: 7 409

|
Цитата(Major @ Aug 9 2005, 15:12) Тогда подождем кода. Может acknowledge не дожидаетесь? У меня в программе алгоритм такой же как в датащите для того чтобы дождаться acknowledge: .... call STOP acknowledge_White call START btfsc ERROR goto acknowledge_White ...... ; далее код программы. Но на acknowledge_White он зацикливается т.к. акноун атвета в старте нет хотя перед формированием стоп ответ на старт был. (может проблема в 24С08 хотя я очень в этом сомневаюсь).
|
|
|
|
|
Aug 9 2005, 17:19
|

Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 6-08-05
Пользователь №: 7 409

|
Вот моя программа где после Стоп микруха не откликается на Старт может кто подскажет: list p=16F84 #include <p16F84.inc>
SDA equ 0 SCL equ 1 Byte equ 0x0C n equ 0x0D Err equ 0x0E
ReadEEPROM equ 0xAE WriteEEPROM equ 0xAF
org 0x00
Start clrf PORTB bsf STATUS, RP0 clrw movwf TRISB bcf STATUS, RP0
call SetupI2C ; Установки для I2C шины SDA - RA0, SCL - RA1 call StartI2C ; Установка ЕЕПРОМ в режим Старт movlw WriteEEPROM ; Насроить ЕЕПРОМ для записи в нее данных movwf Byte
call SendByte call ACKTest ; Байт принят? btfsc Err, 0 ; Если не принят то обработка ошибки call OnError
clrf Byte ; Устанавливаем адрес на 0 call SendByte call ACKTest ; Байт принят? btfsc Err, 0 ; Если не принят то обработка ошибки call OnError
movlw 0xAA ; Записываем b'10101010' по заданному адресу movwf Byte call SendByte call ACKTest ; Байт принят? btfsc Err, 0 ; Если не принят то обработка ошибки call OnError
call StopI2C ; Установка ЕЕПРОМ в режим Стоп
;ПОСЛЕ ЭТОЙ ЛЕБУДЫ МИКРОСХЕМА НЕ ПРИНИМАЕТ START
movlw 0xAA movwf PORTB goto $
SetupI2C clrf PORTA bsf STATUS, RP0 movlw b'00011100' movwf TRISA bcf STATUS, RP0
bsf PORTA, SDA bsf PORTA, SCL return
StartI2C bsf PORTA, SDA bsf PORTA, SCL nop nop nop nop bcf PORTA, SDA nop nop nop nop bcf PORTA, SCL return
StopI2C bcf PORTA, SCL bcf PORTA, SDA bsf PORTA, SCL nop nop nop nop bsf PORTA, SDA return
SendByte movlw 8 movwf n SBL btfsc Byte, 7 bsf PORTA, SDA btfss Byte, 7 bcf PORTA, SDA bsf PORTA, SCL nop nop nop nop bcf PORTA, SCL rlf Byte, f decfsz n, f goto SBL bcf PORTA, SDA return
ACKTest clrf Err
clrf PORTA bsf STATUS, RP0 movlw b'00011101' 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
OnError movlw 0xFF movwf PORTB goto $ return
end
|
|
|
|
|
Aug 9 2005, 22:33
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 27-05-05
Из: Rivne, Ukraine
Пользователь №: 5 472

|
Когда записал байт (S) A0 (A) addr (A) data (A) (P) дай задержку хотя бы 1 мс. Тогда поcылай (S) A0 (проверяем АСК) если нет его то (P), опять задержка 1мс . Повторяем эти посылки определеное количество раз когда не получим ответ от памяти.
|
|
|
|
|
Aug 10 2005, 01:49
|
Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 375

|
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 реально не переводиться на вход (хотя со встроенным модулем оно будет как вход).
|
|
|
|
|
Aug 10 2005, 19:40
|

Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 6-08-05
Пользователь №: 7 409

|
Все заработало огромное спасибо я все теперь сделал по умному  Вот кто хочет глянуть как я это сделал смотрите.
Прикрепленные файлы
i2c_P.txt ( 3.41 килобайт )
Кол-во скачиваний: 78
|
|
|
|
|
Aug 11 2005, 02:02
|
Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 375

|
Цитата(ControllerZ @ Aug 11 2005, 01:40) Все заработало огромное спасибо я все теперь сделал по умному  Вот кто хочет глянуть как я это сделал смотрите. Удачи, очень рад если смог вам помочь.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|