ControllerZ 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба Есть такая проблема с микросхемой 24C08 После Start на микросхему могу записывать данные считывать все нормально но как только отправляю на нее Stop все микруха молчит и больше не реагирует на Start в чем проблема? :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Major 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба А что значит молчит? А больше всего не понятно как вы вообще записываете не генеря СТОП! 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 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба А больше всего не понятно как вы вообще записываете не генеря СТОП! Без осцилограм или более подробного описания сказать что-то внятное очень трудно. <{POST_SNAPBACK}> Формирую Stop это переход SDA из 0 в 1 при SCl=1. После чего микросхема не риагирует на START это SDA из 1 в ноль при SCL=1. Попозже могу дать код своей программы для PIC16F84 но код я написал правельно по дата щиту 24C08. (на всякий случай обьясню что я имею опыт в программирования для контроллеров просто интересно почему микросхема на реагирует на START после STOP) :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Major 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба Тогда подождем кода. Может acknowledge не дожидаетесь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба Тогда подождем кода. Может acknowledge не дожидаетесь? <{POST_SNAPBACK}> У меня в программе алгоритм такой же как в датащите для того чтобы дождаться acknowledge: .... call STOP acknowledge_White call START btfsc ERROR goto acknowledge_White ...... ; далее код программы. Но на acknowledge_White он зацикливается т.к. акноун атвета в старте нет хотя перед формированием стоп ответ на старт был. (может проблема в 24С08 хотя я очень в этом сомневаюсь). :twak: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба Вот моя программа где после Стоп микруха не откликается на Старт может кто подскажет: 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 0 9 августа, 2005 Опубликовано 9 августа, 2005 · Жалоба Когда записал байт (S) A0 (A) addr (A) data (A) (P) дай задержку хотя бы 1 мс. Тогда поcылай (S) A0 (проверяем АСК) если нет его то (P), опять задержка 1мс . Повторяем эти посылки определеное количество раз когда не получим ответ от памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Major 0 10 августа, 2005 Опубликовано 10 августа, 2005 · Жалоба 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 реально не переводиться на вход (хотя со встроенным модулем оно будет как вход). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 10 августа, 2005 Опубликовано 10 августа, 2005 · Жалоба Спасибо все попробую сегодня вечерем перепишу прогу. :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 10 августа, 2005 Опубликовано 10 августа, 2005 · Жалоба Все заработало огромное спасибо я все теперь сделал по умному :) Вот кто хочет глянуть как я это сделал смотрите. i2c_P.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Major 0 11 августа, 2005 Опубликовано 11 августа, 2005 · Жалоба Все заработало огромное спасибо я все теперь сделал по умному :) Вот кто хочет глянуть как я это сделал смотрите. <{POST_SNAPBACK}> Удачи, очень рад если смог вам помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 11 августа, 2005 Опубликовано 11 августа, 2005 · Жалоба Огромное спасибо за помощь Major и ValeraVi. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ControllerZ 0 13 августа, 2005 Опубликовано 13 августа, 2005 · Жалоба Вот оптимизировал функции чтения записи буйта теперь вполне хорошая программа кому нужно качайте на здоровье проверено работает. i2c_Prot.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться