Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/108: Рейтинг темы: голосов - 108, средняя оценка - 4.68
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
1

Не проходит инициализация TWI

12.02.2010, 14:00. Просмотров 19554. Ответов 30
Метки нет (Все метки)

Добрый день!
Мучаюсь с 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

Что делать дальше? Ничего не пойму!!!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2010, 14:00
Ответы с готовыми решениями:

TWI
Всем привет) Подскажите, пожалуйста, ошибку. Сразу скажу, сам искал, читал, ни чего не нашел,...

SPI v.s. TWI
Задумался об организации совместной работы 2-х платок на атмегах-сестрах (48 и 168). Рассматривал...

Модуль TWI
Привет всем. Копаюсь с TWI в ATmega8, с этим модулем опыта у меня нет, поэтому закопался в начале....

Atmega8 & TWI/I2C
День добрый. Уже пару часов ковыряюсь, не могу разобраться, почему не заводится TWI? Линии...

TWI не хочет работать
ATmego328p, код следующий. После старта он по идее должен выключить лампочку. #define F_CPU...

30
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
12.02.2010, 14:21 2
А проверяется на чем? В железе, в студии, в эмуляторе?
у I2C скорость передачи намного ниже чем у SPI. Обычно IIC работает либо на скорости 10кбит/с — в медленном режиме, либо на 100кбит/с в быстром. Но в реальности можно плавно менять скорость вплоть до нуля.
В студии можно недождаться выхода из этого цикла, если не поставить (после вхождения в цикл) галочку на соответствующем пине.

Начало передачи определяется Start последовательностью — провал SDA при высоком уровне SCL
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 14:34 3
Проверял в железе, на отладочной плате.
Поставил контрольки,
включение LED1 до вызова подпрограммы START.
и LED2 - после выполнения.
LED1 загорается, LED2-нет.
Пробовал в JTAG - тоже самое!!!
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 14:36 4
А шина к плюсу притянута?
0
12.02.2010, 14:36
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 14:41 5
Цитата Сообщение от ArkusB
А шина к плюсу притянута?
Да, 2 резистора по 10к.
Отладочная плата FastAVR v. 1.04
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 14:54 6
Спасибо!!!
Инициализацию прошел!!!!
Дело было в след. я не поставил 2 джампера на вухрядные штырьки идущие вдол процессора.
Т.е. шина была отключена от периферии и конечно от подягивающих резюков! Вот я балбес! Уже не первый раз наступаю на эти грабли!
Сейчас займусь адресацией и записью-чтением!
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 15:11 7
Такс... едем дальше! -)))

Код
RTC_WRITE:   RCALL   IIC_START   ; Старт
LDI   temp,0x01         ; Загрузили Адрес приемника на запись
RCALL   IIC_BYTE      ; Отослали адрес приемника на запись
rcall tid2on                         ; ЭТОТ ГОРИТ
LDI   temp, 0x60         ; Загрузили адрес ячейки памяти
RCALL   IIC_BYTE      ; Отослали адрес ячейки
rcall tid3on                         ; ЭТОТ НЕ ГОРИТ
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
;-----------------------------------------------------------------------------
Извините если достал глупыми вопросами!
Но может и кроме меня это куму нибудь пригодится???
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 17:43 8
Цитата Сообщение от Vtod777
Да, 2 резистора по 10к.
10k - много. Лучше что-нибудь в интервале от килоома до 4.7к. И, желательно анализировать коды состояния IIC, которые оно возвращает. А то случится арбитраж, а софт и не заметит...
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 17:57 9
Прошел:
-запись адреса устройства
-запись адреса ячейки памяти
-запись данных в ячейку

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

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

а почему раньше был затык - в описании отладочной платы FAST AVR говорится - "адрес кристалла - 0x01"
Я так и ставил, потом "от фанаря" поставил 0x02 и продвинулся вперед.
Там у микросхемы памяти 24c64 адрем устройства определяют A0,A1,A2, у меня А0 сидит на +5в. остальные на земле. Вроде как 1-ца, но в регистре "divice address" А0 не в 0-м бите а в 1-м.
0-й бит занимает R/W.
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 18:10 10
Отож я и говорю - анализировать коды состояний надо. В какой режим после SLA R/W перешло? Мастер трансмиттер или мастер ресивер? Память акает? Или накает?
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 18:13 11
Я как бы понимаю АСК и НАК, в смысле - слова такие слышал! -))))
Вот записал осциллограммы, только не получается сюда прикрепить!
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 18:27 12
Изначально шина +5в.
После START - в 0в.
При передачи данных идут импульсы положительной полярности.
После STOP опять в 5в.
И висим......
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 18:40 13
Посмотрите пож. записи осциллограмм.
По другому у меня добавить не получилось.
Там название фото соотв. смыслу.

Канал 1 - PC1
Канал 2 - PC0
[img]
http://foto.mail.ru/mail/vtod1234567/1/2.html
[/img]
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 18:48 14
А зачем осциллограмы? Читаем даташит: When the TWINT Flag is ossirted, the TWI has fymished an operation omd awoyts 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 omd TWDR Registers.

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

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

Кстати, по картинке, стоп отработал. У меги16 после стопа ничего проверять не надо. Отправил стоп, и успокоился...
И адрес на самом деле - не 2, а один. Просто нулевой бит - RW. Почитай описание, как собирают SLA/W...
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 19:17 15
Ну туплю...... Уже голова пухнет!-)))
У Евстифеева почитал про байт адреса - не совсем понятно, а где еще почитать как собирают SLA/W?????

П.С. я-то код у Di-Halta "скопипастил", а он вроде под МЕГУ8 писал.
Опять таки, откуда можно узнать ждать после STOP для конкретного проц. или нет?
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 19:26 16
Так это, батенька! АРТЭЭФЭМ надо сделать. RTFM, в смысле прочесть это дурацкое руководство. Даташит от проца. Там обычно бывает написано.
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 19:38 17
Угу... пошел читать! -)))
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 21:57 18
Начитался!!!! -)))
Выяснил адрес микросхемы памяти - 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 tid2on
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 и освободили линию.

;----------------------------------------------------------------------------------
И что же опять не так?????
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
12.02.2010, 22:13 19
Ой, а даташит на память кто читать будет???? Пушкин, Санька Серёжкович?

Сейчас точно не вспомню, кажется всегда запись в IIC EEPROM выглядела так:
старт-sla/w-адрес-старт-sla/w-данные-данные-данные...стоп. Потом поллинг, пока там внутри синхронизация происходит, делать ничего нельзя.
0
Vtod777
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 107
12.02.2010, 22:24 20
Цитата Сообщение от ArkusB
Сейчас точно не вспомню, кажется всегда запись в IIC EEPROM выглядела так:
старт-sla/w-адрес-старт-sla/w-данные-данные-данные...стоп.
Читал, насмотрелся примеров...
В одних вааще нет рестартов
А у DI-Halta рестарт при чтении идет, а запись за 1 проход....
0
12.02.2010, 22:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2010, 22:24

Stop состояние TWI
Ребята, а можно ли как-то без введения флага определить что произошло стоп-состояние шины TWI?...

CodeVisionAVR функции TWI
Здравствуйте! Есть у кого нибудь, или, если знаете, где взять подскажите ссылку на описание функций...

Не проходит инициализация
Приветствую! Изучаю урок https://youtu.be/CpIoHPUyu8s по написанию игры, и тут столкнулся с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru