1wire slave (эмулятор устройства на шине), Си (CVAVR)
Добавлено: Чт янв 31, 2013 18:21:55
Добрый мяу всем! Колебался на тему того, что куда выложить свои труды. Решил, что это больше похоже на программирование, а не на законченное цифровое устройство. Потому пишу здесь, не судите строго. К делу!
Ковырялся как то с очередной своей поделкой и пришел к выводу, что мне очень необходимо больше каналов ШИМ, чем это имеет АТмега16. Попытался сваять программный ШИМ - получилось, но для беззвучной работы куллера нужна высокая частота, но тогда ни на что другое МК уже не хватает (еле ползёт).
Самое простое решение, которое пришло в голову - воткнуть в качестве управляемого генератора АТТини45, благо она стоит не дорого (47р у нас), и управлять ей по уже имеющейся на головном МК шине 1wire. Возникла идея создания 1wire_slave устройства, но сколько бы я не гуглил, но так и не нашел на Си (CVAVR) более-менее доходчивого примера. Пришлось брать даташит, скудное описалово на русском, осцилл и весь свой небольшой опыт в программировании.
Что у меня получилось, судить Вам. Профи могут указать на мои ошибки, а новички могут что то подчерпнуть из кода (он излишне прокомментирован).
Что умеет код?
Давать находить себя по команде SEARCH ROM 0xF0 - поможет, если устройств на шине больше, чем 1.
Отдавать свой ROM по команде READ ROM 0x33 - можно сделать эмулятор iBUTTON 1990а
Умеет MATCH ROM (0x55) - нужно, если устройство на шине не одно - позволяет обратиться к себе лично по ROM
Позволяет Мастеру записывать 8 байт по аналогии команды WRITE SCRATCHPAD 0x4E. От Мастера принимается 7-байтный буфер (+байт crc), в котором (при организации связи между МК) могут содержаться или команды Слейву, или какой то ответ.
Позволяет Мастеру считывать 8 байт по аналогии команды READ SCRATCHPAD 0xBE. Мастеру передается 7-байтный буфер(+байт crc), в которых (при организации связи между МК) может содержаться или ответ мастеру, или команда.
Умеет подтверждать Мастеру вопрос "Правильно ли ты принял последний буфер, совпало ли crc"?
Выкладываю код прежде всего потому, что несколько дней назад тщетно искал его, но не нашел. Или я плохо искал, или это первое явление 1wire slave под Си и компилятор CVAVR. Профессионалы, не судите строго код! Я только учусь.
Да, и пару слов о железе. Код писался и проверялся на ATmega8A, работающий на частоте 8мГц своего внутреннего тактового генератора. Шина 1Wire заведена на PD2, активирован INT0 по низкому уровню. Исполняющий код, который должен располагаться в основном цикле, я не писал, ибо тут уж каждый сам решает как быть дальше с полученным от Мастера буффером.
Ковырялся как то с очередной своей поделкой и пришел к выводу, что мне очень необходимо больше каналов ШИМ, чем это имеет АТмега16. Попытался сваять программный ШИМ - получилось, но для беззвучной работы куллера нужна высокая частота, но тогда ни на что другое МК уже не хватает (еле ползёт).
Самое простое решение, которое пришло в голову - воткнуть в качестве управляемого генератора АТТини45, благо она стоит не дорого (47р у нас), и управлять ей по уже имеющейся на головном МК шине 1wire. Возникла идея создания 1wire_slave устройства, но сколько бы я не гуглил, но так и не нашел на Си (CVAVR) более-менее доходчивого примера. Пришлось брать даташит, скудное описалово на русском, осцилл и весь свой небольшой опыт в программировании.
Что у меня получилось, судить Вам. Профи могут указать на мои ошибки, а новички могут что то подчерпнуть из кода (он излишне прокомментирован).
Что умеет код?
Давать находить себя по команде SEARCH ROM 0xF0 - поможет, если устройств на шине больше, чем 1.
Отдавать свой ROM по команде READ ROM 0x33 - можно сделать эмулятор iBUTTON 1990а
Умеет MATCH ROM (0x55) - нужно, если устройство на шине не одно - позволяет обратиться к себе лично по ROM
Позволяет Мастеру записывать 8 байт по аналогии команды WRITE SCRATCHPAD 0x4E. От Мастера принимается 7-байтный буфер (+байт crc), в котором (при организации связи между МК) могут содержаться или команды Слейву, или какой то ответ.
Позволяет Мастеру считывать 8 байт по аналогии команды READ SCRATCHPAD 0xBE. Мастеру передается 7-байтный буфер(+байт crc), в которых (при организации связи между МК) может содержаться или ответ мастеру, или команда.
Умеет подтверждать Мастеру вопрос "Правильно ли ты принял последний буфер, совпало ли crc"?
Выкладываю код прежде всего потому, что несколько дней назад тщетно искал его, но не нашел. Или я плохо искал, или это первое явление 1wire slave под Си и компилятор CVAVR. Профессионалы, не судите строго код! Я только учусь.
Да, и пару слов о железе. Код писался и проверялся на ATmega8A, работающий на частоте 8мГц своего внутреннего тактового генератора. Шина 1Wire заведена на PD2, активирован INT0 по низкому уровню. Исполняющий код, который должен располагаться в основном цикле, я не писал, ибо тут уж каждый сам решает как быть дальше с полученным от Мастера буффером.