Easyelectronics.ru

Электроника для всех
Текущее время: 08 мар 2021, 08:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 14:47 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Добрый день!
Мучаюсь с TWI
Хочу в учебных целях подключить внешнюю память типа 24C64a

Взял текст программы из уроков DI-Halta.

Процессор МЕГА32
частота - вн. кварц - 8Мгц
Код:
         ldi  temp,0x1c             
         out  TWBR,temp

Потом переходим на START
Код:
IIC_START:   OUTI   TWCR,1<<TWINT|1<<TWSTA|1<<TWEN|0<<TWIE

IIC_S:      IN   temp,TWCR
         ANDI   temp,1<<TWINT         
         BREQ   IIC_S      ; Ждем пока передатчик IIC выполнит старт
         RET


В результате все вертится между BREQ и IIC_S

Что делать дальше? Ничего не пойму!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:08 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6844
Откуда: Из тех... Из бывших...
А проверяется на чем? В железе, в студии, в эмуляторе?
Цитата:
у I2C скорость передачи намного ниже чем у SPI. Обычно IIC работает либо на скорости 10кбит/с — в медленном режиме, либо на 100кбит/с в быстром. Но в реальности можно плавно менять скорость вплоть до нуля.


В студии можно недождаться выхода из этого цикла, если не поставить (после вхождения в цикл) галочку на соответствующем пине.

Цитата:
Начало передачи определяется Start последовательностью — провал SDA при высоком уровне SCL


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:21 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Проверял в железе, на отладочной плате.
Поставил контрольки,
включение LED1 до вызова подпрограммы START.
и LED2 - после выполнения.
LED1 загорается, LED2-нет.
Пробовал в JTAG - тоже самое!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:23 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
А шина к плюсу притянута?

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:28 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
ArgusB писал(а):
А шина к плюсу притянута?

Да, 2 резистора по 10к.
Отладочная плата FastAVR v. 1.04


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:41 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Спасибо!!!
Инициализацию прошел!!!!
Дело было в след. я не поставил 2 джампера на вухрядные штырьки идущие вдол процессора.
Т.е. шина была отключена от периферии и конечно от подягивающих резюков! Вот я балбес! Уже не первый раз наступаю на эти грабли!
Сейчас займусь адресацией и записью-чтением!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 15:58 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Такс... едем дальше! -)))

Код:
RTC_WRITE:   RCALL   IIC_START   ; Старт
      LDI   temp,0x01         ; Загрузили Адрес приемника на запись
      RCALL   IIC_BYTE      ; Отослали адрес приемника на запись
      rcall led2on                         ; ЭТОТ ГОРИТ
      LDI   temp, 0x60         ; Загрузили адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали адрес ячейки
      rcall led3on                         ; ЭТОТ НЕ ГОРИТ
      LDi   temp,0xaa         ; Загрузили данные
      RCALL   IIC_Byte      ; Отослали данные

IIC_WErr:   RCALL   IIC_STOP   ; Стоп
      RET                  ; Выход из задачи



Это подпрограммы обработки:

Код:
;------------------------------------------------------------------------------
IIC_START:   OUTI   TWCR,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(0<<TWIE)
IIC_S:      IN      temp,TWCR
         ANDI   temp,1<<TWINT         
         BREQ   IIC_S      ; Ждем пока передатчик IIC выполнит старт
         RET
;-----------------------------------------------------------------------------
;Посылаем байт по IIC
IIC_BYTE:     OUT      TWDR,temp
         OUTI   TWCR,(1<<TWINT)|(1<<TWEN)|(0<<TWIE)
IIC_B:      IN      temp,TWCR
         ANDI   temp,1<<TWINT   ; Ждем пока передатчик пошлет байт         
         BREQ   IIC_B
         RET
;-----------------------------------------------------------------------------
; Принять байт.
IIC_RCV:   OUTI   TWCR,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)|(0<<TWIE)
IIC_R:      IN      temp,TWCR
         ANDI   temp,1<<TWINT         
         BREQ   IIC_R      ; Ждем пока байт будет принят
         RET
;-----------------------------------------------------------------------------


Извините если достал глупыми вопросами!
Но может и кроме меня это куму нибудь пригодится???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 18:30 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
Vlad777 писал(а):
Да, 2 резистора по 10к.
10k - много. Лучше что-нибудь в интервале от килоома до 4.7к. И, желательно анализировать коды состояния IIC, которые оно возвращает. А то случится арбитраж, а софт и не заметит...

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 18:44 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Прошел:
-запись адреса устройства
-запись адреса ячейки памяти
-запись данных в ячейку

- теперь не проходит цикл STOP
в регистре TWCR установлены биты
TWWC и TWEN

и крутится в цикле....

а почему раньше был затык - в описании отладочной платы FAST AVR говорится - "адрес кристалла - 0x01"
Я так и ставил, потом "от фанаря" поставил 0x02 и продвинулся вперед.
Там у микросхемы памяти 24c64 адрем устройства определяют A0,A1,A2, у меня А0 сидит на +5в. остальные на земле. Вроде как 1-ца, но в регистре "device address" А0 не в 0-м бите а в 1-м.
0-й бит занимает R/W.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 18:57 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
Отож я и говорю - анализировать коды состояний надо. В какой режим после SLA R/W перешло? Мастер трансмиттер или мастер ресивер? Память акает? Или накает?

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 19:00 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Я как бы понимаю АСК и НАК, в смысле - слова такие слышал! -))))
Вот записал осциллограммы, только не получается сюда прикрепить!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 19:14 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Изначально шина +5в.
После START - в 0в.
При передачи данных идут импульсы положительной полярности.
После STOP опять в 5в.
И висим......


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 19:27 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Посмотрите пож. записи осциллограмм.
По другому у меня добавить не получилось.
Там название фото соотв. смыслу.

Канал 1 - PC1
Канал 2 - PC0
[img]
http://foto.mail.ru/mail/vlad1234567/1/2.html
[/img]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 19:35 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
А зачем осциллограмы? Читаем даташит: When the TWINT Flag is asserted, the TWI has finished an operation and awaits application
response. In this case, the TWI Status Register (TWSR) contains a value indicating the current
state of the TWI bus. The application software can then decide how the TWI should behave in
the next TWI bus cycle by manipulating the TWCR and TWDR Registers.

Это, правда от 16 меги, но существенной разницы быть не должно. Перевожу: (перевод вольный) Когда TWI завершил текущее действие и ожидает реакции программы, установится флаг TWINT. При этом Регистр состояния TWI (TWSR) содержит число, отображающее текущее состояние шины TWI. Анализируя его, программа должна выбрать действие для следующего цикла шины.

И там далее расписаны все возможные коды завершения для каждой из операций в каждом из состояний IIC. По ним можно определить, как прошло то или иное действие. Восприняла микросхема адрес, или послала на.

Кстати, по картинке, стоп отработал. У меги16 после стопа ничего проверять не надо. Отправил стоп, и успокоился...
И адрес на самом деле - не 2, а один. Просто нулевой бит - RW. Почитай описание, как собирают SLA/W...

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 20:04 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Ну туплю...... Уже голова пухнет!-)))
У Евстифеева почитал про байт адреса - не совсем понятно, а где еще почитать как собирают SLA/W?????

П.С. я-то код у Di-Halta "скопипастил", а он вроде под МЕГУ8 писал.
Опять таки, откуда можно узнать ждать после STOP для конкретного проц. или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 20:13 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
Так это, батенька! АРТЭЭФЭМ надо сделать. RTFM, в смысле прочесть это дурацкое руководство. Даташит от проца. Там обычно бывает написано.

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 20:25 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Угу... пошел читать! -)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 22:44 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Начитался!!!! -)))
Выяснил адрес микросхемы памяти - 1 0 1 0 А2 А1 А0 R/W
выставил,
процедуры чтения-записи прошли,
я писал 2 байта, в первый 0x10 во второй 0x11
После чтения и в первом и во втором FF.
вот текст гл. проги, а подпрограммы описаны ранее

Код:
;--------------------------- Чтение-запись EEPROM по прот. I2C -------------
RTC_WRITE:   RCALL   IIC_START   ; Старт
      LDI   temp,0b10100010      ; Загрузили Адрес приемника 0x01 и 0 на запись
      RCALL   IIC_BYTE      ; Отослали адрес приемника на запись
      LDI   temp, 0x00         ; Загрузили адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали адрес ячейки
      rcall led2on
      LDi   temp,0x10         ; Загрузили байт 1
      RCALL   IIC_Byte      ; Отослали байт 1
      LDi   temp,0x11         ; Загрузили байт 2
      RCALL   IIC_Byte      ; Отослали байт 2
IIC_WErr:   RCALL   IIC_STOP   ; Стоп

RTC_READ:   RCALL   IIC_START   ; Отослали старт
      LDI   temp,0b10100011      ; Отослали адрес приемника 0x01 и 0 на запись
      RCALL   IIC_BYTE
      LDI   temp,0x00         ; Отослали адрес ячейки откуда будем читать
      RCALL   IIC_BYTE
      RCALL   IIC_RCV         ; Считали  байт 1
      IN   temp1,TWDR         ; Забрали из регистра TWIDR
      RCALL   IIC_RCV2      ; Считали  ПОСЛЕДНИЙ байт 2
      IN   temp2,TWDR         ; Забрали из регистра TWIDR
IIC_RErr:   RCALL   IIC_STOP   ; Дали STOP и освободили линию.

;----------------------------------------------------------------------------------


И что же опять не так?????


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 23:00 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
Ой, а даташит на память кто читать будет???? Пушкин, Санька Серёжкович?

Сейчас точно не вспомню, кажется всегда запись в IIC EEPROM выглядела так:
старт-sla/w-адрес-старт-sla/w-данные-данные-данные...стоп. Потом поллинг, пока там внутри синхронизация происходит, делать ничего нельзя.

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 23:11 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
ArgusB писал(а):
Сейчас точно не вспомню, кажется всегда запись в IIC EEPROM выглядела так:
старт-sla/w-адрес-старт-sla/w-данные-данные-данные...стоп.

Читал, насмотрелся примеров...
В одних вааще нет рестартов
А у DI-Halta рестарт при чтении идет, а запись за 1 проход....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 23:12 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Сейчас выдрал микросхему памяти,
запись все равно проскакивает, а вот на чтении зацикливается...
Попробую параллельным программатором ее зашить и поглядеть что читается...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 13 фев 2010, 23:21 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
И читаться тоже не должно. Чтение как-то так выполняется
старт-sla/w-адрес-старт-sla/R-читаем-читаем-читаем... нак-читаем-стоп

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 14 фев 2010, 01:13 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Поборол, но не до конца!
Вот така конструкция РАБОТАЕТ!!!
Но только под Джитагом в пошаговом режиме.
В реале... то совсем не пишет и не читает, то пишет, но не читает!!!
Где-то надо задержки ставить!!!!


Код:
RTC_WRITE:   RCALL   IIC_START   ; Старт
      LDI   temp,0b10100010      ; Загрузили Адрес приемника 0x01 и 0 на запись
      RCALL   IIC_BYTE      ; Отослали адрес приемника на запись
      LDI   temp, 0x00         ; Загрузили старший адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали
      LDI   temp, 0x00         ; Загрузили младший адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали
      LDi   temp,0x55         ; Загрузили байт 1
      RCALL   IIC_Byte      ; Отослали байт 1
      LDi   temp,0x77         ; Загрузили байт 2
      RCALL   IIC_Byte      ; Отослали байт 2
IIC_WErr:   RCALL   IIC_STOP           ; Стоп
      nop         
RTC_READ:   RCALL   IIC_START           ; Отослали старт
      LDI   temp,0b10100010      ; Адрес приемника 0x01 и 0 на запись
      RCALL   IIC_BYTE      ; Отослали
      LDI   temp, 0x00         ; Загрузили старший адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали
      LDI   temp, 0x00         ; Загрузили младший адрес ячейки памяти
      RCALL   IIC_BYTE      ; Отослали
      RCALL   IIC_START      ; Повторный старт
      LDI   temp,0b10100011      ; Адрес  приемника, но уже на чтение
      RCALL   IIC_BYTE      ; Отослали
      RCALL   IIC_RCV      ; Считали  байт 1
      IN   tmp1,TWDR         ; Забрали из регистра TWIDR
      RCALL   IIC_RCV2      ; Считали  ПОСЛЕДНИЙ байт 2
      IN   tmp2,TWDR         ; Забрали из регистра TWIDR
IIC_RErr:   RCALL   IIC_STOP           ; Дали STOP и освободили линию.



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 14 фев 2010, 01:37 
Заглядывает иногда

Зарегистрирован: 28 янв 2010, 21:20
Сообщения: 117
Откуда: Днепропетровск
Все, окончательно определился!
Читает слету, прямо в железе, а вот пишет - только если блока записи поставить Брейк, а потом нажать F5.
Причем процедура Delay, сделанная на 3-х регистрах и вычитании, если я ее вставляю между блоком записи и чтения, даже на 1с. - не помогает.
Вот здесь уже без Гуру не обойтись!
Заранее спасибо!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не проходит инициализация TWI
СообщениеДобавлено: 14 фев 2010, 01:43 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5603
Откуда: Уругвайская АССР
Vlad777 писал(а):
Все, окончательно определился!
Читает слету, прямо в железе, а вот пишет - только если блока записи поставить Брейк, а потом нажать F5.
Причем процедура Delay, сделанная на 3-х регистрах и вычитании, если я ее вставляю между блоком записи и чтения, даже на 1с. - не помогает.
ArgusB писал(а):
Ой, а даташит на память кто читать будет????
{}данные-данные-данные...стоп. Потом поллинг, пока там внутри синхронизация происходит, делать ничего нельзя.


Вот здесь уже без Гуру не обойтись!
Заранее спасибо!!!


Дзэнский гуру вам всем на нужен. Чтобы демонстрировал хлопок одной ладонью, и почаще, на.
А если серьёзно, то надо научиться читать.
Читать всё, что написано, а не избирательно, то что понятно.

Даташит тебе нужен а не Гуру.

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB