Возня с MRF49XA


Ссылочки
Вот страничка на сайте микрочип, посвященная этому трансиверу.Первой строчкой там даташит, второй строчкой — полезный аппноут AN1252 — Interfacing the MRF49XA Transceiver to PIC Microcontrollers, собственно про взаимодействие контроллера и трансивера.
Сознательно не даю ссылки на сами файлы, потому что уже напоролся один раз — с форума вела ссылка на старый даташит, который был уныл чуть больше чем полностью. Поэтому первое правило работы с незнакомыми (или забытыми) компонентами — скачайте последний даташит с сайта производителя.
Также будет полезен аппнот AN421 Antenna Selection Guide for the Si4020 and Si4320 ISM Band FSK Transmitter/Receiver Chipset от Silicon Labs (вот страничка). На название трансивера не смотрите, во-первых это аналог, во-вторых нам нужна только антенна.
Антенна
Предупреждаю сразу — в ВЧ технике я новичок, так что если будут какие-то замечания — приму с удовольствием.В даташите на трансивер указано, что ВЧ-выходом является симметричный открытый коллектор. И, типа, хорошо с ним согласовывается диполь или петля. Ну если захочется несимметричной антенны (например, четвертьволновой штырь), то прямо в даташите есть схема согласователя:

Закупил я на всякий случай конденсаторов и индуктивностей.
С другой стороны, на vrtp.ru blaze собирал аналогичную схему, только он по своей практике индуктивности мотал проводом на оправке. Ну и антенна — четвертьволновой проводок.

Это пайка blaze. Приведена как вариант обвязки.
Так что каждый выбирает свой путь в ад. Я выбрал петлевую антенну, вычитанную из аппнота AN421.

Поскольку выходы у трансивера — открытый коллектор, то на антенну надо подать питание. Для этой антенны оно подается синей дорожкой по обратной стороне платы. Толщина текстолита указана 0.5 мм (а у меня как раз такой), так что не заморачивался и вырисовал точно по размерам.
Вот что получилось в итоге:

Сопряжение с контроллером
Ну тут вроде все понятно должно быть. На нижнем уровне — SPI, плюс пара ножек на организацию работы с прерываниями. Особо не задумывался, собрал платку по такой схеме:
В даташите обязательными к подключению были отмечены ножки с 1 по 5, но реальность оказалась гораздо более жестокая, и я не пожалел, что завел лишнии линии на МК.
Вообще, глядя на микросхемы с интерфейсом SPI кажется, что каждый разработчик стремится использовать его максимально извращенным способом.
Здесь тоже не обошлось без плясок с бубном.
Первый способ общения с контроллером: через регистры.
Для этого режима достаточно использовать только линии SPI. Адресация регистров происходит очень интересно — первые насколько бит (обычно 8, но может быть и меньше) содержат «адрес» регистра. Как только мы их зальем, то дальше происходит работа с выбранным регистром.
Например, так выглядит начало описания регистра AFCCREG:

Биты с 15 по 8 — это биты кода команды. Мы их передаем, чтобы указать, что хотим работать с регистром AFCCREG. У другого регистра будет другой код.
Ладно, к этому привыкнем. Не впервой. Но есть такой регистр, который называется STSREG — статус-регистр. У него нет такого кода. И в пометке указано, что чтение этого регистра надо начинать, послав первый бит 0 (у всех остальных регистров код команды начинается с 1). Вот тут и проявляется в полной мере один из финтов ушами. Посмотрим на диаграмму чтения этого регистра:

Нас интересует самая левая часть диаграммы. Как только мы прижали линию CS, то на линии SDO, еще без тактового сигнала, уже сразу появляется первый бит — бит состояния передачи. Этим вовсю пользуются в примерах: прижали CS, посмотрели на бит, поехали дальше, даже по SPI ничего не передавали.
При приеме мы факт самого приема определяем либо прочитав регистр статуса (а за ним сразу же можем вычитать байт из FIFO), либо есть специальная линия FINT.
Казалось бы — идиллия. Но, при передаче через SPI тратится драгоценное время на передачу кода регистра (в общем случае служебной информации столько же, сколько и полезной). Поэтому придумали упрощенный способ получить данные у трансивера.
Прямой доступ к регистрам FIFO
Если прижать линию FSEL (6 пин), то интерфейс SPI напрямую подключается к буферу приема, и за один присест, без всяких преамбул, можно выкачать его содержимое. Особенности такого режима — не надо прижимать CS и частота синхры не может быть больше 2.5МГц.А так, в принципе, удобно.
Небуферизированное общение
Можно настроить трансивер так, что данные будут просто появляться на ноге 6, а синхроимпульсы — на ноге 7. Но тут данные будут появляться, когда этого захочет трансивер, а не МК. То есть роли меняются — трансивер становится мастером, МК — слейвом.С одной стороны гибко, с другой стороны — главное не запутаться в режимах и все правильно выставить.
Я у себя использовал комбинацию из первого и второго способов — передавал через регистры, принимал через прижатие FSEL.
Код
Тут особо не заморачивался. Код выдрал из микрочиповского примера (ссылка на странице с даташитом), причесал из пиковских реалий для AVR, Получилось примерно такое:
//--------------------------------------------------------------------
// MRF49XA SPI commands:
//--------------------------------------------------------------------
#define GENCREG 0x8038 // Cload=12.5pF; TX registers & FIFO are disabled
#define PMCREG 0x8200 // Everything off, uC clk enabled
#define RXCREG 0x94A1 // BW=135kHz, DRSSI=-97dBm, pin8=VDI, fast VDI
#define TXBREG 0xB800
#define FIFORSTREG 0xCA81 // Sync. latch cleared, limit=8bits, disable sensitive reset
#define BBFCREG 0xC22C // Digital LPF (default)
#define AFCCREG 0xC4D7 // Auto AFC (default)
#define CFSREG 0xA7D0 // Fo=915.000MHz (default)
#define TXCREG 0x9830 // df=60kHz, Pmax, normal modulation polarity
#define DRSREG 0xC623 // 9579Baud (default)
#define RXFIFOREG 0xA000
uint8_t SPI_write(uint8_t cData) {
SPDR = cData;
while(!(SPSR & _BV(SPIF)));
return SPDR;
}
uint8_t MRF_command(uint16_t cData) {
uint8_t rData;
MRF_CS_0;
SPI_write(cData>>8);
rData = SPI_write(cData);
MRF_CS_1;
return rData;
}
void MRF_write(uint16_t cData) {
SPI_write(cData>>8);
SPI_write(cData);
}
void MRF_init() {
//---- Send init cmd
MRF_command( FIFORSTREG );
MRF_command( FIFORSTREG | 0x0002);
MRF_command( GENCREG);
MRF_command( CFSREG);
MRF_command( PMCREG);
MRF_command( RXCREG);
MRF_command( TXCREG);
//---- antenna tunning
MRF_command( PMCREG | 0x0020); // turn on tx
_delay_ms(4);
//---- end of antenna tunning
MRF_command( PMCREG | 0x0080); // turn off Tx, turn on receiver
MRF_command( GENCREG | 0x0040); // enable the FIFO
MRF_command( FIFORSTREG);
MRF_command( FIFORSTREG | 0x0002); // enable syncron latch
MRF_FSEL_1;
}
void MRF_send(uint8_t t1,uint8_t t2){
//---- turn off receiver , enable Tx register
MRF_command(PMCREG); // turn off the transmitter and receiver
MRF_command(GENCREG | 0x0080); // Enable the Tx register
//---- Packet transmission
// Reset value of the Tx regs are [AA AA], we can start transmission
//---- Enable Tx
MRF_command(PMCREG |0x0020); // turn on tx
MRF_CS_0; // chip select low
while(!RF_SDO);
MRF_write(TXBREG | 0xAA); // preamble
while(!RF_SDO);
MRF_write(TXBREG | 0x2D); // sync pattern 1st byte
while(!RF_SDO);
MRF_write(TXBREG | 0xD4); // sync pattern 2nd byte
while(!RF_SDO);
MRF_write(TXBREG | 2);
while(!RF_SDO); // wait for SDO, when buffer data <=8 bits
MRF_write(TXBREG | t1); // write a byte to tx register
while(!RF_SDO); // wait for SDO, when buffer data <=8 bits
MRF_write(TXBREG | t2); // write a byte to tx register
while(!RF_SDO); // wait for SDO, when buffer data <=8 bits
MRF_write(TXBREG |0x00); // write a dummy byte since the previous byte is still in buffer
while(!RF_SDO){} // wait for the last byte transmission end
MRF_CS_1; // chip select high, end transmission
//---- Turn off Tx disable the Tx register
MRF_command(PMCREG | 0x0080); // turn off Tx, turn on the receiver
MRF_command(GENCREG | 0x0040); // disable the Tx register, Enable the FIFO
//USART_send('T');
}
void MRF_receive() {
uint8_t pl;
uint8_t i;
if(RF_FCAP)
{
MRF_FSEL_0;
pl = SPI_write(0);
MRF_FSEL_1;
if ((pl>0) && (pl<16)) {
for (i=0; i<pl; i++) {
while(!RF_FCAP);
MRF_FSEL_0;
USART_send(SPI_write(0));
MRF_FSEL_1;
}
}
MRF_command(PMCREG); // turn off tx and rx
MRF_command(FIFORSTREG); // reset FIFO
MRF_command(GENCREG); // disable FIFO , Tx_latch
MRF_command(GENCREG | 0x0040); // enable the FIFO
MRF_command(PMCREG | 0x0080); // turn on receiver
MRF_command(FIFORSTREG | 0x0002); // FIFO syncron latch re-enable
}
}
В этом примере прерываний не использовал, тупо опрашивал ножки.
Итоги
Стоимость на текущий день $2.5, брал в www.microchip.uaПолноценные тесты на дальность не проводил, в пределах квартиры уверенно ловится в любом углу.
- +5
- 03 июля 2011, 14:41
- steel_ne
Судя по фото, между катушками сильное взаимодействие через магнитное поле. Они действительно должны так располагаться? Стоит повернуть катушку на 90гр и взаимодействие сойдет на ноль.
Спасибо за статью, steel_ne!!! Собираюсь повторить. Мучает один лишь вопрос — какова дальность уверенной приемопередачи? Все таки на какой частоте Вы запустили микросхему (из статьи не понял). Можно ли делать смену частоты и делать реинит в процессе работы модуля.
вроде бы цена одинакова.
Steel_ne, не могли бы Вы опубликовать проект целиком (не корысти ради (с)? WinAVR у меня в стадии изучения (пока на уровне быдлокодера), боюсь SPI меня поглотит быстрее, чем MRF заработает… На бесплатной готовой прошивке blaze на PIC собирать не вижу смысла. Спасибо.
Steel_ne, не могли бы Вы опубликовать проект целиком (не корысти ради (с)? WinAVR у меня в стадии изучения (пока на уровне быдлокодера), боюсь SPI меня поглотит быстрее, чем MRF заработает… На бесплатной готовой прошивке blaze на PIC собирать не вижу смысла. Спасибо.
С одной стороны там больше ничего и нет — для передатчика вызываем MRF_send(), для приемника — MRF_receive().
С другой стороны для внятного устройства надо вводить систему команд, систему идентификации, защиту от ошибок и т.д.
С другой стороны для внятного устройства надо вводить систему команд, систему идентификации, защиту от ошибок и т.д.
платы собрал давно, завести так и не смог… Использую вот такой пример для RFM12b в качестве полноценного исходника для Mega8 olek.tk/en/rfm12.php. Но пока попытки безуспешные. Своего ума явно не хватает ((
Поскольку выходы у трансивера — открытый коллектор, то на антенну надо подать питание. Для этой антенны оно подается синей дорожкой по обратной стороне платы. Толщина текстолита указана 0.5 мм (а у меня как раз такой), так что не заморачивался и вырисовал точно по размерам.не понимаю.
Плохо разбираюсь в радио и не понятно как на антену подают напряжение. И как на это влияет толщина текстолита.
Здесь рамочная антенна, представляющая собой по сути катушку индуктивности. Соответствено, чтобы она излучала — в нее нужно подать ток. Но у микры — два противофазных выхода с открытым коллектором, если между ними включить рамку — тока не будет, т.к. выходы могут только к земле тянуть. Значит, где-то надо ввести и питание. В данном случае — в середину рамки, получается по сути аналог импульсного питальника типа push-pull, только вместо трансформатора — рамка.
А с толщиной все совсем просто. Большинство антенн — резонансные и нормально работают только в узком диапазоне частот. А резонансная частота их, в свою очередь, зависит от всего подряд, включая погоду на марсе. В том числе, разумеется, и от толщины и материала платы. Поэтому под текстолит другой толщины пришлось бы пересчитывать размеры антенны, или смириться с резким падением дальности связи. А это уже черная магия)
А с толщиной все совсем просто. Большинство антенн — резонансные и нормально работают только в узком диапазоне частот. А резонансная частота их, в свою очередь, зависит от всего подряд, включая погоду на марсе. В том числе, разумеется, и от толщины и материала платы. Поэтому под текстолит другой толщины пришлось бы пересчитывать размеры антенны, или смириться с резким падением дальности связи. А это уже черная магия)
Что такое открытый коллектор? Это когда транзистор стоит эмиттером на землю, а голым коллектором наружу. В этом случае он может тянуть цепь только к земле и все. Если оба выхода ОК, то соединив их петлей на плате мы никакого тока не получим, как бы мы их не дергали.
Это автоматически означает, что надо как-то на антенну подать питание. Оно подается в точку, где нарисован зеленый кружочек — там находится переход на другой слой (обратную сторону). По обратной стороне проведена синяя дорожка до плюса питания.
Она проведена четко по центру, чтобы не сбить настройку антенны.
Это автоматически означает, что надо как-то на антенну подать питание. Оно подается в точку, где нарисован зеленый кружочек — там находится переход на другой слой (обратную сторону). По обратной стороне проведена синяя дорожка до плюса питания.
Она проведена четко по центру, чтобы не сбить настройку антенны.
Друзья, а что есть по усилению сигнала таких штуковин?
Есть пара микроконтроллеров со вшитым трансивером, тоже микрочиповские. Хочу, чтобы на километр било.
Есть пара микроконтроллеров со вшитым трансивером, тоже микрочиповские. Хочу, чтобы на километр било.
Посмотрите, пожалуй, в сторону RFM50, уже появились в продаже в здешних краях по 9 баксов.
Мощность 100 мВт, чувствительность вплоть до 0,2 мкВ (зависит от полосы). Базируется на SI1000 (трансивер + МК в одном корпусе, причём МК весьма крутой).
Даташит здесь: www.hoperf.com/upload/rf/RFM50.PDF
По опыту с радиотелефонами примерно на тех же частотах, линк-бюджета хватит километров на 20 в прямой видимости и на 1-5 км в городских условиях.
Мощность 100 мВт, чувствительность вплоть до 0,2 мкВ (зависит от полосы). Базируется на SI1000 (трансивер + МК в одном корпусе, причём МК весьма крутой).
Даташит здесь: www.hoperf.com/upload/rf/RFM50.PDF
По опыту с радиотелефонами примерно на тех же частотах, линк-бюджета хватит километров на 20 в прямой видимости и на 1-5 км в городских условиях.


Решил собрать функциональный преобразователь USB-USART-RS485-Radio.
Миниотчет: собрал по стандартной схеме, управление от mega8, частота 868 МГц, антенна — петля на печатной плате, плату заказывал на производстве. Небольшая ошибка: антенну не вскрыл от паяльной маски, не могу судить, насколько повлияло на качество связи. На выводе 15 (RSSI) в лучшем случае держится 430 мВ, при этом уверенный сигнал только в пределах квартиры. Через окно с третьего этажа с улицы ~15 метров прием, дальше — глохнет. В связи с этим вопросы:
1) Возможно ли добиться вменяемого расстояния уверенной передачи при использовании петли?
2) Есть ли способы увеличить дальность передачи в данный момент (полоса пропускания и девиации выставил на средние значения, пробовал играть частотой в пределах десятков кГц — бестолку)
3) Насколько микросхема (дальность передачи) чувствительна к чистоте питания? (сейчас запитан от USB компа).
- UnDerKetzer
- 29 февраля 2012, 01:53
- ↓
Гм. Может не стоило антенну так размещать? Обычно их убирают на край платы, и рядом никакие проводники не разводят, а у тебя там и кварц, и кнопка какая-то…
ИМХО, лучше сделать как в статье.
ИМХО, лучше сделать как в статье.
Настолько сильно мог сэкранировать кварц?
Кнопка — пластик, от неё вряд ли проблемы можно ожидать.
А вообще да, пожалуй, вынести на край платы надо было…
Vga, как ты считаешь, вообще 50 метров в здании реально выжать с PCB антенной?
Кнопка — пластик, от неё вряд ли проблемы можно ожидать.
А вообще да, пожалуй, вынести на край платы надо было…
Vga, как ты считаешь, вообще 50 метров в здании реально выжать с PCB антенной?
- UnDerKetzer
- 29 февраля 2012, 10:18
- ↑
- ↓
У меня что то не получается ?! forum.easyelectronics.ru/viewtopic.php?f=4&t=9573
Вопрос возник такой: если 49XA работает только на прием — надо ли запитывать середину антенны-рамки для диапазона 868Мгц?
Всем привет. Наверное товарищи забыли о поляризации излучаемых радиоволн. Петлевой вибратор имеет свою форму диаграммы направленности и соответственно — поляризацию излучаемых радиоволн. Несовпадение поляризаций приемной и передающей антенны сводит к нулю дальность радиосвязи! В этом плане штыревой вертикальный вибратор длиной Лямбда /4 будет самое оно!
А как рассчитать CFSREG для частоты в 433 Mhz? Там FA1 — FA0 и формула непонятная (F0 = 10 x FA1 x (FA0 + FVAL/4000) MHz where:
FVAL = Decimal Value of FREQB<11:0> = 96 < FVAL < 3903
Where FA0 and FA1 are constant values as given in Table 2-5 to calculate the Center Frequency.)
Откуда там 4000 мгц берется? Что за 3903?
Помогите пожалуйста…
FVAL = Decimal Value of FREQB<11:0> = 96 < FVAL < 3903
Where FA0 and FA1 are constant values as given in Table 2-5 to calculate the Center Frequency.)
Откуда там 4000 мгц берется? Что за 3903?
Помогите пожалуйста…
Есть какой-нибудь аналог MRF49XA большей можности? Мне необходимо обеспечить дальность в условиях препятствий (в доме, через несколько стен) не менее 100 метров. Либо, может быть, можно сделать усилитель? Желательно использавать ее в режиме и приемника и передатчика.
RFM50 (готовый модуль с довольно крутым микроконтроллером, 100 мВт/-121 дБм).
А вообще-то MRF49XA и подобных при правильной настройке и небольшой скорости передачи данных должно хватить; на TXC101/RXC101 я получал 250 м сквозь 5 подъездов.
А вообще-то MRF49XA и подобных при правильной настройке и небольшой скорости передачи данных должно хватить; на TXC101/RXC101 я получал 250 м сквозь 5 подъездов.
С четвертьволновым штырём. Прогонял RC5 напрямую (это был ретранслятор для пульта ДУ). Девиацию поставил на минимум, полосу пропускания приёмника тоже (67 кГц). Там ещё фишка в точной настройке опорников — программной подстройкой выгонял частоту передачи с точностью до 2 кГц (иногда и 1 кГц получался), и аналогично с приёмником — подаю сигнал с генератора (с девиацией килогерц 8-10) и подстройкой опоры добиваюсь симметричного сигнала на выходе.
Спасибо! Я к нему тоже приглядываюсь. Только он мощностью 0,5 Вт, но мне, думаю, этого будет достаточно для обеспечения уверенного приема на расстоянии 100 м с учетом всевозможных препятствий.
Возникает проблема с приобретением его. В Новосибирск их только оптовые компании готовы привезти, а в Москве, те компании, что откликнулись, только с юридическими лицами работают. Нигде найти не могу.
Возникает проблема с приобретением его. В Новосибирск их только оптовые компании готовы привезти, а в Москве, те компании, что откликнулись, только с юридическими лицами работают. Нигде найти не могу.
Комментарии (53)
RSS свернуть / развернуть