CC2500

Рассказывать об этом трансивере не буду, он и так очень известен и популярен. От себя, он просто шикарен!
Лучше расскажу о том как и что я в нем использовал.


1) Монтаж, схемотехника и прочее.

Рекомендуемая схема включения приведена в даташите. И прежде ее нужно смотреть там.
Но надо заметить, что от батареи он замечательно работает без керамики.
Самое сложное это рассчитать номинал конденсаторов на кварцевом резонаторе. Согласно даташиту, для моего кварца 27Мгц Cl=16pf нужно было использовать конденсаторы 27pf. Но с этими конденсаторами он не запустился правильно. Заработало с номиналом 22pf.

На этапе подбора кварцев очень хорошо иметь под рукой логический анализатор. Т.к. по дефолту GDO0 настроен на выход Fcrystal/192 и можно определить на какой гармонике запустился кварц

Также согласно даташиту на выводе GCOUPL должна стаять керамика 100nF. Осциллограф там показывает сильный шум, если поставить меньший номинал.
Этот косяк можно заметить используя мультиметр. Если напряжение на пине GCOUPL != 1.6V, то проблемы стабильно будут.

Трансивер легко спалить. По запаре, от логического анализатора я запитал трансивер пятью вольтами. Трансивер остался рабочим, но стал даже в режиме сна потреблять 41ма.

В своем проекте я использовал Т-образную антенну. Для которой не требуются элементы согласования. Все работает замечательно.
Герберы всех типов антенн доступны на сайте ti, но спрятаны в недрах. Поэтому их проще искать на сайтt ti используя гугл. Названия архивов с герберами приведены в соответствующих апнотах.

Паять трансивер CC2500 очень легко. У него пины торчать по бокам. Его даже паяльником впаять легко.

Еще важный момент. У трансивера довольно сильный пин SO, его не смог пересилить мой программатор. На него нужно вешать резистор на 100Ом, если планируется использовать ISP программатор.

2) Программирование

Основные настройки берутся из SmartRF Studio. Студия избавит от рутинных расчетов коэффициентов по формулам. Но даташит все равно нужно будет прочитать. Т.к. студия настраивает только основные параметры.

По сети гуляет множество исходником. Как правило они кривые. Так, что лучше не замарачиваться и брать код от Ti. В нем нужно переписать только функции SPI.

2.1) Использование FEC

FEC в трансивере не очень удобен. Т.к. работает только с пакетами фиксированной длинны а также если настроен не верно то все равно все будет работать. Но при этом не будет работать кодирование FEC. Т.е. даже если включили FEC и неправильно настроили, то пакеты передаваться будут в не закодированном виде.

Так, что все должно быть настроено точно как написано в даташите. В регистре MDMCFG1 включаем FEC, настраиваем фиксированную длину пакета (рег. PKTCTRL1). И задаем размер пакета PKTLEN. Длинна пакета должна быть кратна двойке.

У трансивера есть очень хорошая функция CRC_AUTOFLUSH (рег. PKTCTRL1), это сбросить буфер приема если CRC16 не совпало. Ее лучше включить. Т.к. битый пакет все равно не нужен.
ВАЖНО: Если функция не используется, то пакет нужно считать из буфера полностью! Либо сбросить буфер в ручную.
Если используется APPEND_STATUS, это добавить к входящему пакету значения RSSI и LQI, то эти два байта нужно учесть в регистре PKTLEN. Я этот режим не использовал, т.к. эти значения можно и так получить из регистров.
Если используется CRC_AUTOFLUSH, то перед считыванием пакета из буфера нужно определить количество байт в буфере. Для этого используем строб CC2500_SNOP | CC2500_READ_SINGLE. Если буфер пуст, то пакет пришел битым и его удалили.

Не соблюдение этих условий ведет к непредсказуемым глюкам.

Симптомы неправильно настроенного FEC:
— ничерта не работает.
— нет разницы, что с ним, что без него.

Если настроить правильно:
— помехоустойчивость резко возрастает, намного меньше приходит битых пакетов.
— пропускная способность снизалась чуть больше чем в два раза, в сравнении как без FEC. (пропускная способность а не скорость).

2.2) Режим TX-if-CCA.

Это просто винрарная фишка CC2500. По простому это передать пакет если канал свободен. Это практически полностью исключает коллизии.

Это работает следующим образом. Переводим трансивер в режим RX и начинаем пытаться его перевести в режим TX, если режим не поменялся то снова пытаемся и так пока не надоест или не достигнем успеха. В этом состоянии режим RX поменяется на TX только если канал свободен.

Для начало нужно настроить CCA. В регистре MCSM1 его включаем и тут же выбираем режим работы при котором канал будет считаться занятым:
— если RSSI ниже порога
— если пакет принимается
— если RSSI ниже порога или пакет принимается

Если для оценки занятости используется RSSI, то соответственно нужно установить порог. Делается это в регистре AGCCTRL1 поле CARRIER_SENSE_REL_THR.

Функция отправки пакета принимает следующий вид
//----------------------------------------------------------------------------------
	//  uint8 txSendPacket(uint8* data, uint8 length)
	//
	//  DESCRIPTION:
	//    Send a packet that is smaller than the size of the FIFO, making it possible
	//    to write the whole packet at once. Wait for the radio to signal that the packet
	//    has been transmitted.
	//
	//  ARGUMENTS:
	//    data   - Data to send. First byte contains length byte
	//    length - Total length of packet to send
	//
	//  RETURNS:
	//    This function always returns 0.
	//    1 - error 
	//----------------------------------------------------------------------------------
	char C_CC2500::SendPacket(uint8* data, uint8 length)
	{
		char status;
		
		WriteReg(CC2500_MCSM1,    0x3C); //always RX
		Strobe(CC2500_SIDLE);	
			
		// Write data to FIFO
		Strobe(CC2500_SFTX);		//clear fifo
		WriteFifo(data,length);

		Strobe(CC2500_SRX);		  //go to in RX mode
		callback_sleep(1);	
		
		for(char i=0;i<10;i++)
		{
			Strobe(CC2500_SFRX); //clear RX fifo 
			Strobe(CC2500_STX);  //use TX-if-CCA mode
			
			status=GetRxStatus();
			if ((status&CC2500_STATUS_STATE_BM)!=CC2500_STATE_RX)
			{
				status=0;
				break;
			}
                        status=1;
		}
		
		WriteReg(CC2500_MCSM1,    0x30); // after RX -> idle
		
		return status;		
	}//end SendPacket
	//======================================================================

Сначала выставляем режим постоянно RX, входим в состояние RX. В цикле важно постоянно сбрасывать буфер RX, если он заполнится то состояние RX останется и трансивер перестанет следить за несущей пока не освободится буфер.

Также не забываем дождаться завершения отправки пакета.

2.3) Wake on Radio (WoR).

WoR — это еще одна замечательная функция этого трансивера. Она позволяет добиться низкого энергопотребления и при этом постоянно находиться на связи.

Принцип работы прост. Трансивер сам периодически выходит из режима сна и слушает определенное время эфир. Если ничего нет, то снова возвращается в режим сна. Если, что-то получено то сигналит микроконтроллеру. Поэтому для использования этого режима нужно использовать хотя-бы один пин GDO и прерывание которое способно пробудить микроконтроллер.

Важно заметить. Сигнал от CC2500 длится 1.5-2 uS. Поэтому важно подобрать соответствующее прерывание. Например на меге прерывание INT по уровню не успевает сработать. Но асинхронное прерывания INT/PCINT успевают сработать.

Работать с ней довольно просто. Но только если режим WoR использовать для ожидания «Wake Up» пакетов.
Т.е. ждем активность на канале. Получили пакет Wake Up пакет и перешли в рабочий режим.

В этом случае нужно:
  1. Настроить время пребывания в режиме RX;
  2. Определить как часто просыпаться;
  3. Настроить пин GDO;
  4. Включить RC цепочку;
  5. Перейти в режим WoR.


Время прослушивания определяется в регистре MCSM2. Важно помнить, что минимальное время прослушивания зависит от частоты кварцевого резонатора. Минимальные значения указанны в даташите.

Частота выхода из сна определяется в регистрах WOREVT1 и WOREVT0 (старшая и младшая часть). Настраивается как и таймер, в регистрах указываем сколько тактов спать. В трансивере имеется генератор частоты на 32768 Гц. Но основан он на RC цепочке. Поэтому он сильно зависит от температуры. Есть возможность его откалибровать, это имеет смысл если имеется стабильная опорная частота.
Пин CDO нужно настроить на «if sync word found», записать значение 0x06. Важно знать, что трансивер может сработать на каждый чих. Т.к. он реагирует на часть синхрослова. Поэтому периодически бывают ложные срабатывания. Если прозеваем событие, то трансивер перейдет в Idle а микроконтроллер будет спать всегда.

RC цепочка включается в регистре WORCTRL.

В регистре MCSM0 можно оптимизировать энергопотребление в режиме WoR. Можно задать, чтоб калибровка проводилась не каждый раз а только каждый четвертый раз. Так можно сэкономить много энергии.

В конце сбрасываем таймер стробом SWORRST и стробом SWOR переходит в режим WoR. Теперь микроконтроллер может спать спокойно.

Вывести из сна устройство довольно просто. Во втором пункте мы определи задержку меду опросами. Например если у нас задержка 200 мс. Значит, для гарантированного пробуждения устройства нужно спамить пакетами эфир минимум 200мс.

Это самый простой случай. Но если требуется низкое энергопотребление и при этом нужно ловить все пакеты, то тут уже все усложняется. RC цепочку нужно обязательно калибровать. Т.к. будет идти работа с минимальными задержками. Определить длину синхрослова, от длинны зависит задержка между опросами.
Все эти моменты описаны в апнотах по режиму WoR. В апнотах приведены формулы по которым нужно рассчитывать минимальные задержки.

Мне этот трансивер очень сильно понравился. В нем еще осталось множество интересного функционала.
  • 0
  • 22 марта 2012, 00:07
  • a9d

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

RSS свернуть / развернуть
… на выводе GCOUPL должна стаять керамика 100nF. Но в реале нужно ставить керамику на 0.1uF.
А разве это не одно и тоже?
0
Хотя погоди. Это походу одно и тоже.
-1
Подправил статью.
0
А зачем было зачеркивать? Это интернет, текст тут можно удалять.
0
Я что-то пропустил в жизни, или 100nf — это и есть 0.1uF?
0
100* 10^-9 = 0.1*10^-6
0
Ну как бы да, я просто комменты не обновил, каюсь :)
0
Рассказывать об этом трансивере не буду, он и так очень известен
А мне неизвестен :) С удовольствием бы прочитал небольшой «рассказ» про этот трансивер на русском. Думаю, это было бы многим интересно
+5
+1, думаю приобщиться к беспроводному. Говорите он достаточно популярен…
0
Главное, не забыть написать про места, где можно купить готовые блоки-трансиверы с антеннами под DIP или smd пайку. :)
0
и цены
0
Лучше чуть переплатить и взять не отдельный трансивер, а SoC, типа cc1110, 2510 и т.п., во всяком случае, программатор-отладчик для 1110 делается довольно просто, а сам он запаялся обычным паялом (с терморегулятором, есессна) и завелся с первого раза. Схема и балун подчистую передраны из даташита… Кварц только к нему в сотку обошелся ((
0
Так воспользуйся гуглом. Статей очень много. Но не рассказано как пользоваться некоторыми функциями трансивера.
0
Хотелось бы здесь еще видеть схемы подключения микросхемы к МК, элементы обвязки, антенну…
0
  • avatar
  • Zov
  • 22 марта 2012, 11:52
А у меня уже три штуки запаяны и ни одни не работает. Проверить сигнал на GD0 не могу — осцила нету, так что туплю периодически в код.
За совет про резистор на SO — спасибо, попробую на досуге. Хотя скорее всего я спалил феном все чины :(
0
Добавил описание режима WoR.
0
  • avatar
  • a9d
  • 21 мая 2012, 03:57
Использовал СС1101 — ближный брат СС2500, но там конечно с согласованием антенны есть небольшие заморочки, поставил готовый балун и конденсатор — работает на ура. Интересует какую вы получили дальность используя этот чип эту антенну на плате. Когда экспериментировал с СС1101 пробовал керамическую антенну — дальность метров 5, поставил штырь 1/4 длины волны дальность в прямой видимости около 1 км, 100 м с помехами в виде стен и хорошо пробивает стены. при 9600 скорости, пакет 24 байта, частота 868МГц.
Вот думаю остаться на СС1101 или попробовать СС2500 — дальность нужна метров 20 не в прямой видимости.
0
Кстати вот, скоро жду 4 штуки. Будем пробовать.
-1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.