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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> вопрос по работе TWI
DS
сообщение Feb 28 2009, 19:02
Сообщение #31


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(singlskv @ Feb 28 2009, 21:08) *
Покажите обработчик прерываний на меге.
И инфу о том кто мастер, какая скорость какие пулапы итд...


Вот так повисает. Мастер - mega128.
С прерыванием и прочим все нормально - проблема именно в становлении раком модуля в 48.

На первой - нормальный цикл. На последней картинке - попытка recovery.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 28 2009, 19:59
Сообщение #32


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(DS @ Feb 28 2009, 22:02) *
Вот так повисает. Мастер - mega128.
С прерыванием и прочим все нормально - проблема именно в становлении раком модуля в 48.

На первой - нормальный цикл. На последней картинке - попытка recovery.

Картинки странные конечно,
но если бы слейв подвисал с удержанием SCL то на последней картинке (попытка recovery)
тактирования не было бы совсем, а оно там есть...
так что еще не факт что слейв SCL держит

не видя Ваш код могу только предложить добавить на слейве если чего не хватает:
Код
  BYTE twsr=TWSR & 0xF8;              // Статус с учетом маски допустимых состояний

  switch (twsr)                // Разбор состояний i2c
  {
..............  <-- обрабатываемые состояния
..............
..............
    case (I2C_BUS_ERROR):              // 0x00 ---- ошибка на шине ------------
      TWCR;
      TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEA)|(1<<TWEN);
      return;

    case (I2C_RECV_ARB_LOST_ADR_ACK):  // 0x68 ---- Arbitration lost & General Calls
    case (I2C_RECV_GC_ADR_ACK):        // 0x70
    case (I2C_RECV_ARB_LOST_GC_ADR_ACK)://0x78
    case (I2C_RECV_GC_DATA_ACK):       // 0x90
      TWCR;
      TWCR=(1<<TWINT)|(1<<TWEN);       // отвечаем NAK
      return;

    case (I2C_RECV_DATA_STOP):         // 0xA0 ---- конец приема --------------

    case (I2C_RECV_DATA_NACK):         // 0x88 ---- если отвечали NAK ---------
    case (I2C_RECV_GC_DATA_NACK):      // 0x98

    case (I2C_SEND_DATA_NACK):         // 0xC0 ---- конец передачи пакета -----
    case (I2C_SEND_LAST_DATA_ACK):     // 0xC8

    default:                           // недопустимое состояние
      TWCR;
      TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);

  }
Go to the top of the page
 
+Quote Post
DS
сообщение Feb 28 2009, 20:07
Сообщение #33


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(singlskv @ Feb 28 2009, 22:59) *
Картинки странные конечно,
но если бы слейв подвисал с удержанием SCL то на последней картинке (попытка recovery)
тактирования не было бы совсем, а оно там есть...
так что еще не факт что слейв SCL держит

не видя Ваш код могу только предложить добавить на слейве если чего не хватает:


Слэйв держит, но выходы ATmeg имеют ограничение по току в режиме TWI, поэтому нога в стандартном режиме его перебарывает. Как только выход переходит в 3 состояние, "слабый" выход устанавливает шину в 0. Если отключить разъем от модуля, шина оживает.
В тиньке, кстати, ограничения по току нет, там такое КЗ на осциллограмме хорошо видно.

В обработчике, если что-то происходит не в очередь, или статус не соответствует ожидаемому, сразу выполняется STOP. Хотя, конечно, вариант "сам дурак" не исключен, только не из-за того, что забыли какие-то состояния обработать, а из-за какой-то более хитрой программной ошибки.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 28 2009, 20:35
Сообщение #34


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(DS @ Feb 28 2009, 23:07) *
Слэйв держит, но выходы ATmeg имеют ограничение по току в режиме TWI, поэтому нога в стандартном режиме его перебарывает. Как только выход переходит в 3 состояние, "слабый" выход устанавливает шину в 0. Если отключить разъем от модуля, шина оживает.

У меня были сомнения по картине N3 что там перетягивание на шине, но какое-то слабое перетягивание...

Но если нет сомнения что держит слейв, то нужно все-таки по состояниям twi разбираться.
Код
В обработчике, если что-то происходит не в очередь, или статус не соответствует ожидаемому, сразу выполняется STOP. Хотя, конечно, вариант "сам дурак" не исключен, только не в лоб, а из-за какой-то более хитрой программной ошибки.
STOP нужен только если пришло состояние I2C_BUS_ERROR

я на своей реализации проверял закороткой SCL и SDA, все восстанавливалось.

STOP в смысле TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEA)|(1<<TWEN); конечно
Go to the top of the page
 
+Quote Post
DS
сообщение Mar 1 2009, 00:13
Сообщение #35


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



А не может ли вызывать завис изменение режима SPI в момент работы модуля TWI ? Я обнаружил, что после изменения режима SPI первый байт передается рваным - сначала 4 или 5 бит, потом пауза различной длины, потом оставшиеся 3 бита. Я хотел попользоваться изменением скорости SPI "на лету", да видать нельзя. Только вот в datasheet не нашел ничего про такое ограничение. Может, невнимательно смотрел ?

После того, как я перестал трогать SPCR, перестал виснуть TWI (т.е. пока не повис за тот промежуток времени, за который раньше вис с гарантией).


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 1 2009, 01:06
Сообщение #36


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
А не может ли вызывать завис изменение режима SPI в момент работы модуля TWI ?

Не должно, но если наблюдается корреляция между изменением режима SPI и подвисанием TWI, то причина может быть в несвоевременной реакции на TWI прерывание.
Go to the top of the page
 
+Quote Post
DS
сообщение Mar 1 2009, 09:43
Сообщение #37


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Цитата(defunct @ Mar 1 2009, 04:06) *
Не должно, но если наблюдается корреляция между изменением режима SPI и подвисанием TWI, то причина может быть в несвоевременной реакции на TWI прерывание.


Да похоже, что именно с совпадением во времени промежутка между out spcr и out spdr и приходом пакета на TWI.

Где-нибудь в документации отражено, что первый байт, переданный по SPI после смены режима, искажается ? Я не нашел. А это факт, я на осциллографе это пронаблюдал и экспериментировал, как и что меняется при разных сменах режима.

Несвоевременную реакцию я тоже моделировал задержками до секунд, и в начале, и в середине пакета - не сбивается.

Сейчас работает без сбоев - отличие только в отсутствии команд out spcr в программе. Реакция на TWI даже несколько замедлилась - раньше я переключал spi между 2.5 Мгц и 10 Мгц, что позволяло сэкономить время,на которое прерывания необходимо запрещать.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
DS
сообщение Mar 1 2009, 11:46
Сообщение #38


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Вот код, который вызывает неадекватное поведение 48
Код
        ldi r31, $2e
        out ddrb,r31            
        ldi r31,$14
        out portb,r31
        ldi r31, $f
        out ddrc, r31
        ldi r31, $0
        out portc, r31
        ldi r31, $b
        out ddrd,r31            
        ldi r31,$fb
        out portd,r31

        ldi r25, 1
        out SPSR, r25

        ldi r25, $50
bbb:         out spcr, r25
        cbi portd, 3
        out SPDR, r25
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop

        nop
        nop


        in r1, SPSR
        sbi portd, 3

clr r16
bb: dec r16
brne bb
        rjmp bbb



А вот осциллограммы - синий - PD3, желтый - PB5 (SCK).

Дергать именно PD3 - важно, при замене на что-нибудь другое все нормально работает. Важна также задержка от записи SPDR до чтения SPSR и минимальная длительность после чтения SPSR - при загрузке в r16 числа, меньшего 64, сбоев нет.
Частота такта 20 Мгц. Кадры на осциллографе сняты в произвольный момент времени - форма сбоев непостоянна.


Какие будут комментарии ?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
DS
сообщение Mar 1 2009, 13:00
Сообщение #39


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Блин, классическое "сам дурак" - Наводки в шлейфике программирования от AVreal (15 cм) на тактовый генератор, приводящие к его сбою. Для получения нужной для сбоя амлитуды как раз не хватало в момент переключения SPI дергануть ногой PD3, расположенной рядышком с выводами генератора.

Так и рождаются нездоровые сенсации.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 1 2009, 16:34
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(DS @ Mar 1 2009, 17:00) *
Так и рождаются нездоровые сенсации.

smile.gif
Так попало в благодатную почву.

Здесь уже несколько раз проскакивали сообщения про "зависания" TWI в слэйве.

У меня, к примеру, всё прекрасно работает, причём годами, причём паралельно 24c512 сидят и обмен идёт очень плотный. Правда скорость не очень высокая.

Отличный интерфейс выдумали филипы.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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