Очень интересный трансивер на 315/433/868/915МГц, фазовая, частотная и амплитудные модуляции, куча регистров настроек, управление по SPI, очень простая схема включения. Кому лень собирать ВЧ обвязку, есть микросборки типа PAN2355, там уже собрана ВЧ часть и кварц, остаётся только подать питание, подключить SPI и антенну.
На сайте Texas Instruments есть исходники под MSP430 и документация на английском. Но как обычно, когда получаешь такую игрушку в руки, хочется поскорее запустить её и посмотреть в работе, вот тут оказалось что русской документации на него не густо, и как следует для профессиональной техники, конкретных примеров нет.
Надеюсь своей статьёй немного восполнить этот пробел. Исходные данные: сс1101 с обвязкой по мануалу, на 433МГц, контроллер AVR и CodeVision.
Первое что приходит в голову подключиться к аппаратному SPI, но оценив что разводка платы усложнится, решил реализовать всё программно, т.к. работа SPI в режиме мастера очень простая.
void spi_init()
{
spi_cs = 1; // высокий уровень chip select, порт трансивера
// не активен. (cs_ask настроен на выход)
spi_miso = 1; // пулл ап, (spi_miso настроен на вход)
spi_mosi = 0; // мастер аут (spi_mosi настроен на выход)
spi_sck = 0; // spi_sck настроен на выход
}
Подпрограмма приёма-передачи по SPI:
char spi_rw(char write)
{
char i, read=0;
for(i=0;i!=8;i++)
{
spi_mosi = ( ((write<<i)&0x80)==0x80)?1:0;
delay_ms(1);
spi_sck = 1;
delay_ms(1);
read<<=1;
if(spi_miso) read|=1;
spi_sck = 0;
}
spi_mosi=0;
return read;
}
При работе за один такт передаётся и принимается один бит. Задержки взял заведомо очень большие чтоб не читать мануал)) Старший бит передаётся первым, это надо учитывать.
Далее следует инициализировать трансивер, программа для расчёта конфигурации SmartRF Studio есть на сайте ti.com. Самое главное что регистры нужно записывать в порядке выдаваемом этой программой, а не как следовало бы из человеческой логики, начиная с нулевого))
Чтобы не париться с порядком регистров я сделал таблицу:
const unsigned int rf_settings[]={0xAADD,0xAADD…};
где AA – адрес регистра, DD – данные которые необходимо в него занести. У меня получилось 34 регистра.
void cc_init()
{
char i;
spi_cs=0; // активируем порт, выбираем чип.
while(spi_miso); // ждём когда чип нам ответит, опустит miso
// rf_settings
for(i=0;i!=34;i++) // запись 34 регистров из таблицы
{
spi_rw(rf_settings[i]>>8); // adress
spi_rw(rf_settings[i]&0x00FF); // data
}
spi_cs=1; // отпускаем порт
//—————————————————
// тут можно было бы инициализировать paTable (см. мануал)
// но для моих целей она не потребовалась.
// поэтому сразу выдаю строб команду – переход в режим IDLE.
delay_ms(5);
cc_strobe(SIDLE);
return;
}
Строб – это команда трансиверу, сделать программный сброс, переключиться на приём или передачу, откалибровать генератор и т.п.
#define SIDLE 0x36 // ждущий режим
#define SRX 0x34 // приём
#define STX 0x35 // передача
#define SRES 0x30 // сброс
#define SNOP 0x3D // получить статусchar cc_strobe(char strobe)
{
char status;
spi_cs=0;
while(spi_miso);
// strobe
status=spi_rw(strobe);
delay_ms(1);
spi_cs=1;
return status;
}
При передаче строба (и при записи в регистр) трансивер передаёт байт статуса на текущей момент. SNOP–ом, можно просто получить статус. Подробнее о статус байте можно посмотреть в мануале.
Алгоритм работы с трансивером следующий:
- Настройка портов контроллера, инициализация SPI
- Конфигурация регистров трансивера
- Конфигурация paTable
- Строб команда – ждущий режим, приём или передача
- Дальше работа – синхронно, через буфер FIFO или асинхронно через порт GDO0.
Обсуждение и документация тут: http://forum.phreakerclub.com/showthread.php?p=427
Как всегда всё самое вкусное доступно после регистрации на форуме 🙂
(с) exchange
Клуб Фрикеров
www.phreakerclub.com