Возня с MRF49XA

Напишу пару слов об опыте общения с MRF49XA — трансивер на частоты 433, 868 и 915 МГц. Модуляция — ЧМн (FSK — Freq. Shift Keying), скорости передачи — до 115.2 kbps. Из обвязки требует кварц на 10 МГц и три блокировочных конденсатора по питанию.

Ссылочки

Вот страничка на сайте микрочип, посвященная этому трансиверу.
Первой строчкой там даташит, второй строчкой — полезный аппноут 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
Полноценные тесты на дальность не проводил, в пределах квартиры уверенно ловится в любом углу.

Комментарии (53)

RSS свернуть / развернуть
Пайка супер!
+1
Это не моя пайка, это blaze. Я как пример обвязки привел. Свою пайку я на форуме выкладывал )
0
Модуляция — ЧМ (FSK — Freq. Shift Keying),
ЧМн, а не ЧМ. Частотная манипуляция оно называется.

Любопытная микросхемка, да и стоит довольно вменяемо для радиомодуля.
0
  • avatar
  • Vga
  • 03 июля 2011, 17:21
Погуглил, согласен. Исправлю.
0
Судя по фото, между катушками сильное взаимодействие через магнитное поле. Они действительно должны так располагаться? Стоит повернуть катушку на 90гр и взаимодействие сойдет на ноль.
0
Фотка не его. Так что похвалы по поводу пайки и вопросы по поводу расположения катушек — к blaze'у с VRTP. Но у него, видимо, работало. Хз правда на какой дальности.
Алсо, разместить взаимноперпендикулярно 3 катушки можно, но не так просто)
0
Свою фотку тоже выложил
0
Спасибо за статью, steel_ne!!! Собираюсь повторить. Мучает один лишь вопрос — какова дальность уверенной приемопередачи? Все таки на какой частоте Вы запустили микросхему (из статьи не понял). Можно ли делать смену частоты и делать реинит в процессе работы модуля.
0
антенна расчитана на определенную частоту и на других частотах ее усиление и ксв будут большими
но в пределах квартиры будет работать
0
В подписи к чертежу антенны: 915-868 dual band, т.е. двухдиапазонная. Скорее всего настроена где-то посередине. У меня работает на 915.

И как справедливо заметил kalobyte, антенны с бОльшим усилением будут иметь меньший диапазон.
0
ясно. То есть можно с pcb антенной, можно по таблице с катушками aka blaze — будет получше, по всей видимости…

Будь добр, проверь пожалуйста дальность (если не затруднит, конечно).
0
… вдогонку вопрос: какую из двух выбирать MRF49XA-I/ST или MRF49XAT-I/ST?
0
А все равно. Отличаются только упаковкой. С буквой Т = Tape and Reel — упакована в ленту для автоподачи.
0
Очень удобная кстати упаковка. Стоит ее выбрать, если цена не выше.
0
вроде бы цена одинакова.
Steel_ne, не могли бы Вы опубликовать проект целиком (не корысти ради (с)? WinAVR у меня в стадии изучения (пока на уровне быдлокодера), боюсь SPI меня поглотит быстрее, чем MRF заработает… На бесплатной готовой прошивке blaze на PIC собирать не вижу смысла. Спасибо.
0
С одной стороны там больше ничего и нет — для передатчика вызываем MRF_send(), для приемника — MRF_receive().
С другой стороны для внятного устройства надо вводить систему команд, систему идентификации, защиту от ошибок и т.д.
0
платы собрал давно, завести так и не смог… Использую вот такой пример для RFM12b в качестве полноценного исходника для Mega8 olek.tk/en/rfm12.php. Но пока попытки безуспешные. Своего ума явно не хватает ((
0
хорош трансивер, давно его юзаю, но никак нормальную антенну не подберу
сделал обвязку для штыря, дальность не особо устраивает, в пределах 2х комнат ловит… может длинна шьыря не та
Надо попробовать диполь в следущем девайсе сделать, сенкс за ссылку на апнот с антенками)
0
люди подскажите какой микроконтроллер лучше взять, чтобы воспользоваться текстом программы который указан в этой «возне»? Этой программой необходимо прошить микроконтроллер и на передатчике и на приемнике?
0
  • avatar
  • luq
  • 01 декабря 2011, 16:19
Поскольку выходы у трансивера — открытый коллектор, то на антенну надо подать питание. Для этой антенны оно подается синей дорожкой по обратной стороне платы. Толщина текстолита указана 0.5 мм (а у меня как раз такой), так что не заморачивался и вырисовал точно по размерам.
не понимаю.
0
Ну и что тут непонятно?
0
Плохо разбираюсь в радио и не понятно как на антену подают напряжение. И как на это влияет толщина текстолита.
0
Здесь рамочная антенна, представляющая собой по сути катушку индуктивности. Соответствено, чтобы она излучала — в нее нужно подать ток. Но у микры — два противофазных выхода с открытым коллектором, если между ними включить рамку — тока не будет, т.к. выходы могут только к земле тянуть. Значит, где-то надо ввести и питание. В данном случае — в середину рамки, получается по сути аналог импульсного питальника типа push-pull, только вместо трансформатора — рамка.

А с толщиной все совсем просто. Большинство антенн — резонансные и нормально работают только в узком диапазоне частот. А резонансная частота их, в свою очередь, зависит от всего подряд, включая погоду на марсе. В том числе, разумеется, и от толщины и материала платы. Поэтому под текстолит другой толщины пришлось бы пересчитывать размеры антенны, или смириться с резким падением дальности связи. А это уже черная магия)
0
Что такое открытый коллектор? Это когда транзистор стоит эмиттером на землю, а голым коллектором наружу. В этом случае он может тянуть цепь только к земле и все. Если оба выхода ОК, то соединив их петлей на плате мы никакого тока не получим, как бы мы их не дергали.
Это автоматически означает, что надо как-то на антенну подать питание. Оно подается в точку, где нарисован зеленый кружочек — там находится переход на другой слой (обратную сторону). По обратной стороне проведена синяя дорожка до плюса питания.
Она проведена четко по центру, чтобы не сбить настройку антенны.
0
А разогнать такую штуку на предмет увеличения выходной мощности сильно сложно?
0
А нельзя ли в исходнике подкоментировать хотя бы функции, а то не понятно новичку какая что делает!?
0
Друзья, а что есть по усилению сигнала таких штуковин?
Есть пара микроконтроллеров со вшитым трансивером, тоже микрочиповские. Хочу, чтобы на километр било.
0
  • avatar
  • Urvin
  • 22 февраля 2012, 20:56
Посмотрите, пожалуй, в сторону RFM50, уже появились в продаже в здешних краях по 9 баксов.
Мощность 100 мВт, чувствительность вплоть до 0,2 мкВ (зависит от полосы). Базируется на SI1000 (трансивер + МК в одном корпусе, причём МК весьма крутой).
Даташит здесь: www.hoperf.com/upload/rf/RFM50.PDF
По опыту с радиотелефонами примерно на тех же частотах, линк-бюджета хватит километров на 20 в прямой видимости и на 1-5 км в городских условиях.
0
Вдогонку. Усилить-то можно и то, что есть, но неудобно — TX и RX совмещены, придётся усилитель мощности коммутаторами отгораживать, возни много. И маленькая мелочь, под рукой должен быть хотя бы HP8920. :)
0


Решил собрать функциональный преобразователь USB-USART-RS485-Radio.
Миниотчет: собрал по стандартной схеме, управление от mega8, частота 868 МГц, антенна — петля на печатной плате, плату заказывал на производстве. Небольшая ошибка: антенну не вскрыл от паяльной маски, не могу судить, насколько повлияло на качество связи. На выводе 15 (RSSI) в лучшем случае держится 430 мВ, при этом уверенный сигнал только в пределах квартиры. Через окно с третьего этажа с улицы ~15 метров прием, дальше — глохнет. В связи с этим вопросы:

1) Возможно ли добиться вменяемого расстояния уверенной передачи при использовании петли?
2) Есть ли способы увеличить дальность передачи в данный момент (полоса пропускания и девиации выставил на средние значения, пробовал играть частотой в пределах десятков кГц — бестолку)
3) Насколько микросхема (дальность передачи) чувствительна к чистоте питания? (сейчас запитан от USB компа).
0
Гм. Может не стоило антенну так размещать? Обычно их убирают на край платы, и рядом никакие проводники не разводят, а у тебя там и кварц, и кнопка какая-то…
ИМХО, лучше сделать как в статье.
0
Настолько сильно мог сэкранировать кварц?
Кнопка — пластик, от неё вряд ли проблемы можно ожидать.
А вообще да, пожалуй, вынести на край платы надо было…
Vga, как ты считаешь, вообще 50 метров в здании реально выжать с PCB антенной?
0
У меня что то не получается ?! forum.easyelectronics.ru/viewtopic.php?f=4&t=9573
0
Вопрос возник такой: если 49XA работает только на прием — надо ли запитывать середину антенны-рамки для диапазона 868Мгц?
0
Да.
0
а на stm32w* обращал внимание?
0
  • avatar
  • bzzz
  • 10 апреля 2012, 23:54
Обращал, но сейчас не могу его применить — как основной процессор он слабоват, как трансивер — слишком много геморроя.
0
а в чем геморрой? (собирался с ними побаловаться...)
0
отдельная программа, отдельная отладка. Если на него свалить весь стек, то памяти может не хватить или придется в буферах ужиматься.
0
понятно, спасибо.
0
вообще у stm32w есть еще один неприятный момент — корпуса все безногие, вроде бы.
0
Всем привет. Наверное товарищи забыли о поляризации излучаемых радиоволн. Петлевой вибратор имеет свою форму диаграммы направленности и соответственно — поляризацию излучаемых радиоволн. Несовпадение поляризаций приемной и передающей антенны сводит к нулю дальность радиосвязи! В этом плане штыревой вертикальный вибратор длиной Лямбда /4 будет самое оно!
0
  • avatar
  • mrc
  • 06 мая 2012, 00:05
А как рассчитать 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?
Помогите пожалуйста…
0
Есть какой-нибудь аналог MRF49XA большей можности? Мне необходимо обеспечить дальность в условиях препятствий (в доме, через несколько стен) не менее 100 метров. Либо, может быть, можно сделать усилитель? Желательно использавать ее в режиме и приемника и передатчика.
0
RFM50 (готовый модуль с довольно крутым микроконтроллером, 100 мВт/-121 дБм).
А вообще-то MRF49XA и подобных при правильной настройке и небольшой скорости передачи данных должно хватить; на TXC101/RXC101 я получал 250 м сквозь 5 подъездов.
0
на TXC101/RXC101 я получал 250 м сквозь 5 подъездов.
С какой антенной?
0
С четвертьволновым штырём. Прогонял RC5 напрямую (это был ретранслятор для пульта ДУ). Девиацию поставил на минимум, полосу пропускания приёмника тоже (67 кГц). Там ещё фишка в точной настройке опорников — программной подстройкой выгонял частоту передачи с точностью до 2 кГц (иногда и 1 кГц получался), и аналогично с приёмником — подаю сигнал с генератора (с девиацией килогерц 8-10) и подстройкой опоры добиваюсь симметричного сигнала на выходе.
0
Готовый модуль RFM12-BP: 433/868 МГц, 5 Вт.
0
Спасибо! Я к нему тоже приглядываюсь. Только он мощностью 0,5 Вт, но мне, думаю, этого будет достаточно для обеспечения уверенного приема на расстоянии 100 м с учетом всевозможных препятствий.
Возникает проблема с приобретением его. В Новосибирск их только оптовые компании готовы привезти, а в Москве, те компании, что откликнулись, только с юридическими лицами работают. Нигде найти не могу.
0
Есть в futurlec.com по 15 президентов.
0
А можно ли использовать петлевую антенну с текстолитом 1.3мм?
0
RF_SDO в коде это четвертый пин MRF49XA?
0
Хахахах, попробовал использовать балун на 433
Из 10 штук удачно припаялось две, и те не работают (остальные в урну, ибо выводы напыленные)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.