Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2C EEPROM
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
ControllerZ
Есть такая проблема с микросхемой 24C08 После Start на микросхему могу записывать данные считывать все нормально но как только отправляю на нее Stop все микруха молчит и больше не реагирует на Start в чем проблема? smile3046.gif
Major
А что значит молчит?
А больше всего не понятно как вы вообще записываете не генеря СТОП!
The IS24CXX
acknowledges once more and the Master generates the
STOP condition, at which time the device begins its
internal programming cycle. While this internal cycle is in
progress, the device will not respond to any request from
the Master device.

Без осцилограм или более подробного описания сказать что-то внятное очень трудно.
ControllerZ
Цитата(Major @ Aug 9 2005, 14:01)
А больше всего не понятно как вы вообще записываете не генеря СТОП!

Без осцилограм или более подробного описания сказать что-то внятное очень трудно.
*


Формирую Stop это переход SDA из 0 в 1 при SCl=1. После чего микросхема не риагирует на START это SDA из 1 в ноль при SCL=1. Попозже могу дать код своей программы для PIC16F84 но код я написал правельно по дата щиту 24C08. (на всякий случай обьясню что я имею опыт в программирования для контроллеров просто интересно почему микросхема на реагирует на START после STOP) smile3009.gif
Major
Тогда подождем кода.
Может acknowledge не дожидаетесь?
ControllerZ
Цитата(Major @ Aug 9 2005, 15:12)
Тогда подождем кода.
Может acknowledge не дожидаетесь?
*

У меня в программе алгоритм такой же как в датащите для того чтобы дождаться acknowledge:

....
call STOP

acknowledge_White
call START
btfsc ERROR
goto acknowledge_White

...... ; далее код программы.


Но на acknowledge_White он зацикливается т.к. акноун атвета в старте нет хотя перед формированием стоп ответ на старт был. (может проблема в 24С08 хотя я очень в этом сомневаюсь). twak.gif
ControllerZ
Вот моя программа где после Стоп микруха не откликается на Старт может кто подскажет:
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
designer
Когда записал байт (S) A0 (A) addr (A) data (A) (P) дай задержку хотя бы 1 мс. Тогда поcылай (S) A0 (проверяем АСК) если нет его то (P), опять задержка 1мс .
Повторяем эти посылки определеное количество раз когда не получим ответ от памяти.
Major
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 реально не переводиться на вход (хотя со встроенным модулем оно будет как вход).
ControllerZ
Спасибо все попробую сегодня вечерем перепишу прогу. smile3009.gif
ControllerZ
Все заработало огромное спасибо я все теперь сделал по умному smile.gif
Вот кто хочет глянуть как я это сделал смотрите.
Major
Цитата(ControllerZ @ Aug 11 2005, 01:40)
Все заработало огромное спасибо я все теперь сделал по умному smile.gif
Вот кто хочет глянуть как я это сделал смотрите.
*


Удачи, очень рад если смог вам помочь.
ControllerZ
Огромное спасибо за помощь Major и ValeraVi. smile.gif
ControllerZ
Вот оптимизировал функции чтения записи буйта теперь вполне хорошая программа кому нужно качайте на здоровье проверено работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.