Программирование радиомодуля PAN 2355
В последнее время многие российские разработчики беспроводных сенсорных систем останавливают свой выбор на радиомодулях, использующих приемопередатчики Texas Instruments из линейки Chipcon, в частности, радиомодулях ISM диапазона PAN 23хх. Это связано с тем, что модули PAN 23хх надежны, просты в использовании, не требуют усилий в изготовлении радиочастотных цепей, характеризуются очень малыми размерами(PAN 2355 - 8х8,2х2 мм) и невысокой стоимостью.
Внутренняя архитектура и основные технические характеристики PAN 2355 подробно описаны в работе [1]. Однако в вопросах практического применения и особенно программирования радиомодулей существует определенный пробел, несмотря на появление на сайте http://www.ti.com/ библиотеки функций для работы с ССххх0. В статье излагается практическое применение этих функций, адаптированных для микроконтроллера MSP430F1232A.
Рассмотрим автономную беспроводную радиосистему сбора данных с двух температурных датчиков с линейным выходом по напряжению 0...3 В. Основные характеристики системы следующие:
- дальность 30 м на открытом пространстве;
- мощность передатчика 10 мВт;
- скорость передачи 115 кБит/с;
- метод модуляции - MSK;
- CRC - контроль.
На рис. 1 и рис. 2 приведены схемы передатчика и приемника соответственно.
Рис. 1. Схема передатчика системы сбора данных
Рис. 2. Схема приемника системы сбора данных
Алгоритм работы системы заключается в следующем.
Датчики подключены к каналам АЦП А6 и А7 микроконтроллера MSP430F1232A передатчика, который попеременно их включает на 2 мс со скважностью 1:1000. Считанные из буферов АЦП А6 и А7 данные усредняются за время 30 с и результат (1 байт/канал) передается в модуль PAN 2355, сконфигурированный в режим ТХ. На приемном конце аналогичный радиомодуль, сконфигурированный в режим RХ, транслирует полученные данные в микроконтроллер, который через UART-порт по интерфейсу RS-232 передает информацию с датчиков в COM порт ПК. Радиомодули PAN 2355 подключены к микроконтроллерам через 3-проводной интерфейс SPI.
Для комфортной работы с модулем желательно использовать еще две линии - GDO0 и GDO2.
Всего в трансивере используется 47 конфигурационных регистров. Значения некоторых из них (примерно 12) можно оставить по умолчанию. Для расчета параметров конфигурации можно воспользоваться Data Sheet на микросхему СС1100, но лучше это сделать с помощью программы SmartRF_Studio, которую можно бесплатно скачать с сайта http://www.chipcon.com/. При передаче сигнала по интерфейсу SPI используется аппаратный модуль микроконтроллера MSP430F1232A.
Собственно программа передачи/приема данных с использованием PAN 2355 состоит из вызывов следующих основных функций: конфигурации SPI-интерфейса MSP430F1232A, первоначального сброса модуля, функции записи конфигурационных параметров, функции записи стробов, функции передачи байта и функции приема байта. Функция установки конфигурационных параметров радиомодуля должна вызываться после функции сброса модуля. Шестнадцатеричные адреса регистров конфигурации приводятся в документации на СС1100, также можно воспользоваться заголовочным файлом TI_CC_CC1100 - CC2500.h, приведенным в библиотеке функций для работы с Chipcon.
Рассмотрим эти функции:
Функция конфигурации SPY модуля MSP430F1232A
Модуль должен быть сконфигурирован в режим Master.
void TI_CC_SPISetup(void)
{
TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN; // P3.0 -> OUT
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
ME2 |= USPIE0;
UCTL0 |= CHAR + SYNC + MM;
UTCTL0 |= CKPL + SSEL1 + SSEL0 + STC;//SPI 3-pin mode
UBR00 = 0x02; // UCLK/2 -> 115kHz
UBR10 = 0x00;
UMCTL0 = 0x00;
UCTL0 &= ~SWRST;
}
Функция сброса модуля void TI_CC_PowerupResetCCxxxx(void)
{
//********** 1->0->1***********************
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
Delay1(1);
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
Delay1(1);
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
Delay1(1);
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
// ожидание события SOMI = 0
while(TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
U0TXBUF = TI_CCxxx0_SRES; // Строб сброса
IFG2 &= ~URXIFG0; // Сброс флага
// ожидание окончания пересылки строба
while (!(IFG2&URXIFG0));
while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI); TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
}
Функция конфигурации PAN 2355 void writeRFSettings(void)
{
// Запись установочных значений
// GDO0 , GDO2 - вывод
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06);
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06);
// Длина пакета данных - 1 байт
TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN, 0x01);
// Автоматический контроль пакета без проверки адреса
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1, 0x04);
// CRC - контроль включен
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0, 0x05);
// Адрес устройства -0
TI_CC_SPIWriteReg(TI_CCxxx0_ADDR, 0x00);
// Номер канала -0
TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR, 0x00);
// Настройка синтезатора частоты
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1, 0x0B);
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0, 0x00);
// Задание базовой несущей частоты
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2, 0x21);
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1, 0x62);
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0, 0x76);
// Настройка модема
// ФНЧ демодулятора - 203 кГц
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4, 0x2С);
// Скорость передачи 115 кбит/с
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3, 0x22);
// Длина слова синхронизации - 32 бита, MSK модуляция
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2, 0x73);
// Длина преамбулы 4 байта, FEC отключен
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1, 0x22);
// Полоса канала - 199.95 кГц
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0, 0xF8);
// Установка мощности передатчика - для paTable[ ]={0xC3} составляет 10 мВт (см. Data Sheet на микросхему СС1100)
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE,paTable, 1);
// Завершение конфигурации RX
TI_CC_SPIWriteReg(TI_CCxxx0_FREND1, 0xB6);
// Завершение конфигурации TX
TI_CC_SPIWriteReg(TI_CCxxx0_FREND0, 0x10);
//Функции конфигурации автомата контроля радио (по умолчанию)
TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2, 0x07);
TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1, 0x3F);
TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0, 0x18);
// Компенсация сдвига частоты
TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG, 0x1D);
// Конфигурация битовой синхронизации
TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG, 0x1C);
// Параметры малошумящих усилителей и порог компаратора
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0xC7);
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x00);
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0, 0xB2);
// Параметры калибровки синтезатора
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3, 0xEA);
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2, 0x0A);
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1, 0x00);
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0, 0x11);
// Приведенные ниже настройки изменять не рекомендуется
TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST, 0x59);
TI_CC_SPIWriteReg(TI_CCxxx0_TEST2, 0x88);
TI_CC_SPIWriteReg(TI_CCxxx0_TEST1, 0x31);
TI_CC_SPIWriteReg(TI_CCxxx0_TEST0, 0x0B);
// Остальные настройки по умолчанию
}
Функция записи строба void TI_CC_SPIStrobe(char strobe)
{
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
U0TXBUF = strobe;
IFG2 &= ~URXIFG0; // Сброс флага
while (!(IFG2&URXIFG0));
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
}
Функция передачи байта
Данные передаются по адресу TI_CCxxx0_TXFIFO(0x3F). После записи стробов целесообразно вводить небольшие временные задержки примерно 35 мкс.
void RFTransmitter(char txBuffer)
{
// Сброс TX_FIFO
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
Delay1(1); // задержка после записи строба
TI_CC_SPIWriteReg(TI_CCxxx0_TXFIFO,txBuffer);
Delay1(1);
// Строб включения режима TX
TI_CC_SPIStrobe(TI_CCxxx0_STX);
Delay1(1);
// Ожидание окончания передачи байта
while(TI_CC_GD02_PxIN&TI_CC_GD02_PIN);
// Сброс TX_FIFO - обязательно.
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
Delay1(1);
// Выход из режима TX_FIFO
TI_CC_SPIStrobe( TI_CCxxx0_SIDLE);
}
Функция записи пакета данных
Все пересылки между контроллером и модулем PAN 2355 начинаются с адресного байта, содержащего 6-битный адрес требуемого регистра, бит burst - доступа и бит чтения/записи. Байты данных следуют после адресного байта. Если burst-бит установлен, то байтов данных может быть несколько. Передача ведется старшим битом вперед.
Addr - адрес регистра, *buffer - указатель массива байтов, count - размер массива
void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
{
char i;
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
// Выставляем адрес нужного регистра
U0TXBUF = addr | TI_CCxxx0_WRITE_BURST;
while (!(IFG2&UTXIFG0));
for (i = 0; i < count; i++)
{
U0TXBUF = buffer[ i ]; //Пересылка данных
while (!(IFG2&UTXIFG0));
}
IFG2 &= ~URXIFG0; // Сброс флага
while(!(IFG2&URXIFG0));
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
}
Функция записи байта по адресу addr void TI_CC_SPIWriteReg(char addr, char value)
{
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
IFG2 &= ~URXIFG0;
// Выставляем адрес нужного регистра
U0TXBUF = addr;
while (!(IFG2&URXIFG0));
IFG2 &= ~URXIFG0; // Сброс флага
U0TXBUF = value;
while (!(IFG2&URXIFG0));
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
}
Функция приема байта
Байт данных считывается из RX_FIFO по адресу addr = TI_CCxxx0_RXFIFO (0xBF).
char RFResiver(char addr)
{
char z;
// Сброс RX_FIFO
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
Delay1(1); // задержка после записи строба
// Строб включения режима RX
TI_CC_SPIStrobe(TI_CCxxx0_SRX);
Delay1(1);
// Ожидание приема байта(GD02 -> 1)
while(!(TI_CC_GD02_PxIN&TI_CC_GD02_PIN));
// Считывание байта данных
z =TI_CC_SPIReadReg(addr);
// Сброс RX_FIFO - обязательно.
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
Delay1(1);
// Выход из режима RX_FIFO
TI_CC_SPIStrobe( TI_CCxxx0_SIDLE);
return z;
}
Функция считывания байта
Сначала передается адрес регистра, из которого нужно прочитать данные, затем посылается нулевой байт, чтобы считать данные.
char TI_CC_SPIReadReg(char addr1)
{
char x;
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // CSn = 0
while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
// Установка адреса
U0TXBUF = (addr1 | TI_CCxxx0_READ_SINGLE);
while (!(IFG2&URXIFG0));
IFG2 &= ~URXIFG0; // Сброс флага
// Передача нулевого байта
U0TXBUF = 0;
while (!(IFG2&URXIFG0));
// Считывание байта из буфера
x = U0RXBUF;
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // CSn = 1
return x;
}
Определение переменных, используемых в приведенных функциях (применительно к микроконтроллеру MSP430F1232A):
#define TI_CC_CSn_PxOUT P3OUT
#define TI_CC_CSn_PxDIR P3DIR
#define TI_CC_CSn_PIN 0x01 //P3.0
#define TI_CC_SPI_USART0_PxIN P3IN
#define TI_CC_SPI_USART0_SIMO 0x02 //P3.1
#define TI_CC_SPI_USART0_SOMI 0x04 //P3.2
#define TI_CC_SPI_USART0_UCLK 0x08 //P3.3
#define TI_CCxxx0_PATABLE 0x3E
#define TI_CC_GD02_PIN 0x01 //P2.0
#define TI_CC_GD02_PxIN P2IN
#define TI_CCxxx0_PATABLE 0x3E
Программа для дистанционной системы сбора данных, созданная с использованием приведенных выше функций, показала устойчивую работу в реальных устройствах и может быть использована для работы с трансиверами СС11хх - СС2500. При разработке программы были также использованы материалы[2].
Литература
1. Приемопередатчики PAN 2355./ Беспроводные технологии №4, 2007 г.
2. Семейство микроконтроллеров MSP430x1xx. Руководство пользователя./ «Библиотека Компэла».
Получение технической информации, заказ образцов, поставка -
e-mail: [email protected]