Добрый день. Заинтересовался этой темой. Скачал Ваш protokol.rar и пытаюсь откомпилировать код под winavr. Опыт программирования - небольшой. Вообщем получил такие сообщения при компиляции: Код (Text): In file included from main.c:6: protocol.h: In member function 'void PROTOCOL::CProtocol::init(unsigned char)': protocol.h:60: error: 'MyTr' was not declared in this scope protocol.h: In member function 'unsigned char PROTOCOL::CProtocol::read(unsigned char, unsigned char*)': protocol.h:75: error: 'MyTr' was not declared in this scope protocol.h: In member function 'unsigned char PROTOCOL::CProtocol::send(unsigned char, unsigned char, unsigned char*, unsigned char, unsigned char, unsigned char)': protocol.h:197: error: 'MyTr' was not declared in this scope In file included from main.c:8: tr24a.h: In member function 'void TR24A::CTr24a::ModeSleep(unsigned char)': tr24a.h:414: error: 'MySpi' was not declared in this scope tr24a.h:415: error: '_delay_ms' was not declared in this scope tr24a.h: In member function 'void TR24A::CTr24a::reset()': tr24a.h:685: error: '_delay_ms' was not declared in this scope tr24a.h: In member function 'void TR24A::CTr24a::write(unsigned char, unsigned int)': tr24a.h:703: error: 'MySpi' was not declared in this scope tr24a.h:704: error: '_delay_us' was not declared in this scope tr24a.h: In member function 'unsigned int TR24A::CTr24a::read(unsigned char)': tr24a.h:724: error: 'MySpi' was not declared in this scope tr24a.h:727: error: '_delay_us' was not declared in this scope tr24a.h: In member function 'unsigned char TR24A::CTr24a::init()': tr24a.h:809: error: '_delay_ms' was not declared in this scope tr24a.h: In member function 'void TR24A::CTr24a::PkgSend(unsigned char, unsigned char*)': tr24a.h:876: error: 'MySpi' was not declared in this scope tr24a.h:877: error: '_delay_us' was not declared in this scope tr24a.h: In member function 'unsigned char TR24A::CTr24a::PkgRead(unsigned char*)': tr24a.h:902: error: 'MySpi' was not declared in this scope tr24a.h:903: error: '_delay_us' was not declared in this scope make.exe: *** [main.o] Error 1 Где и как обьявить MyTr и MySpi? Вообщем не знаю, правильно ли это (в с++ соображаю не сильно), но обьявил в main.c так: Код (Text): #include "spi.h" SPI::CSpi MySpi; #include "tr24a.h" TR24A::CTr24a MyTr; Спаял макет на ATmega1280 (все что было трехвольтовое под рукой ) буду пробовать отлаживать код.
С MySpi я не разбирался и использовал библиотечную функцию из компиляторовского spi.h файла : прочитать порт x=spi(0); записать в порт spi(x); только в программе SS ножку нужно дергать местами. delay.h не указали.
У меня другая проблема возникла. Когда проверяю записанные регистры инициализации нахожу 8 ошибок несоответствия того что я записал и то что там в результате осталось. Причем отличаются все бракованные регистры лишь старшим битом старшего байта. Может у кого такое было. как боротся?надо ли, или оно не влияет на работу а просто причуд модуля.
Это твой косяк в SPI. У меня такое было на арм. Там конфигов на SPI много. Скорей всего ты его неправильно настроил.
Просмотрел апноуты и все конфиги. Начал пробовать, связь вообще пропала. По апноуту минимальный период такта SPI составляет 78нс что есть 12мГц - странно как-то. Дальше судя по даташиту тактирующие импульсы идут от 0В Mode 0 SPI (тоесть когда импульсов нет тогда на ногк sck 0В). У меня же хоть как-то работало при варианте наоборот - Mode 2 SPI. Продолжаю изучения...
Модуль стабильно работает на частоте SPI 3Мгц. Я об этом не раз писал. Также в моем коде приведен правильный конфиг для AVR. На арм смотреть смысла нет. Там у каждого кристала SPI настраивается по своему.
Хорошо, надо будет почитать на счет этой ноги. Сейчас чтобы далеко не ходить пытаюсь запустить класс CUART топикстартера. Если все пойдет, тогда - инициализацию трансивера. Cудя по ответу, полученному от метода CTr24a::init() инициализация трансивера прошла успешно. Осталось только спаять еще один макет и попытаться установить связь.
SS не будет дергаться сама. Да и зачем это вообще нужно в SPI? SS это crystal select. Это нужно для слейва.
SS не будет дергаться сама. Да и зачем это вообще нужно в SPI? SS это crystal select. Это нужно для слейва.
С ошибками инициализации поборолся. Все было в настройках SPI. Не мог разобраться так как в ДШ на микросхему указан пример для режима с детекцией по фронту, а в модуле тупо бит фазы подтянут к питанию и идет детекция по спаду. Пришлось прошерстить даташит и по битикам набрать настройку SPI. Взялся все оптимизировать. Вроде прием идет нормально от передатчика. Появилась такая проблема. Приемник принимает пакеты почти безошибочно на протяжении минут 10, потом резко все пакеты приходят или пустые или битые и в нормальное состояние приемник возвращается только ресетом мк. Както смахивает на какой-то разогрев трансивера. Читаю так: Код (Text): moderx(); // входим в режим приема while ((TXRX!=1)&&(get_state()!=0)) delay_ms(300); // ждем признака удачного приема pkgread(data); // читаем в буфер
Это у тебя буфер слетает на трансивере. Скорей всего гдето не так сбрасываешь указатель на голову. Хотя он автоматом сбрасывается, но его все же нужно вручную сбрасывать.
a9d, у меня такой вопрос. буфер нужно сбрасывать как только перешел в режим приема или уже после принятия пакета перед выходом в идл? Как в первом случае не убить данные которые могут уже начать приниматся?
Приветствую всех! Давно интересуюсь данным модулем, тему и выложенные исходники прочел от корки до корки, но тем не менее, не ясен ряд моментов по логике работы устройства. Копать и пытаться понять чужой код та еще задачка, лучше написать свой, потому прошу, если не сложно, подробно описать алгоритм работы с FIFO(до сих пор не пришло понимание), как я понял, это некий блок регистров в общем банке, суммарной длиной в 64 байта, и он полностью отправляется в виде одного пакета при цикле приема/передачи, по окончанию которых ставится флаг окончания операции? Итого, правильно ли я понял: 1) Инициализируем устройство, прописывая в нужные регистры нужные данные, оно входит в режим ожидания Idle 2) В зависимости от прописанного в регистр 7 трансивер включается на нужный канал и номер приемника/передатчика в режим готовности к приему/передачи пакета 3) Вот тут самое темное - устройство готово к передаче, как работать с этим FIFO, по каким адресам в какой последовательности совать данные, и по какому алгоритму (что есть что в пакете) Та же ботва и с приемом. В конечном итоге мне не нужен весь функционал модуля, достаточно лишь совать по каналу нужные мне байты. Купил сразу 2 модуля TR24P