реклама на сайте
подробности

 
 
> Проблема с TWI
James D.
сообщение Nov 4 2005, 17:14
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Соединил 3 МК по TWI - Master передает данные на Slave 1, потом на Slave 2 (поочередно, друг за другом). Два из них общаются нормально (односторонняя передача от Master к Slave 1), а как только нужно передать от Master к Slave 2, один раз передача проходит и все зависает. Судя по всему, после этого не получается передать данные на Slave 1.
В конце каждой передачи Master осуществляет условие STOP
STOP: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp,
а Slave 1/2, после приема переданных байт, просто переходят к дальнейшему выполнению основной программы, т.е. никаких стоповых функций нет. Должны ли они как-то обрабатывать функцию STOP?

Можно ли в режиме "slave приемник" узнать какой адрес передал "master передатчик", т.е. к кому в данный момент он обращается? Появляется ли этот адрес в TWDR?

Как правильно обратиться к конкретному "slave приемнику", чтобы второй "slave приемник" на вызов не реагировал?
Go to the top of the page
 
+Quote Post
19 страниц V  « < 4 5 6 7 8 > »   
Start new topic
Ответов (75 - 89)
James D.
сообщение Nov 20 2005, 15:25
Сообщение #76


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Да есть у меня полный перевод м128 с этого сайта. Читал, конечно же читал.
Допустим, ситуация такая: вместо кода $18 получаем код $20. Согласно таблицы, что нужно сделать в этом случае? В TWCR записывается новое значение? Но какое из 4-х?
Там, например, говорится "Передается байт данных", да как же он может передаваться, если нет подтверждения адреса от слейва?
Елки-палки, ну ткните меня носом, что нужно делать в ошибочных ситуациях!!!
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 16:28
Сообщение #77


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(James D. @ Nov 20 2005, 18:25) *
Допустим, ситуация такая: вместо кода $18 получаем код $20. Согласно таблицы, что нужно сделать в этом случае? В TWCR записывается новое значение? Но какое из 4-х?
Там, например, говорится "Передается байт данных", да как же он может передаваться, если нет подтверждения адреса от слейва?

ну что тут непонятного - после передачи пакета SLA+W принято NACK . действия : выдать STOP затем по новой START/ SLA+W/ и таким образом дожидаться ACK. чтобы не зациклиться - организуй количество попыток и собственно в шите есть пример на асме http://gaw.ru/html.cgi/txt/doc/micros/avr/arh128/18_5.htm
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 16:42
Сообщение #78


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Но там вот что написано:

1. Пepeдaeтcя бaйт дaнныx, пpинимaется или нe пpинимaeтcя ПOДTBepждeниe
2. Пepeдaeтcя ПOBTOPHЫЙ CTAPT
3. Пepeдaeтcя услoвиe CTOП и cбpacывaeтcя флaг TWSTO
4. Bcлeд зa ycлoвием CTAPT пepeдaeтcя ycлoвиe CTOП и cбpacывaется флaг TWSTO

Это варианты ответных действий, или это одна процедура, которую надо выполнить?
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:06
Сообщение #79


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(James D. @ Nov 20 2005, 19:42) *
Но там вот что написано:

1. Пepeдaeтcя бaйт дaнныx, пpинимaется или нe пpинимaeтcя ПOДTBepждeниe
2. Пepeдaeтcя ПOBTOPHЫЙ CTAPT
3. Пepeдaeтcя услoвиe CTOП и cбpacывaeтcя флaг TWSTO
4. Bcлeд зa ycлoвием CTAPT пepeдaeтcя ycлoвиe CTOП и cбpacывaется флaг TWSTO

Это варианты ответных действий, или это одна процедура, которую надо выполнить?


в таблице даны возможные варианты действий имхо первый пункт нуна выбросить тк он абсурден ну а далее исходя из алгоритма проги выбирается СТОП , ПОВСТАРТ, СТОП - СТАРТ , более доходчиво на рисунке 97 Форматы и состояния в режиме ведущего передатчика.
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 17:15
Сообщение #80


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



SLA_W: ldi temp,$04 ;Загрузка адреса слэйв м16 + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait: in temp,TWCR ;Ожидаем ответа от слэйв м16
sbrs temp,TWINT
rjmp wait

У меня зацикливается в цикле ожидания "wait", шины SDA, SCL в состоянии "0".
Как тут быть?
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:25
Сообщение #81


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



а где старт и опрос состояния после оного?
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 17:33
Сообщение #82


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Не, ну я кусок привел - где ошибка. А полностью вот:

To_m16: ldi temp,$03 ;Установка скорости передачи= ? kHz (поставил самую низкую, кварц на 4 MHz)
out TWSR,temp
ldi temp,$FF
out TWBR,temp

Pusk_Sq:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp ;Посылка сигнала "START"

wait1q: in temp,TWCR ;Ожидаем ответа от слэйв м16
sbrs temp,TWINT
rjmp wait1q

in temp,TWSR
andi temp,$F8
cpi temp,$08 ;Проверка подтверждения приема от слэйв м16
brne Pusk_Sq

SLA_Wq: ldi temp,$04 ;Загрузка адреса слэйв м16 + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp

wait2q: in temp,TWCR ;Ожидаем ответа от слэйв м16
sbrs temp,TWINT
rjmp wait2q


in temp,TWSR
andi temp,$F8
cpi temp,$18
brne SLA_Wq ;Переход, если ответ от слэйв м16 неверный

Далее идет прием данных. По идее...

Сообщение отредактировал James D. - Nov 20 2005, 17:37
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 20 2005, 17:40
Сообщение #83


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



пора уходить. приложил рабающий код для работы с ееprom может поможет
Прикрепленные файлы
Прикрепленный файл  TWI.zip ( 1.01 килобайт ) Кол-во скачиваний: 63
 
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 18:49
Сообщение #84


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Не знаю насколько код работающий, пока не разобрался, но вот две ошибки:

ldi tempA,t5000
rcall l

Да и сложный у вас код, запутанный (как на первый взгляд), я пользуюсь такими п/п:
;************************************
;Подпрограмма чтения байта из EEPROM:

EEPROM_read:
sbic EECR,EEWE
rjmp EEPROM_read
out EEARH,temp1
out EEARL,temp2
sbi EECR,EERE
in data,EEDR
ret
;************************************

;************************************
;Подпрограмма записи байта в EEPROM:

EEPROM_write:
sbic EECR,EEWE
rjmp EEPROM_write
out EEARH,temp1
out EEARL,temp2
out EEDR,data
sbi EECR,EEMWE
sbi EECR,EEWE
ret

;*************************************

Сообщение отредактировал James D. - Nov 20 2005, 18:56
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 19:13
Сообщение #85


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Кстати, приемник - слэйв м16 зацикливается здесь (выделено цветом):

ldi temp,$04 ;Инициализация режима "Приемник"
out TWAR,temp

TWINT_0:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp

wait1: in temp,TWCR ;Ожидаем вызова от мастера м32
sbrs temp,TWINT
rjmp wait1


in temp,TWSR
andi temp,$F8
cpi temp,$60 ;Проверка принятого адреса от м32
brne TWINT_0

Сообщение отредактировал James D. - Nov 20 2005, 19:15
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 20 2005, 19:49
Сообщение #86


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Если линии SDA и SCL в "0" состоянии, значит бит TWINT установлен. Судя по даташиту. А моя программа говорит, что он в "0" состоянии, при "0" на линиях SDA и SCL... Что за дела? Ничего не понимаю!
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 06:41
Сообщение #87


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(James D. @ Nov 20 2005, 21:49) *
Не знаю насколько код работающий, пока не разобрался, но вот две ошибки:

ldi tempA,t5000
rcall l

Да и сложный у вас код, запутанный (как на первый взгляд), я пользуюсь такими п/п:

я же писал что пп для eeprom . это зажержка 5мс между записью блоков.
и потом , зачем Вы приемник делаете ведущим?
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 10:31
Сообщение #88


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Почему ведущим? Приемник у меня подчиненный.
Бит TWINT не надо сбрасывать? Написать так:

ldi temp,(1<<TWEA)|(1<<TWEN)
out TWCR,temp
Go to the top of the page
 
+Quote Post
m16
сообщение Nov 21 2005, 11:06
Сообщение #89


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



именно
(1<<TWEA)|(1<<TWEN) - ведомый приемник
(1<<TWINT)|(1<<TWEA)|(1<<TWEN) - ведущий приемник
Go to the top of the page
 
+Quote Post
James D.
сообщение Nov 21 2005, 11:24
Сообщение #90


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Понял, вечерком попробую с такой комбинацией.

Посмотрел даташит - "ведущий приемник" - там бит TWEA вообще не участвует.

START - (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
SLA+R - (1<<TWINT)|(1<<TWEN)
DATA - (1<<TWINT)|(1<<TWEN)

Вот дальше я не понял. Читаем:
"Данная последовательность повторяется до приема последнего байта. После этого ведущий приемник информирует подчиненный передатчик отправкой НЕТ ПОДТВерждения после приема последнего принятого байта данных."
Как мастер-приемник должен отправлять "НЕТ ПОДТВерждения после приема последнего принятого байта данных"?

Последняя команда:

STOP - (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
Go to the top of the page
 
+Quote Post

19 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016