Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

CC1101 STM32

Чт мар 17, 2016 23:37:37

Ребят в сети кроме как под ардуино нет нормальной библиотеки для беспроводного модуля cc1101.
Ищу готовый пример работы модуля cc1101 для stm32. Пожалуйста, ткните кота носом в пример.

Re: CC1101 STM32

Пт мар 18, 2016 01:00:44

Почитайте здесь как с этими модулями работать и напишите сами что Вам нужно.
http://radiokot.ru/circuit/digital/security/34/
В приложении к статье есть примеры. Они, правда, для другого ARM.

Re: CC1101 STM32

Сб дек 08, 2018 14:34:23

Всем привет!
Подскажите пожалуйста, как заставить данные передаваться?
Перечитал подобные ветки на форумах. Не могу понять, где ошибка.
Код инициализации из SmartRFStudio
Код:
vCC1101_LL_Disable(); // CS в лог.1
vCC1101_SpiSandStrobe(CC1101_SRES);  // Сброс чипа
HAL_Delay (100);                                     // для отладки
// Address Config = No address check
// Base Frequency = 867.999939
// CRC Autoflush = false
// CRC Enable = true
// Carrier Frequency = 867.999939
// Channel Number = 0
// Channel Spacing = 199.951172
// Data Format = Normal mode
// Data Rate = 49.9878
// Deviation = 25.390625
// Device Address = 0
// Manchester Enable = false
// Modulated = true
// Modulation Format = GFSK
// PA Ramping = false
// Packet Length = 20
// Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word
// Preamble Count = 4
// RX Filter BW = 101.562500
// Sync Word Qualifier Mode = 16/16 + carrier-sense above threshold
// TX Power = 12
// Whitening = false
//
// Rf settings for CC1101
//
vCC1101_SpiWriteRegister(CC1101_IOCFG2,0x29);        //GDO2 Output Pin Configuration
vCC1101_SpiWriteRegister(CC1101_IOCFG1,0x2E);        //GDO1 Output Pin Configuration
vCC1101_SpiWriteRegister(CC1101_IOCFG0,0x06);        //GDO0 Output Pin Configuration
vCC1101_SpiWriteRegister(CC1101_FIFOTHR,0x47);       //RX FIFO and TX FIFO Thresholds
vCC1101_SpiWriteRegister(CC1101_SYNC1,0x7A);         //Sync Word, High Byte
vCC1101_SpiWriteRegister(CC1101_SYNC0,0x0E);         //Sync Word, Low Byte
vCC1101_SpiWriteRegister(CC1101_PKTLEN,0x14);        //Packet Length
vCC1101_SpiWriteRegister(CC1101_PKTCTRL1,0x04);      //Packet Automation Control
vCC1101_SpiWriteRegister(CC1101_PKTCTRL0,0x05);      //Packet Automation Control
vCC1101_SpiWriteRegister(CC1101_ADDR,0x00);          //Device Address
vCC1101_SpiWriteRegister(CC1101_CHANNR,0x00);        //Channel Number
vCC1101_SpiWriteRegister(CC1101_FSCTRL1,0x06);       //Frequency Synthesizer Control
vCC1101_SpiWriteRegister(CC1101_FSCTRL0,0x00);       //Frequency Synthesizer Control
vCC1101_SpiWriteRegister(CC1101_FREQ2,0x21);         //Frequency Control Word, High Byte
vCC1101_SpiWriteRegister(CC1101_FREQ1,0x62);         //Frequency Control Word, Middle Byte
vCC1101_SpiWriteRegister(CC1101_FREQ0,0x76);         //Frequency Control Word, Low Byte
vCC1101_SpiWriteRegister(CC1101_MDMCFG4,0xCA);       //Modem Configuration
vCC1101_SpiWriteRegister(CC1101_MDMCFG3,0xF8);       //Modem Configuration
vCC1101_SpiWriteRegister(CC1101_MDMCFG2,0x16);       //Modem Configuration
vCC1101_SpiWriteRegister(CC1101_MDMCFG1,0x22);       //Modem Configuration
vCC1101_SpiWriteRegister(CC1101_MDMCFG0,0xF8);       //Modem Configuration
vCC1101_SpiWriteRegister(CC1101_DEVIATN,0x40);       //Modem Deviation Setting
vCC1101_SpiWriteRegister(CC1101_MCSM2,0x07);         //Main Radio Control State Machine Configuration
vCC1101_SpiWriteRegister(CC1101_MCSM1,0x30);         //Main Radio Control State Machine Configuration
vCC1101_SpiWriteRegister(CC1101_MCSM0,0x18);         //Main Radio Control State Machine Configuration
vCC1101_SpiWriteRegister(CC1101_FOCCFG,0x16);        //Frequency Offset Compensation Configuration
vCC1101_SpiWriteRegister(CC1101_BSCFG,0x6C);         //Bit Synchronization Configuration
vCC1101_SpiWriteRegister(CC1101_AGCCTRL2,0x43);      //AGC Control
vCC1101_SpiWriteRegister(CC1101_AGCCTRL1,0x49);      //AGC Control
vCC1101_SpiWriteRegister(CC1101_AGCCTRL0,0x91);      //AGC Control
vCC1101_SpiWriteRegister(CC1101_WOREVT1,0x87);       //High Byte Event0 Timeout
vCC1101_SpiWriteRegister(CC1101_WOREVT0,0x6B);       //Low Byte Event0 Timeout
vCC1101_SpiWriteRegister(CC1101_WORCTRL,0xFB);       //Wake On Radio Control
vCC1101_SpiWriteRegister(CC1101_FREND1,0x56);        //Front End RX Configuration
vCC1101_SpiWriteRegister(CC1101_FREND0,0x10);        //Front End TX Configuration
vCC1101_SpiWriteRegister(CC1101_FSCAL3,0xE9);        //Frequency Synthesizer Calibration
vCC1101_SpiWriteRegister(CC1101_FSCAL2,0x2A);        //Frequency Synthesizer Calibration
vCC1101_SpiWriteRegister(CC1101_FSCAL1,0x00);        //Frequency Synthesizer Calibration
vCC1101_SpiWriteRegister(CC1101_FSCAL0,0x1F);        //Frequency Synthesizer Calibration
vCC1101_SpiWriteRegister(CC1101_RCCTRL1,0x41);       //RC Oscillator Configuration
vCC1101_SpiWriteRegister(CC1101_RCCTRL0,0x00);       //RC Oscillator Configuration
vCC1101_SpiWriteRegister(CC1101_FSTEST,0x59);        //Frequency Synthesizer Calibration Control
vCC1101_SpiWriteRegister(CC1101_PTEST,0x7F);         //Production Test
vCC1101_SpiWriteRegister(CC1101_AGCTEST,0x3F);       //AGC Test
vCC1101_SpiWriteRegister(CC1101_TEST2,0x81);         //Various Test Settings
vCC1101_SpiWriteRegister(CC1101_TEST1,0x35);         //Various Test Settings
vCC1101_SpiWriteRegister(CC1101_TEST0,0x09);         //Various Test Settings
vCC1101_SpiWriteRegister(CC1101_PARTNUM,0x00);       //Chip ID
vCC1101_SpiWriteRegister(CC1101_VERSION,0x14);       //Chip ID
vCC1101_SpiWriteRegister(CC1101_FREQEST,0x00);       //Frequency Offset Estimate from Demodulator
vCC1101_SpiWriteRegister(CC1101_LQI,0x00);           //Demodulator Estimate for Link Quality
vCC1101_SpiWriteRegister(CC1101_RSSI,0x80);          //Received Signal Strength Indication
vCC1101_SpiWriteRegister(CC1101_MARCSTATE,0x01);     //Main Radio Control State Machine State
vCC1101_SpiWriteRegister(CC1101_WORTIME1,0x00);      //High Byte of WOR Time
vCC1101_SpiWriteRegister(CC1101_WORTIME0,0x00);      //Low Byte of WOR Time
vCC1101_SpiWriteRegister(CC1101_PKTSTATUS,0x00);     //Current GDOx Status and Packet Status
vCC1101_SpiWriteRegister(CC1101_VCO_VC_DAC,0x94);    //Current Setting from PLL Calibration Module
vCC1101_SpiWriteRegister(CC1101_TXBYTES,0x00);       //Underflow and Number of Bytes
vCC1101_SpiWriteRegister(CC1101_RXBYTES,0x00);       //Overflow and Number of Bytes
vCC1101_SpiWriteRegister(CC1101_RCCTRL1,0x00);//Last RC Oscillator Calibration Result
vCC1101_SpiWriteRegister(CC1101_RCCTRL0,0x00);//Last RC Oscillator Calibration Result


В цикле делаю отправку. Вижу что CC1101_TXBYTES с 4 изменяется на 0 (количество байт в TX FIFO).
но SmartRFStudio ничего не выдает.
Вот что на SPI шине в процессе формирования FIFO на передачу и запуск передачи
Изображение
Слева направо.
0х3F 0x03 - записал в TX FIFO первый байт (длина посылки)
0x7F 0x00 0x01 0x02 - (бит Brust установлен), разместил три байта данных
0xFA 0x00 - читаю что находится в CC1101_TXBYTES (ответ 0x04 байт) вроде все правильно
0x35 - посылаю строб TX
0x3D - NOP для чтения статуса (ответ 0х0F)
0х35 - снова строб TX
0х3D - NOP для чтения статуса (ответ 0х2F - бит режима TX установлен)

На следующем круге цикла я вижу что CC1101_TXBYTES пуст и цикл заполнения FIFO можно повторять.
Вот что в студии
Изображение

Re: CC1101 STM32

Сб дек 08, 2018 18:18:47

1. Неясно с какой целью выполняется засылка данных в FIFO в 2 этапа. Почему просто не включить burst и послать сразу все 4 байта: 0x0F 0x03 0x00 0x01 0x02? Но можно и как у Вас.
2. При подаче строба ТХ передатчику нужно какое-то время чтобы произвести калибровку генератора до начала передачи. Поэтому переходит он в режим передачи не сразу, и не следует повторно подавать ТХ строб. Что будет если подать ТХ несколько раз до завершения процесса передачи я не знаю, но это против правил.
3. Почему Вы решили, что ничего не передаётся? Может ничего не принимается? Это разные вещи. Передатчику нужно гораздо больше времени, чтобы передать пакет, гораздо больше чем у Вас период опроса его статуса. Поэтому считаю, что последний байт статуса 0х2F в приведённой осциллограмме это нормально и следует продолжать читать статус до тех пор пока снова не получите 0x0F, что соответствует возврату чипа в состояние IDLE, согласно конфигурации битов TXOFF_MODE.
4. Неясно как быстро выполняется цикл чтения CC1101_TXBYTES. После передачи payload передатчику нужно ещё время на передачу байтов CRC. Проще отследить конец передачи по падающему уровню на выводе GPIO0, сконфигурировав его как указано в моей статье выше.
5. Неясно зачем привели скриншот Studio и что хотите в ней увидеть? Подключён-ли к Studio CC-Debugger с чипом, работающим на приём?

Re: CC1101 STM32

Вс дек 09, 2018 08:19:59

Спасибо за конструктив. Все заработало )))

Добавлено after 5 hours 32 minutes 8 seconds:
Еще вопрос. Пытаюсь поднять прием. Проблема в том, что каждый раз принимается разное количество байт. Да еще и payload байты находятся, каждый раз, на разных позициях в массиве... .
Прием организовал так. настройка
vCC1101_SpiWriteRegister(CC1101_IOCFG0,0x07);// Asserts when a packet has been received with CRC OK. De-asserts when the first byte is read from the RX FIFO.
Настроил прерывания и как ловлю фронт из 0 в 1, читаю данные из фифо.
Вот в чем вопрос. Не могу понять откуда берутся куча "левых" байт в RXFIFO?

Re: CC1101 STM32

Вс дек 09, 2018 16:57:37

Если был принят пакет с неправильной CRC, то все его байты всё-равно загружены в фифо и фифо в этом случае следует очистить, поскольку чип это сам не делает. Лучше организовать приём как описано у меня в статье по ссылке выше.

Re: CC1101 STM32

Пн дек 17, 2018 16:00:00

Спасибо, разобрался.
Еще вопрос. Мне нужно отслеживать факт сближения приемника и передатчика. Хочу это делать по величине RSSI.
Читаю значения RSSI (из фифо примерно такое же значение). При удалении (пересчет в dB из примера апноута касающийся RSSI) значение подскакивает (в отрицательную зону) и потом снова возвращается. Например, возле передатчика (метра 2 до него) показания были -154. При удалении они ушли до -170 и потом вновь возвратились к примерно -154. Не пойму, это АРУ отрабатывает? Не могу подобрать значение для регистра настройки АРУ для решения задачи. Такую идею возможно реализовать с этим чипом?

Re: CC1101 STM32

Вт дек 18, 2018 02:43:18

Возможно, но следует учесть множественный приём пакета из-за отражений при перемещении. Может ешё что-то влияет. Следует усреднять RSSI.
Ответить