Страница 1 из 1

Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Сб май 26, 2012 23:46:11
O-LED
До этого времени обходился без применения i2c шины. Решил разобраться с ней и застопорился. Для начала хочу просто записать/прочитать байт в 24С128. Написал вот такой код.
СТАРТ выводится нормально, код подтверждения (0x08) приходит, потом пихаю в TWDR адрес устройства + W, и даю команду на передачу, и ничего не происходит. В регистре TWSR остаётся код 0x08, а в TWCR - 0xEC (11101100)
Подскажите где я туплю??

Код: Выделить всё

TWSR=0x00;            //
TWBR=0x20;            //  СКОРОСТЬ 100.000 КГЦ
TWCR=0b01000100;      //  ВКЛЮЧАЮ МОДУЛЬ TWI

ПОТОМ В ОСНОВНОМ ЦИКЛЕ
      
      TWCR |= 0x20;          // ВЫДАТЬ В ЛИНИЮ СТАРТ 
      TWCR |= 0x80;          // СБРАСЫВАЕМ TWINT  
      while (TWCR & 0x80 ) {}// ЖДЕМ УСТАНОВКИ ФЛАГА TWINT
      if (TWSR==0x08)        // ЕСЛИ КОД ПОДТВЕРЖДЕНИЯ РАВЕН  0x08
        {
        TWDR=0b10100000;    // ЗАГРУЖАЕМ АДРЕС УСТРОЙСТВА К КОТОРОМУ ОБРАЩАЕМСЯ (SLA+W)
        TWCR |= 0x40;       // ИНИЦИАЛИЗАЦИЯ ПЕРЕДАЧИ 
        TWCR |= 0x80;       // СБРАСЫВАЕМ TWINT  
        while(TWCR & 0x80){}// ЖДЕМ УСТАНОВКИ ФЛАГА TWINT
       }
Пробую в железе.
Изображение

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Вс май 27, 2012 08:36:34
orinoko
http://www.gaw.ru/html.cgi/txt/app/micr ... AVR315.htm
http://blog.bevice.ru/posts/716.html
http://electronics-and-mechanics.azm.su/page8.html

вот интересные статьи. Тоже пришлось писать модуль TWI для себя, используя прерывания. Но я пишу сугубо на ассемблере (вот такой я мазохист :) ), поэтому больше ничего сказать не могу. Но если всё делать по описанию, то всё получается.

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Вс май 27, 2012 22:59:10
vovksextra

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Пн май 28, 2012 08:51:36
orinoko
Кстати, хочу обратить внимание на момент с работой с EEPROM-ками. Если потом вы захотите писать/читать не по 1 байту а блоками, то учесть следующее.
1. Читать можно, начиная с любого адреса и хоть всю память до конца, при этом автоинкремент адреса будет идти автоматом.
2. Писать можно блоками не более 16 байт. Блок начинается с адреса, кратный 16. Автоинкремент идёт только внутри блока, т.е. после ячейки 15 пойдёт 0. Запись блока в память начинается после передачи СТОП. После передачи текущего блока и перед записью следующего пауза не менее 10 мс (у ряда микросхем 5 мс - в ДШ на данный тип)

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Пн май 28, 2012 09:12:00
vovksextra
orinoko писал(а):Кстати, хочу обратить внимание на момент с работой с EEPROM-ками.
Замечание очень важное. Только для протеуса длина блока не должна превышать 8 байт и пауза перед записью следующего блока должна быть не менее 50 мс.

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Пн май 28, 2012 11:08:35
orinoko
Вы знаете. лично недавно, когда проверял свою программу, видел, что Протеус прекрасно схомячил 16-байтный блок. Но я заметил, что не все епромки одного типа одинаково эмулируются (у меня использовалась 24с16). И 10 мс осилил.

Re: Изучаю работу модуля TWI. Нужна помощь.

Добавлено: Пн май 28, 2012 14:11:00
ds1307
Я тоже изучал TWI. Использовал прерывание, мне так показалось проще. Особенно после прочтения http://easyelectronics.ru/avr-uchebnyj- ... c-i2c.html автор Di Halt.
Но для моих целей не подошло, делал типа анализатора.