|
Проблема с TWI |
|
|
|
Nov 4 2005, 17:14
|

Местный
  
Группа: Участник
Сообщений: 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 приемник" на вызов не реагировал?
|
|
|
|
|
 |
Ответов
(75 - 89)
|
Nov 20 2005, 15:25
|

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

|
Да есть у меня полный перевод м128 с этого сайта. Читал, конечно же читал. Допустим, ситуация такая: вместо кода $18 получаем код $20. Согласно таблицы, что нужно сделать в этом случае? В TWCR записывается новое значение? Но какое из 4-х? Там, например, говорится "Передается байт данных", да как же он может передаваться, если нет подтверждения адреса от слейва? Елки-палки, ну ткните меня носом, что нужно делать в ошибочных ситуациях!!!
|
|
|
|
|
Nov 20 2005, 16:28
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 20 2005, 17:06
|
Местный
  
Группа: Свой
Сообщений: 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 Форматы и состояния в режиме ведущего передатчика.
|
|
|
|
|
Nov 20 2005, 17:33
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 20 2005, 17:40
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225

|
пора уходить. приложил рабающий код для работы с ееprom может поможет
Прикрепленные файлы
TWI.zip ( 1.01 килобайт )
Кол-во скачиваний: 63
|
|
|
|
|
Nov 20 2005, 18:49
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 20 2005, 19:13
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 21 2005, 06:41
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225

|
Цитата(James D. @ Nov 20 2005, 21:49)  Не знаю насколько код работающий, пока не разобрался, но вот две ошибки:
ldi tempA,t5000 rcall l
Да и сложный у вас код, запутанный (как на первый взгляд), я пользуюсь такими п/п: я же писал что пп для eeprom . это зажержка 5мс между записью блоков. и потом , зачем Вы приемник делаете ведущим?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|