|
|
  |
Проблема с TWI |
|
|
|
Nov 8 2005, 20:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
ОК, значит щелкнул таймер, обмен с м32 прошел, начал писать в м16 и заткнулся. Так? Если да, то проверить правильно ли отработал стоп в первом обмене и старт во-втором. Поставить приличную паузу между стопом и стартом. Заремить запись в м16 и тупо прочитать 1 байт.
Мне почему-то кажеться, что что-то не так со второй транзакцией.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 9 2005, 07:08
|

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

|
Для чистоты эксперимента сделал следующее. Общение всех МК происходит в самом начале работы программ, т.е. после RESET идет настройка стека и портов, и сразу же вкл. работа блоков TWI. 1. Мастер m32 вызывает п/п передачи на слэйв m32 (адрес $02), потом на слэйв m16 (адрес $04) и останавливается - задан бесконечный цикл. 2. Слэйв m32 (RESET, настройка стека и портов) вызывает п/п приема данных, принимает несколько байт данных от мастера, индицирует завершение своей работы (светодиод), и останавливается - задан бесконечный цикл. Этот пункт полностью работает. 3. Слэйв m16 (RESET, настройка стека и портов), во время обмена двух m32 постоянно ждет, когда к нему обратится мастер (см. ниже цикл ожидания wait11). После того, как мастер завершил передачу на слэйв m32, он индицирует завершение своей работы со слэйв m32 (светодиод), потом вызывает п/п передачи на слэйв m16, посылает START, принимает подтверждение (код $08), загружает адрес слэйв m16 + Write, и после этого ждет когда бит TWINT установится в "1". И все. Бит TWINT не устанавливается.
Слэйв m16, пример кода:
From_A1:ldi temp,$04 ;Инициализация режима "Приемник" out TWAR,temp TWINT_1:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
cbi PORTD,0
wait11: in temp,TWCR ;Ожидаем вызова от мастера m32 sbrs temp,TWINT rjmp wait11
cbi PORTD,1
Здесь светодиод PORTD,0 - горит, а PORTD,1 - нет. Бит TWINT не устанавливается.
|
|
|
|
|
Nov 9 2005, 09:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
ОК, первая посылка мастера SLAW? Тогда проверяем какой код вернул мастер 08, 10,18,20,30,38 т.е. что ушло с мастера.
добавлено: Еще раз пересмотрел условия, сначала опрашиваеться м32, так вот это отключить и сразу писать в м16
Сообщение отредактировал beer_warrior - Nov 9 2005, 09:46
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 9 2005, 11:30
|

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

|
Слэйв м32 отключил, пишу сразу в м16. Кусок кода в мастер м32:
ldi temp,$00 ;Установка скорости передачи= ? kHz out TWSR,temp ldi temp,$14 out TWBR,temp
Pusk_S1:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp ;Посылка сигнала "START"
wait11r:in temp,TWCR ;Ожидаем ответа от слэйв м16 sbrs temp,TWINT rjmp wait11r
in temp,TWSR andi temp,$F8 cpi temp,$08 ;Проверка подтверждения приема от слэйв м16 (START) brne Pusk_S1
SLA_W1: ldi temp,$04 ;Загрузка адреса слэйв м16 + "WRITE" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEN) out TWCR,temp
wait22r:in temp,TWCR ;Ожидаем ответа от слэйв м16 sbrs temp,TWINT rjmp wait22r
in temp,TWSR andi temp,$F8 cpi temp, (здесь идет проверка кода)
Мастер вернул код $20 - SLA+W был передан, NOT ACK был принят. Почему так?
|
|
|
|
|
Nov 9 2005, 12:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Ну во-первых, адрес надо сдвигать на 1 бит и накладывать маску 0 или 1 в 0 разряде. 100% не уверен, однако м16 словила старт и теперь тупо ждет опознания адреса. TWINT выставляеться по совпадению адреса, а адрес не совпал. Если бы работало на прерывании, м16 в него бы просто не заехал, и жил бы себе дальше.
addr = (addr << 1) | 0x01; для чтеия addr = (addr << 1) & 0xfe; для записи
обязательно.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|