Перейти к содержанию
    

I2C EEPROM

Есть такая проблема с микросхемой 24C08 После Start на микросхему могу записывать данные считывать все нормально но как только отправляю на нее Stop все микруха молчит и больше не реагирует на Start в чем проблема? :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что значит молчит?

А больше всего не понятно как вы вообще записываете не генеря СТОП!

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.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А больше всего не понятно как вы вообще записываете не генеря СТОП!

 

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

 

Формирую Stop это переход SDA из 0 в 1 при SCl=1. После чего микросхема не риагирует на START это SDA из 1 в ноль при SCL=1. Попозже могу дать код своей программы для PIC16F84 но код я написал правельно по дата щиту 24C08. (на всякий случай обьясню что я имею опыт в программирования для контроллеров просто интересно почему микросхема на реагирует на START после STOP) :smile3009:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда подождем кода.

Может acknowledge не дожидаетесь?

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

 

....

call STOP

 

acknowledge_White

call START

btfsc ERROR

goto acknowledge_White

 

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

 

 

Но на acknowledge_White он зацикливается т.к. акноун атвета в старте нет хотя перед формированием стоп ответ на старт был. (может проблема в 24С08 хотя я очень в этом сомневаюсь). :twak:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот моя программа где после Стоп микруха не откликается на Старт может кто подскажет:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда записал байт (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 имеем:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все заработало огромное спасибо я все теперь сделал по умному :)

Вот кто хочет глянуть как я это сделал смотрите.

i2c_P.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все заработало огромное спасибо я все теперь сделал по умному :)

Вот кто хочет глянуть как я это сделал смотрите.

 

Удачи, очень рад если смог вам помочь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот оптимизировал функции чтения записи буйта теперь вполне хорошая программа кому нужно качайте на здоровье проверено работает.

i2c_Prot.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...