SoC CC2510

С недавних пор я начал активно знакомиться с продукцией Ti. А особенно с NFC/RFID, BLE, bqTESLA, RF и ZigBee.

Сейчас я расскажу о SoC CC2510. Это мое личное мнение, но он показался мне наркаманским (оказалось вся серия SoC CCxxxx такая). Долбит как ширка спидбол =)
Вам может показаться, что я активно обарываю этот чип. Но это не так.



1 Средства разработки
Для разработки прошивки нам предлагают использовать IAR (говорят он хорошо взломан и его легко достать ;) ). По сути ничего другого и нет.
У IAR очень плохой редактор кода. Но это легко решается. Берем эклипс и создаем поверх IAR-кого проекта свой. Код пишем в эклипсе а собираем и отлаживаем в IAR.

С хардваной частью тоже довольно все просто. Нужен программатор CC-DEBUGER или его клон. Но лучше купить CC2510DK-MINI, так в придачу получите два модуля. Не помешает прикупить и сниффер CC2511EMK(очень полезная вещь).

ВНИМАНИЕ: С недавних пор эту продукцию нельзя купить на estore.ti

Дебаггер работает прямо из коробки. Его достаточно воткнуть и выбрать. Все. Никакого гемороя с прикручиванием нет. Трассировка работает очень быстро. На фоне него ST-Link выглядит эстонцем.
Из недостатков деббагера:
— поддерживает только три точки;
— режимы сна нельзя отлаживать;
— частота тактирования SoC должна быть 26 — 13 Mhz.

Для конфигурации SoC и обновления прошивки дебаггера нам предлагают использовать SmartRF Studio 7. Кстати очень удобная вещь. Позволяет быстренько сгенерить конфиги для трансивера.

Также есть примеры кода.

ВНИМАНИЕ: Примеры кода с экономят вам кучу нервов. Кстати вам нужно обзавестись стальными нервами. Они вам пригодятся.

2 Берем чип

Чип очень маленький. Но у него пины торчат по бокам. Так, что его легко припаять даже паяльником. Обвязки требуется очень мало. Нужен только кварц на 24-27 Мгц и, по необходимости, балун на дискретных элементах. Вся нужная рассыпуха есть на eBay.

Ti порадовало нас огромным количеством апнотов. Расписано почти все в мельчайших подробностях. Также не забываем заглянуть на страничку с CC2500. Т.к. именно этот трансивер встроен и нас интересуют и его апноты.

ВНИМАНИЕ: Это не ZigBee. Во многих магазинах указывается, что это ZigBee чип.

Для отладки требуется всего два провода. НООО для установки прошивки нужен SPI.

Эрата очень чистая. Там всего две записи и они не критичны! Для их исправления нужно, в некоторых прерывания, вручную сбрасывать флаги.
Кстати обе записи касаются энергопотребления и RF. Основные функции SoC ССхххх =)

3 Знакомство

Все начинается с тактирования. Нам нужно выбрать частоту тактирования и источник. У нас на выбор кварц и HI RC. Также есть low RC или внешний часовой кварц(по факту не особо и нужен, RTC все равно нет).

Ну что-ж смотрим. И замечаем очень крутую вещь. Таймеры и ядро тактируются отдельно! Это очень круто! Мы можем в любой момент менять частоту тактирования ядра(а также источник) и это никак не отразиться на таймерах и ШИМ. Но следует помнить, что частота тактирования таймеров всегда должна быть равна или ниже частоты тактирования ядра.

Ок. Дальше видим, что RC калибруется автоматически от внешнего кварца… Хммм… Зачем эта функция? Ведь трансивер работает только от внешнего кварца… Забегая на перед скажу. О да!!! Эта функция нам очень нужна.

Диапазон делителей у нас от 1 до 127. Кстати, у таймеров два делителя. Общий и индивидуальный. Благодаря этому у одного из таймеров можно выставить частоту 1.5 Гц.
Менять делитель можем в любое время...(Здесь Ti тоже нам подарила свинку. Чуть ниже узнаем какую)

В примерах смотрим как настраивать источник и делитель. Все очень простенько.

Тут сразу и приводится график. При тактировании от кварца чип жрет на 1ма больше! Хм, почему… Об этом ниже.

Про low RC я молчу. Он выбран по дефолту. Работает всегда, делителей нет и мне его хватало с головой.
Ощущения: Довольно продуманый чип.

4 Пины

Настроили тактирование пора взяться и за пины. Топаем в раздел по I/O. Читаем.

На всех пинах есть внешние прерывания, но только на спад и возрастание фронта. У почти всех пинов есть две альтернативные функции. Максимальный ток 4ма. И есть два специальных пина на которых нет Pull-UP/Pull-Down резисторов. Но эти пины могут давать ток 20ма. Они предназначены для светодиодов, с помощью ШИМ можно регулировать яркость.

Кстати в Ti старались сохранить максимальную совместимость по пинам во всей серии CCxxxx. Некоторые чипы полностью совместимы, некоторые частично.

Ощущения: Очень приятно.

Лезем в регистры настройки пинов… И вот она первая страшная правда!!! Вот какой гад так делает??
— Pull-Up/Pull-Down можно выбрать для каждого пина. Но что именно будет Pull-Up или Pull-Down
выбирается только для целого порта! Хотите на отдельно взятом пине свой конфиг? Так переводите его в Z состояние и вешайте внешний резистор.
— Прерывание на каждом пине. НООО… настраивается оно не для одного пина а для целой группы пинов. Т.е. включить прерывание мы можем на одном пине, но настроить реагирование на наростание/спад можем только для группы. Это очень неудобно!

ВНИМАНИЕ: Пины очень легко спалить. Это вам не АВР.

Ощущения: За, что ??? Ведь было все так прекрасно.

5 Прерывания

После настройки пинов я начал настраивать на них прерывания. И тут еще один удар! И это касается абсолютно всех прерываний.

Для настройки какого либо прерывания нужно выставить over 9000 флагов. Причем эти флаги разбросаны по разным регистрам! Более того они описаны в разных разделах даташита! Некоторые флаги даже дублируются(они реально дублируются)! Забыли, что-то выставить и ничего работать не будет.
Ок. Настроили прерывание и тут узнаем, что после срабатывания прерывания нам нужно обязательно сбросить over 9000 флагов!!! И некоторые ПЛЯ снова дублируются! И они снова разбросаны по разным регистрам!

Помните я выше говорил про примеры кода? Качаем обязательно. Они жизненно необходимы.

Ощущения: Какой идиот такое выдумал??? Очень задалбывает!
6 Периферия. Таймеры.

Таймеры как таймеры. На первый взгляд ничего особенного… Но помним, мы имеет отношение с драгдиллером Ti. Не расслабляемся.

Помните AVR? Настроили таймер и мы умеем работать со всеми таймерами. Так вот Ti сделали круче. Каждый таймер разный и по каждому можно написать статью. Все таймеры различаются, некоторые таймеры специальные.

Timer 2 для ОС. Timers 3 и 4 для общего назначения. А Timer 1 для измерения технических задержек RF и еще кучи функций.
Sleep Timer для сна, но с весьма специфичным выбором делителя(разрешения).

Такое ощущение, что каждый таймер разрабатывала отдельная команда.

Ощущения: Слава богу есть примеры по каждому таймеру!

7 Периферия. АЦП.

АЦП у нас 12ть битное. И не просто АЦП а сигма дельта АЦП! Более того. Есть интересная особенность. Это экспресс измерение. Для настройки и произведения замеров достаточно записать значения всего в один регистр, и уже в прерывании мы получаем ответ. Очень удобно.

У нас есть 1.25V опора. Также в любой момент времени можем узнать какое сейчас напряжения питания. Но за это мы расплачиваемся тем, что у нас постоянно(в цепи питания) весит делитель напряжения. Этот делитель, даже если мы его не используем жрет 200uA.

Разрешения АЦП можно выбирать 7,9,10,12 бит. Но тут-же узнаем, что старший бит знаковый!

Также имеется, датчик температуры. После калибровки который дает весьма точные результаты (читаем апнот).

Ощущения: Ti не забыло про свои качели. Скачало обрадовало а после начала разочаровывать.

8 Периферия. Псевдо генератор случайных чисел.

Т.к. у нас есть AES ускоритель, то и генератор случайных чисел должен быть. В данной модели стоит псевдо(в некоторых стоит True Random). У этого генератора есть две функции:
— подсчет CRC16;
— генерирования случайного числа.

Генератор случайных чисел важно активизировать чем нибудь рандомным. Для этого я использовал значение Sleep Timer, т.к. он работает всегда без останова.

Ощущения: Хмм… А где подвох?

9 Периферия. AES.

Тут все просто. Настраиваем DMA и ключ. Все!

Ощущения: Простенько и со вкусом. Круто!

10 Периферия. WDT.

Умеет работать в двух режимах:
— WDT;
— таймер.

С таймером как и в AVR. Генерируется прерывание а там мы и решаем, что делать дальше.

А вот с WDT немного сложнее. После активации этого режима, его выключить невозможно (и правильно). Сбросить в прерывании его невозможно (тоже правильно). Сброс таймера весьма специфичен, делается в два этапа (защита от случайного сбоя).
Останавливается только во время сна.

Максимальная задержка 1с.

Ощущения: Хорошо подошли к делу. Многое предусмотрели.

11 Периферия. DMA.

Вот этого не хватало в AVR. У нас целых 5ть каналов! Зачем так много… не знаю. Мне хватило двух.
Штука очень удобная. Команды в стиле «Копаем от сих до сих». Куча тригеров для срабатывания.

Проблем с DMA у меня не было.

Ощущения: Супер!.. Блин… А куда косяки делись?

12 Периферия. Sleep Timer.

Тут и говорит нечего. Говорим сколько спать и спим. При этом потребление будет 0.5 uA (я добился только 4uA).

13 Периферия. Режимы сна

Вот мы и добрались до них. А их у нас всего 4-ре:
— PM0 — работает все кроме ядра. Минимальное потребление 1ма. Что???? Почему? Ответ ниже.
— PM1 — все выключено кроме BOD, Sleep Timer и внешних прерываний. Потребление чуть больше 200uA. Помним про делитель напряжения.
— PM2 — работает только Sleep Timer и I/O. Потребление 0.5uA.
— PM3 — работает только I/O. Потребление 0.3uA.

Вот и начали экспериментировать с режимами сна. И тут бац! Видим, что потребление в режиме PM0 аж 4ма!!! Почему так много?? Лезем в даташит и читаем. Видим, что SoC имеет модульную структуру. Абсолютно все разбито на модули. И тут узнаем, что в режиме PM0 выключается только ядро! А оно жрет всего 0.3ма.
Абсолютно вся периферия продолжает работать и выключить мы ее не можем! Такой функции почему-то нет. Почему ее нет??? Вот 100500 флагов прерываний добавили а один флаг для выключения периферии нет!

Вот она качеля… Мы снова перешли в состояние НЕНАВИЖУ.

Ок. Новость номер два! Узнаем, что все этим модули тактируются от таймеров или ядра. И единственен способ хоть как-то серьезно снизить потребление, это выбрать максимальный делитель частоты! Теперь поняли зачем нам постоянно менять частоту?? А ее нам придется менять каждые 1-5 секунд(это при батарейном питании)!
Ti нас ставит перед этим фактом и не дает никакой альтернативы.
И так. Для перехода в режим PM0 нужно выбрать максимальный делитель и уснуть.

И… еще больше ненависти. Процессор повис. Оказывается, если некоторая периферия активна, то мы не можем ставить максимальный делитель. АЦП, FEC, AES, DMA зависят от частоты тактирования. За нарушение, SoC вешается. Так, что не забываем учитывать это.

Ок. Все учли… Периферия простаивает, делитель максимальный и SoC жрет 2ма! Что??? Леземе в даташит. Узнаем, что даже в Idle трансивер жрет 1ма. И единоверный способ его усыпить, так это перейти на тактирование от RC цепочки!
Теперь вы поняли зачем нужна функция автоматической калибровки RC цепи? Вы будите 100500 раз менять источник тактирования! НУ ЗА ЧТО??? Зачем такие удобства??? Я ведь его любил!

Даже в CC2500 есть разные режимы сна. Это Idle, Sleep Timer, Отключения тактирования и deep sleep. Куда это все делось в SoC ???

И даже если мы учтем и это, то микроконтроллер будет потреблять 1ма! Кстати если код будет выполняться из оперативки, то не имеет значения где вы находитесь в Idle или вертитесь в пустом цикле.
А все благодаря модульной структуре и херовой организации.

Ощущения: Гады. А ведь могли слепить конфетку.

14 Периферия. Трансивер

Тут сказать особо нечего. Ведь встроен CC2500 а по нему информации и так дофига. Все тоже самое, но есть дополнительные прерывания. Довольно удобные. Также, благодаря DMA мы можем принимать и отправлять большие пакеты без труда. Напомню в CC2500 потолок 64байта а дальше немного гемора.

Ощущения: Трансивер хороший. На него не жаловался.

15 Регистры которые сбрасываются

О, да! Есть тут и такое счастье. После выхода из режимов сна PM1-3 некоторые регистры сбрасываются. Их нам нужно восстанавливать. Прям RTOS какой-то. Вот зачем такие радости???
Внимательно следим за регистрами которые используем. Так, как вы обязательно использовать такие.

Также есть секция XDATA. Она обнуляется. Но мы сами решаем использовать ее или нет. Эту секцию удобно использовать для буферов.

16 Ядро

Ну 51е ядро приятное. Асм очень прост. Код можно выполнять из оперативки. Можно настраивать приоритеты прерываний (четыре уровня).

Также ядро может работать в двух режимах:
— кэш включен. Команды выполняются из кэша. При этом достигается высокая производительность и более низкое энергопотребление. Но тайминги не предсказуемы.
— кэш выключен. Команды выполняются из флеш памяти. Тайминги предсказуемы энергопотребление повышенно, производительность снижена.

Заключение

Это самый запоминающийся чип с которым я работал. Однозначно. Чип с характером. Это как машина Lancia. Вроде хороша, но ломается даже если стоит.

Как говаривал Джереми Кларксон про инженеров из Lancia: «Ммм. Мы разработали хорошую машину. Но давайте добавим немножечко магии.»

Так вот. Инженеры из Ti наверняка говорили «Ммм. Гениальная идея, но давайте сделаем ее через жопу. Вдруг получиться еще лучше.». По другому я не могу объяснить все эти особенности.

Именно поэтому он хороший =)

ЗЫ: про мелкие кочельки я промолчал. Их дофига.
  • +8
  • 07 августа 2012, 06:38
  • a9d

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

RSS свернуть / развернуть
Плюсанул.
Интересно было почитать…
Еще бы ссылочки где оно сейчас достается, если на E-store нету, ну и на доки с примерами… :P
0
По СНГ фирма Сканти Рус. У них наценка 30%.
0
Вам может показаться, что я активно обарываю этот чип.
Не, мне показалось что ты активно употребляешь. Что речь про чипы сразу и не вкурить. :)
0
Помните AVR? Настроили таймер и мы умеем работать со всеми таймерами.
Да вот ну нифига. В арв надо отдельно каждый таймер каждого чипа читать.

Ну и примеры кода не помешали бы. А то слов про код много, а ничего и нет.
0
В CC2510 все тайменры сильно различаются. И там различия на порядок круче чем в АВР.

Примеры кода есть официальные. Они весьма хорошие.
0
В примерах смотрим как настраивать источник и делитель. Все очень простенько.
Да-да, в примерах от LPC всё действительно кристально ясно.
Тут сразу и приводится график.
Офигенный график, заценил. только вот милиапмера там и нет, в даташите на мегу8.
Для настройки какого либо прерывания нужно выставить over 9000 флагов.
Да ну. по докам стм8 достаточно установить один только флаг разрешения прерывания.

Ну а теперь по нормальному. У вас в статье слишком много слов про доки и код. Но ни одной строки кода и даже ссылки ни на сам код, ни на доки. Вы вроде как описываете детальку, но предлагаете каждому самому залезть на сайт, найти там, скачать и перечитать сотни страниц манов и тысячи строк кода.
Смысл тогда было так подробно расписывать? Напишите просто «чип говно, подробности в доках и примерах» и будет ровно тот же эффект — субъективный набор символов (зато гораздо меньше по объёму).
Дайте несколько примеров кода в тексте статьи (отражающих суть написанного) — это позволит каждому конкретному человеку сравнить для себя что есть «over 9000 флагов» и на сколько просто задается тактирование.
На текущий же момент это больше похоже на «заметки пьяного радиолюбителя» нежели на обзор детальки.
+1
А вот в стм они все и правда почти одинаковые
0
Интересно, будет ли аппаратный AES создавать трудности с покупкой из-за границы. STM32F4, например, фактически состоит из двух подсемейства (40x и 41x), отличающихся только наличием аппаратной криптографии, вероятно для того, чтобы обойти всякие ограничения на экспорт/импорт.
0
  • avatar
  • Thorn
  • 07 августа 2012, 12:42
Вот это и создает проблемы.
0
Хорошая статья! У меня тут тоже трансиверы валяются от Atmel AT86RF231-ZF. Не понял что такое балун и зачем он нужен, у вас в статье он тоже вспоминается.
Я бы на вашем месте еще бы добавил картинок и примеров кода, так повышается усвоение материала и он просто становится интересным.
0
Не понял что такое балун и зачем он нужен, у вас в статье он тоже вспоминается.
Видимо, у чипа симметричный RF-вход/выход, как у MRF49. Для подключения к такому несимметричной антенны (распространенные антенны типа «четвертьволновой вибратор», «патч-антенна», «F-антенна» и «чип-антенна») нужен преобразователь симметричного сигнала в несимметричный. Это и есть балун.
+1
Balanced — Unbalanced = BALUN.
VGA написал для чего.
0
А есть может ссылочка на ебей, или какой запрос писать на покупку этого балуна ???
0
Покупается не балун а расыпуха для него. Точнее индуктивность 1.2 nH. Там-же можно и керамикой затариться. Но ее уже дешевле брать у местных.
0
Это схема, а не деталь (хотя иногда балуны мастерят из кусков коаксиального кабеля, но тут удобней схему собрать). Так что нужно выбирать подходящую схему балуна и покупать детальки под нее. Индуктивность, кстати, можно и намотать, там обычно считанные витки толстого провода без каркаса.
0
Можно сделать печатный меандр. Будет тоже самое. Но тогда будет сильная зависимость от температуры. Собственно китайцы любят лепить меандры а не копеечные индуктивности.
0
Китайцы как раз обычно согласователи делают из SMD-компонентов. Печатным меандром у них только сами антенны сделаны. Ну, по крайней мере, на виденных мной платах, но я их не так уж мало видел, в том числе предельно дешевых.
0
Вот про это я и говорил. Так как такое прикупить на ебей??
0
А оно тебе надо? Есть балуны которые заменяют все дискретные элементы. Но они стоят на порядок выше и на них теряется 0.5 dBi.
0
никак
0
  • avatar
  • x893
  • 07 августа 2012, 16:48
Тема статьи интересна, за нее спасибо. Но исполнение ужасно. "Апора" — добило.
0
  • avatar
  • _YS_
  • 07 августа 2012, 23:09
Добрался до данного чипа, на али есть недороги платки с его участием, а на сайте TI нашёл ссылку на BLE-stack. Но простому смертному скачать его не дают, типа я могу радиоуправляемую ракету сделать, управляемую по этому стеку и всё такое. В общем если кто сможет поделиться стэком, дайте знать.
0
  • avatar
  • mws
  • 07 января 2014, 15:31
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.