Ребят в сети кроме как под ардуино нет нормальной библиотеки для беспроводного модуля cc1101.
Ищу готовый пример работы модуля cc1101 для stm32. Пожалуйста, ткните кота носом в пример.
CC1101 STM32
Re: CC1101 STM32
Почитайте здесь как с этими модулями работать и напишите сами что Вам нужно.
http://radiokot.ru/circuit/digital/security/34/
В приложении к статье есть примеры. Они, правда, для другого ARM.
http://radiokot.ru/circuit/digital/security/34/
В приложении к статье есть примеры. Они, правда, для другого ARM.
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: CC1101 STM32
Всем привет!
Подскажите пожалуйста, как заставить данные передаваться?
Перечитал подобные ветки на форумах. Не могу понять, где ошибка.
Код инициализации из SmartRFStudio
В цикле делаю отправку. Вижу что 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 можно повторять.
Вот что в студии

Подскажите пожалуйста, как заставить данные передаваться?
Перечитал подобные ветки на форумах. Не могу понять, где ошибка.
Код инициализации из 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
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 с чипом, работающим на приём?
2. При подаче строба ТХ передатчику нужно какое-то время чтобы произвести калибровку генератора до начала передачи. Поэтому переходит он в режим передачи не сразу, и не следует повторно подавать ТХ строб. Что будет если подать ТХ несколько раз до завершения процесса передачи я не знаю, но это против правил.
3. Почему Вы решили, что ничего не передаётся? Может ничего не принимается? Это разные вещи. Передатчику нужно гораздо больше времени, чтобы передать пакет, гораздо больше чем у Вас период опроса его статуса. Поэтому считаю, что последний байт статуса 0х2F в приведённой осциллограмме это нормально и следует продолжать читать статус до тех пор пока снова не получите 0x0F, что соответствует возврату чипа в состояние IDLE, согласно конфигурации битов TXOFF_MODE.
4. Неясно как быстро выполняется цикл чтения CC1101_TXBYTES. После передачи payload передатчику нужно ещё время на передачу байтов CRC. Проще отследить конец передачи по падающему уровню на выводе GPIO0, сконфигурировав его как указано в моей статье выше.
5. Неясно зачем привели скриншот Studio и что хотите в ней увидеть? Подключён-ли к Studio CC-Debugger с чипом, работающим на приём?
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: CC1101 STM32
Спасибо за конструктив. Все заработало )))
Добавлено 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?
Добавлено 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
Если был принят пакет с неправильной CRC, то все его байты всё-равно загружены в фифо и фифо в этом случае следует очистить, поскольку чип это сам не делает. Лучше организовать приём как описано у меня в статье по ссылке выше.
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: CC1101 STM32
Спасибо, разобрался.
Еще вопрос. Мне нужно отслеживать факт сближения приемника и передатчика. Хочу это делать по величине RSSI.
Читаю значения RSSI (из фифо примерно такое же значение). При удалении (пересчет в dB из примера апноута касающийся RSSI) значение подскакивает (в отрицательную зону) и потом снова возвращается. Например, возле передатчика (метра 2 до него) показания были -154. При удалении они ушли до -170 и потом вновь возвратились к примерно -154. Не пойму, это АРУ отрабатывает? Не могу подобрать значение для регистра настройки АРУ для решения задачи. Такую идею возможно реализовать с этим чипом?
Еще вопрос. Мне нужно отслеживать факт сближения приемника и передатчика. Хочу это делать по величине RSSI.
Читаю значения RSSI (из фифо примерно такое же значение). При удалении (пересчет в dB из примера апноута касающийся RSSI) значение подскакивает (в отрицательную зону) и потом снова возвращается. Например, возле передатчика (метра 2 до него) показания были -154. При удалении они ушли до -170 и потом вновь возвратились к примерно -154. Не пойму, это АРУ отрабатывает? Не могу подобрать значение для регистра настройки АРУ для решения задачи. Такую идею возможно реализовать с этим чипом?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
Re: CC1101 STM32
Возможно, но следует учесть множественный приём пакета из-за отражений при перемещении. Может ешё что-то влияет. Следует усреднять RSSI.