Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

Re: TI - CC1101 или СС112?

Чт окт 08, 2020 02:56:56

Не понял про какой кварц идёт речь. Если про тот, что у радио-чипа, то конденсаторы к нему не нужны, поскольку внутри радио-чипа имеются. А так, похоже, Вас можно поздравить с успехом.

Re: TI - CC1101 или СС112?

Чт окт 08, 2020 04:37:26

Ну как поздравить? Кварц-то не запускается. Добавляю лишнюю емкость в виде руки или провода - есть запуск.

Re: TI - CC1101 или СС112?

Чт окт 08, 2020 19:13:20

Кварц у радио-чипа? Какая номинальная нагрузочная ёмкость у применённого кварца? Скорее всего где-то нет контакта. Рекомендую перепаять кварц термофеном, если не поможет, то сам радио-чип.

Re: TI - CC1101 или СС112?

Пт окт 09, 2020 03:04:22

Ser60 писал(а):Кварц у радио-чипа?

Ну да.

Ser60 писал(а):Какая номинальная нагрузочная ёмкость у применённого кварца?

12 pF.

Ser60 писал(а):Рекомендую перепаять кварц

Пропаял паяльником - ничего не поменялось. Попробую феном снять и другой поставить.

Ser60 писал(а):то сам радио-чип.

уже два раза пересаживал

Ser60 писал(а):термофеном

только им и паяю. Паяльником только коротыши ставить) Да и жало у меня только K тип (T12).


Убрал ЛА с ног МК и вернулось всё в круги своя. На первые 8 тактов чип сразу же отдаёт 0хFF (смотрю дебагом). На следующие 8 тактов он также держит 0xFF. Далее выдаёт нули. Проглатывает любую конфигурационную команду и отдаёт 0xFF. Но на любой запрос отдаёт CTS = 0xFF, 0xFF и далее нули. Только на FUNC_INFO отдаёт первым информационным байтом 06 (ревизия) и далее опять нули.
Встаю на MISO ЛА - патч глотает без проблем, но POWER_UP CTS = 0x00.
Неужели из-за кварца такие глюки?
Буду пробовать TCXO на проводочках подпаивать. Просто под рукой на 30 МГц ничего нет. Если и с ним не заведётся, тогда возьму паузу, пока тинька 1606 не приедет для другой платы на SI4061. Она хотя бы в "правильном" корпусе с широко растопыренными ногами.

Re: TI - CC1101 или СС112?

Пт окт 09, 2020 08:32:06

Явно где-то непропай. Может обрыв земли где-то. Пропаяйте паяльником под микроскопом все выводы деталей, в том числе пассив и МК. Непредно все цепи прозпонить на предмет трещин в дорожках. Мистика.

Re: TI - CC1101 или СС112?

Сб окт 10, 2020 20:25:40

В статье пишется
Структуры, определённые в файле заголовков, используются функциями, краткое описание которых приведено в [5]. Далее можно либо разбираться как использовать эти функции и структуры, либо поступить как я – написать всё самому с нуля.

Я сделал так:
Код:
void Radio_Init(void)
{
    uint8_t *pArray;

    uint8_t ConfArray[] = RADIO_CONFIGURATION_DATA_ARRAY;

    uint8_t num = 0;

    pArray = ConfArray;

    while (*pArray != 0x00)
    {
        num = *pArray++;

        if (!(SPI_WriteArray (num, pArray)))
        {
            while (CTS_Check_Soft() != 0xFF);          // Проверить готовность чипа
        }

        pArray += num;

    }
}


Я поленился при разводке и сделал как мне проще - повесил не GPIO1 в качестве индикатора готовности чипа, а NIRQ. Поэтому мне приходится засылать команды 0х44 и 0xFF, чтобы узнать готовность чипа. А чтобы на NIRQ повесить функции CTS, необходимо загрузить патч, отправить команду POWER_UP и только после этого можно отправлять команду конфигурирования ног GPIO.
Единственная правка, которую необходимо произвести, это в файле конфигурации подправить путь до патча или положить его по указанному пути. Но это сущая ерунда по сравнению с переназначением CTS. Ээээх..

Добавлено after 1 hour 34 seconds:
Убил полдня и полночи, чтобы понять, почему код на MSP430 исполняется в режиме debug и работает через пень в нормальном режиме. Перечитал мануал на IAR - думал он чудит чего, перечитал даташит на MSP430 - может, думаю, забываю что включить? Но нет же, в примерах от техасовцев последовательность действий такая же. Начал эксперименты - на прерывание от пинов реакция есть, от таймера RTC - нет. Но если зайти в прерывание от пина, то появляется реакция на прерывание от RTC. Вот как это назвать? Чесал, чесал свою лысую репу, пока не попробовал замкнуть ногу ресет. Оказывается, конденсатора на 1 нФ недостаточно, чтобы полностью сбросить МК. А с учетом того, что это устройство крайне малопотребляющее, то пара конденсаторов 10 мкФ разряжаются дольше минуты. А большую емкость повесить нельзя - нога ресета входит в интерфейс Spy2Wire. Ну да и ладно. Это устройство с питанием от батарейки с плановым сроком жизни 5+ лет, поэтому я решил её тупо впаять. Но это всё лирика))

parovoZZ писал(а):Буду пробовать TCXO на проводочках подпаивать.

Такой ерундой решил не страдать. Сдул SI4060 и впаял SI4461, которую мне любезно привёз многоуважаемый Ser60 прямо из DigiKey. Да, да, да! Она завелась! Правда только с подключённым ЛА. Температуру она выдала 27 градусов (в комнате 25.5 градусов) и напряжение 3.25 вольт, что очень похоже на правду.
Не хочу ничего думать на ЧиД, где покупал SI4060, но вот репутация у него подмочена. И хотя SI4060 на китайском толчке замечены не были и приехали они мне в огромных пластмассовых пеналах, а не в ленте, но осадочек остался))
Решил, что на маузере закажу SI4060 revB (посмотрел errata - не такие уж там и критичные изменения). Тем паче, что патч этот выел у меня 800 байт флеша. 1к флеша - это программа. А ещё хочу прикрутить шифрование AES 128, а флеша у меня всего 3.85 кБ.

Ser60 писал(а):Мистика.

Я уже и не знаю на что думать: то ли кварц далеко посадил от SI4060, то ли с землёй косяк, то ли с интерфейсом или питанием. Заметил вот что: если ЛА полностью убрать и сбросить MSP430, то код нормально исполняется. Т.е. вывод какой - что-то происходит при подаче питания, от чего процедура POR у SI4461/SI4060 идёт криво. По поводу SDN даташит пишет:
The SDN pin needs to be held high for at least 10us before driving low again so that internal capacitors can discharge. Not holding the SDN high for this period of time may cause the POR to be missed and the device to boot up incorrectly. If POR timing and voltage requirements cannot be met, it is highly recommended that SDN be controlled using the host processor rather than tying it to GND on the board.

Возможно, что у revB это не так критично, как у revC.
Пока попробую максимально "приглушить" MSP430 на старте, а то на шине питания висят иголки в 100 мВ. Кто виновник - надо выяснить.
Не получится - ну что ж делать....буду переразводить плату и заводить SDN на МК. Благо одна свободная нога и осталась.

Re: TI - CC1101 или СС112?

Сб окт 10, 2020 22:02:55

Всегда замыкаю SDN на землю, поскольку не использую режим SDN. Просто Sleep вполне достаточно. Временные ограничения на SDN=high, вероятно нужны только если дёргать SDN в режиме работы. При заземлённом этом выводе никогда проблем не имел. Также всегда использую GPIO1 для сигнала CTS. На всякий случай мой код конфигурации Si4461 из недавнего проекта для EFM8SB. Там из архитектурно-зависимых функций только 2 последние (SPI read/write).
Спойлер
Код:
#include "SI4461.h"
#include <SI_EFM8SB1_Register_Enums.h>
#include <SI_EFM8SB1_Defs.h>
#include "pins.h"


uint8_t SPI_buf[16];
uint8_t   TX_packet[] = {0x06, 0x66, 0x04, 0xAA, 0x41, 0x42, 0x43, 0x00};   // package

//-------Radio Commands----------------------------------------------
code const uint8_t SI4461_sleep[] = {0x02, 0x34, 0x01};         // put radio on sleep (MOVE_TO_SLEEP)
code const uint8_t SI4461_fifo_info[] = {0x02, 0x15, 0x00};      // FIFO_INFO
code const uint8_t SI4461_clear_fifo[] = {0x02, 0x15, 0x03};   // CLEAR_FIFO
code const uint8_t SI4461_read_cmd_buff[] = {0x44};            // READ_CMD_BUFF
code const uint8_t SI4461_read_rx_fifo[] =  {0x77};            // READ_RX_FIFO
code const uint8_t SI4461_frr_a_read[] =    {0x50};            // FRR_A_READ
code const uint8_t SI4461_clear_irq[] =    {0x01, 0x20};      // CLEAR_IRQ
code const uint8_t SI4461_move_to_rx[] = {0x02, 0x34, 0x08};   // MOVE_TO_RX
code const uint8_t SI4461_start_rx[] = {0x08, 0x32, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x08};   // START_RX opeation
code const uint8_t SI4461_start_tx[] = {0x06, 0x31, 0x00, 0x10, 0x00, 0x05, 0};             // start TX operation
code const uint8_t SI4461_rqst_device_state[] = {0x01, 0x33};   // REQUEST_DEVICE_STATE
code const uint8_t SI4461_measure_batt[] = {0x03, 0x14, 0x08, 0xC9};

//-------SI4461 Config----------------------------------------------
// 903MHz, 1.2kbps, 5.15KHz,  5 bytes payload + CRC16, 4 bytes pre, D3 91 synch
code const uint8_t SI4461_Config[] = {
   0x07, 0x02, 0x01, 0x00, 0x01, 0xC9, 0xC3, 0x80,            // RF_POWER_UP
   0x08, 0x13, 0x01, 0x08, 0x01, 0x01, 0x01, 0x0B, 0x00,      // GPIO_PIN_CFG: int. disabled   
   0x06, 0x11, 0x00, 0x02, 0x00, 0x52, 0x00,               // GLOBAL_XO_TUNE
   0x05, 0x11, 0x00, 0x01, 0x03, 0x60,                   // GLOBAL_CONFIG
   0x05, 0x11, 0x01, 0x01, 0x00, 0x00,                     // INT_CTL_ENABLE: int disable
   0x08, 0x11, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,      // FRR_CTL_A_MODE
   0x07, 0x11, 0x10, 0x03, 0x00, 0x04, 0x14, 0x00,            // PREAMBLE_TX_LENGTH
   0x09, 0x11, 0x10, 0x05, 0x04, 0x31, 0x00, 0x00, 0x00, 0x00,   // PREAMBLE_CONFIG
   0x09, 0x11, 0x11, 0x05, 0x00, 0x01, 0xCB, 0x89, 0x00, 0x00, // SYNC_CONFIG (2 bytes 0xD3 0x91)
   0x05, 0x11, 0x12, 0x01, 0x00, 0x84,                     // PKT_CRC_CONFIG
   0x08, 0x11, 0x12, 0x04, 0x03, 0xFF, 0xFF, 0x00, 0x02,      // PKT_CRC_CONFIG
   0x05, 0x11, 0x12, 0x01, 0x0B, 0x30,                     // PKT_TX_THRESHOLD
   0x10, 0x11, 0x12, 0x0C, 0x0D, 0x00, 0x05, 0x04, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x0C, 0x11, 0x12, 0x08, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RF_PKT_FIELD_4_LENGTH_12_8_8
   0x10, 0x11, 0x20, 0x0C, 0x00, 0x02, 0x00, 0x07, 0x00, 0x2E, 0xE0, 0x01, 0xC9, 0xC3, 0x80, 0x00, 0x00,
   0x05, 0x11, 0x20, 0x01, 0x0C, 0xB4,                     // MODEM_FREQ_DEV (5.15 KHz)
   0x0C, 0x11, 0x20, 0x08, 0x18, 0x01, 0x80, 0x08, 0x03, 0xC0, 0x00, 0x24, 0x20,
   0x0D, 0x11, 0x20, 0x09, 0x22, 0x03, 0x0D, 0x00, 0xA7, 0xC6, 0x00, 0x54, 0x02, 0xC2, // 903 MHz
   0x0B, 0x11, 0x20, 0x07, 0x2C, 0x04, 0x36, 0x80, 0x01, 0x5D, 0x07, 0x80,
   0x05, 0x11, 0x20, 0x01, 0x35, 0xE2,
   0x0D, 0x11, 0x20, 0x09, 0x38, 0x11, 0xAB, 0xAB, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x2B,
   0x0A, 0x11, 0x20, 0x06, 0x42, 0xA4, 0x02, 0xD6, 0x81, 0x01, 0x29,
   0x05, 0x11, 0x20, 0x01, 0x51, 0x08,                     // RF_MODEM_CLKGEN_BAND
   0x08, 0x11, 0x22, 0x04, 0x00, 0x18, 0x19, 0xC0, 0x3D,      // RF_PA_MODE
   0x0B, 0x11, 0x23, 0x07, 0x00, 0x2C, 0x0E, 0x0B, 0x04, 0x0C, 0x73, 0x03,
   0x0B, 0x11, 0x40, 0x07, 0x00, 0x3B, 0x09, 0x99, 0x99, 0x22, 0x22, 0x20,
   0};   

void SI4461_setup(void)
{
   uint8_t* ptr;
//   Delay_ms(500);                              // power-up delay
   ptr = (uint8_t*) SI4461_Config;
   do
   {
      ptr = SI4461_write(ptr);
   
   } while(*ptr);
   
   SI4461_write(SI4461_clear_irq);                  // Send CLEAR_IRQ command
   SI4461_write(SI4461_sleep);                     // put radio on sleep
}

void SI4461_sendPacket(void)
{
   SI4461_write(SI4461_clear_fifo);               // clear FIFOs
   SI4461_write(TX_packet);                     // load packet into TX FIFO
   SI4461_write(SI4461_start_tx);                  // broadcast the packet   
}   

uint8_t SI4461_getBattVoltage(void)
{
   uint16_t batt;
   SI4461_write(SI4461_measure_batt);
   SI4461_read(SI4461_read_cmd_buff, 8);
   batt = (SPI_buf[4] << 8) + SPI_buf[5];
   batt = (batt*3 + 64) >> 7;                     // batt voltage*10
   return(batt);
}

uint8_t* SI4461_write(const uint8_t *buf)
{   
   uint8_t len;
   len = *buf++;                              // # of bytes to transmit
   while (! CTS){}                              // wait for CTS
   
   SPI0CN0_NSSMD0 = 0;                           // CS down
   while (len != 0)
   {
      SPI0DAT = *buf++;
      while (! SPI0CN0_TXBMT){}                  // wait for ready
      len--;
   }         
   SPI0CN0_SPIF = 0;
   while (! SPI0CN0_SPIF){}                         // wait for the last byte
   SPI0CN0_SPIF = 0;
   SPI0CN0_NSSMD0 = 1;                              // CS up

   return((uint8_t*)buf);
}


void SI4461_read(const uint8_t *buf, uint8_t rlen)
{
   uint8_t i;

   while (! CTS){}                              // wait for CTS
      
   SPI0CN0_NSSMD0 = 0;                           // CS down
   SPI0DAT = *buf;

   for (i=0; i< rlen; i++)
   {
      while (SPI0CN0_TXBMT != 1){}
      SPI0CN0_SPIF = 0;
      while (SPI0CN0_SPIF != 1){}                   // wait for the byte
      SPI0CN0_SPIF = 0;
      SPI_buf[i] = SPI0DAT;                      // get received data
      if (i < rlen-1)                           // more bytes to receive?
         SPI0DAT = 0xFF;                        // YES - send dummy byte
   }
   SPI0CN0_NSSMD0 = 1;                              // CS up
}

Какой у Вас 430-й, что хотите на нём AES организовать? Вообще, если не секрет, выложите всю схему.

Re: TI - CC1101 или СС112?

Вс окт 11, 2020 00:32:20

Ser60 писал(а):Какой у Вас 430-й

MSP430FR2111


Ser60 писал(а):хотите на нём AES организовать

библиотека вот
https://www.ti.com/tool/AES-128

Ser60 писал(а):выложите всю схему

Изображение

Добавлено after 1 hour 57 minutes 26 seconds:
Ну всё, я ПОБЕДИЛ.

Пока попробую максимально "приглушить" MSP430 на старте

Чтобы МК не суетился на старте, зажал ему ресет и подал питание. Не помогло. Стал думать дальше.
Вот что такое ЛА? Это же кусок провода с какой-то индуктивностью, входная емкость и входное высокоомное сопротивление самого прибора. Раз с ним стартует без проблем, значит его надо либо прицепить навсегда, либо сэмулировать его подключение. Первый вариант - это только смешить, а второй вариант реализовал с помощью заглушки:
Код:
int main (void)
{
P1DIR = MOSI_PIN | MISO_PIN | CLK_PIN;
P1OUT = 0x00;

Т.е. все линии интерфейса на выход и на землю!
Запускаю дебаг и не верю своим глазам.
Так ещё и МК не надо ресетить, чтобы он заходил в обработчик прерывания от RTC. Всё начинает работать сразу после подачи питания, как схемы из журнала Радио)). Вот что за фокусы? Оптимизация специально выключена, чтобы компилятор ничего не тасовал.

Ещё одну платку распаяю с SI4060 и посмотрю. На этой пока SI4461 оставлю, чтобы отладиться до конца.
Вложения
MSPSI.png
(24.3 KiB) Скачиваний: 403

Re: TI - CC1101 или СС112?

Вс окт 11, 2020 05:26:11

Поздравляю! В начале main() я обычно ставлю power-up задержку на 200-500мс чтобы радио проинициализировалось внутренним МК и для сенсоров тоже полезно.

Re: TI - CC1101 или СС112?

Вс окт 11, 2020 14:28:39

Я взвожу RTC таймер и спать! Даташит говорит про 10 мс, но я сплю почти целую секунду.
Код:
WDTCTL = WDTPW | WDTHOLD;                    // Вырубаем собаку

    RTCMOD = RTC_START;

    RTCCTL = RTCSS__VLOCLK | RTCPS__100 | RTCIE | RTCSR;

    __bis_SR_register(LPM4_bits | GIE);

Re: TI - CC1101 или СС112?

Пн окт 12, 2020 01:18:20

Всякие Радио модули...
Всякие МК...
Это всё понятно))
хочу прикрутить шифрование AES 128...

Во !
Давайте лучше поговорим про шифрование. Это самое "энергозатратная" часть всех подобных проектов.
Как оно у Вас работает ?
:tea:

Re: TI - CC1101 или СС112?

Вт ноя 03, 2020 14:51:18

Кстати, в MSP430FR есть защитный регистр PM5CTL0, который блокирует любые действия с GPIO. Без его разблокировки даже нельзя снять флаги прерывания. Поэтому
Код:
P1DIR = MOSI_PIN | MISO_PIN | CLK_PIN;

физически ни к чему не приводит, а то, что с этой строчкой заработало - чистая случайность. Т.к. после "насыщения" кода всё перестало работать. А начинает работать только после полной разрядки конденсаторов в схеме. По факту надёжность работы схемы полностью зависит от начальной подачи питания.

У меня есть вторая плата с SI4461 и Attiny1616 на борту. Она получилась косячной: MOSI соединился с SDO трансивера, поэтому пришлось уйти от аппаратного SPI в пользу софтового. Вывод SDN вообще повис в воздухе. Но это даже на руку - я его "присопливил" на землю, но чтобы я не делал, какие бы задержки не вводил - трансивер никак не хотел работать. Видимо, переходный процесс при подаче питания (ШИМ DC-DC, затем LDO) "ломает" POR у трансивера. Тогда на вывод SDN я повесил стандартную RC-цепь. 4.7к + 100nF эффекта не дали, увеличил номиналы до 100к (случайно....хотел 10к) и 1uF и оно заработало. Впоследствии и их заменил на 10к и 10uF (безвыводного на 1uF с ходу не нашёл). В результате трансивер начинает отвечать через 70мс после подачи питания.
Изображение

Вывод из всего этого такой:

В трансиверах ревизии "С" вывод SDN обязательно подключать либо к схеме сброса, либо к МК. Посаженный SDN на землю - это лотерея. И тем паче лотерея, если вдруг ОЗУ трансивера "подпортится", а перезагрузить его никак.
Вложения
IMG_0814.JPG
(85.85 KiB) Скачиваний: 293

Re: TI - CC1101 или СС112?

Ср ноя 10, 2021 23:44:12

Переделал свои горемычные платы. Благо что в соседней теме подсказали, как это сделать абсолютно бесплатно. Завёл SDN на МК, CTS GPIO1 так же подправил. Вернул фазу клока SPI на середину тактирующего сигнала и всё сразу завелось без радиобубна - трансивер патчится, измеряет напряжение и температуру. Теперь буду осваивать EZR32 и устанавливать радиосвязь.
А в предыдущем варианте хоть как-то работало из-за заваленных ЛА фронтов. ЛА снимаешь - нет ресета, нет работы. Такие вот дела.

Re: TI - CC1101 или СС112?

Чт ноя 11, 2021 21:02:13

Рекомендую вместо EZR32 посмотреть на более новые EFR32. Статью мою читали?

Re: TI - CC1101 или СС112?

Чт ноя 11, 2021 21:59:46

EZR32 уже куплен и ждёт, когда будет посажен на плату.

Re: TI - CC1101 или СС112?

Чт ноя 11, 2021 22:27:12

Тоже неплохой вариант. Удачи!

Re: TI - CC1101 или СС112?

Пт ноя 12, 2021 19:13:00

Почитал про EFR32. Это или Cortex M33, или Cortex M4. Мне сейчас столько не надо) Да и стоит оно под стать.
А RAIL я давно смотрел. Но с ним сейчас заморачиваться не хочется.

Re: TI - CC1101 или СС112?

Сб ноя 13, 2021 05:04:35

Какaя разница какой это Cortex. Да и многие базовые модели EFR32FG1 стоят соизмеримо с EZR32HG. Зато получите DC/DC конвертер в том-же корпусе. А к RAIL советую присмотреться - она заметно упрощает разработку приложений и делает их более надёжными.
Ответить