Полная версия этой страницы:
I2C EEPROM
ControllerZ
Aug 9 2005, 05:35
Есть такая проблема с микросхемой 24C08 После Start на микросхему могу записывать данные считывать все нормально но как только отправляю на нее Stop все микруха молчит и больше не реагирует на Start в чем проблема?
А что значит молчит?
А больше всего не понятно как вы вообще записываете не генеря СТОП!
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
Aug 9 2005, 09:42
Цитата(Major @ Aug 9 2005, 14:01)
А больше всего не понятно как вы вообще записываете не генеря СТОП!
Без осцилограм или более подробного описания сказать что-то внятное очень трудно.
Формирую Stop это переход SDA из 0 в 1 при SCl=1. После чего микросхема не риагирует на START это SDA из 1 в ноль при SCL=1. Попозже могу дать код своей программы для PIC16F84 но код я написал правельно по дата щиту 24C08. (на всякий случай обьясню что я имею опыт в программирования для контроллеров просто интересно почему микросхема на реагирует на START после STOP)
Тогда подождем кода.
Может acknowledge не дожидаетесь?
ControllerZ
Aug 9 2005, 10:26
Цитата(Major @ Aug 9 2005, 15:12)
Тогда подождем кода.
Может acknowledge не дожидаетесь?
У меня в программе алгоритм такой же как в датащите для того чтобы дождаться acknowledge:
....
call STOP
acknowledge_White
call START
btfsc ERROR
goto acknowledge_White
...... ; далее код программы.
Но на acknowledge_White он зацикливается т.к. акноун атвета в старте нет хотя перед формированием стоп ответ на старт был. (может проблема в 24С08 хотя я очень в этом сомневаюсь).
ControllerZ
Aug 9 2005, 17:19
Вот моя программа где после Стоп микруха не откликается на Старт может кто подскажет:
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
Aug 9 2005, 22:33
Когда записал байт (S) A0 (A) addr (A) data (A) (P) дай задержку хотя бы 1 мс. Тогда поcылай (S) A0 (проверяем АСК) если нет его то (P), опять задержка 1мс .
Повторяем эти посылки определеное количество раз когда не получим ответ от памяти.
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
Aug 10 2005, 10:44
Спасибо все попробую сегодня вечерем перепишу прогу.
ControllerZ
Aug 10 2005, 19:40
Все заработало огромное спасибо я все теперь сделал по умному

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

Вот кто хочет глянуть как я это сделал смотрите.
Удачи, очень рад если смог вам помочь.
ControllerZ
Aug 11 2005, 05:33
Огромное спасибо за помощь Major и ValeraVi.
ControllerZ
Aug 13 2005, 08:12
Вот оптимизировал функции чтения записи буйта теперь вполне хорошая программа кому нужно качайте на здоровье проверено работает.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.