TI - CC1101 или СС112?

Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Не понял про какой кварц идёт речь. Если про тот, что у радио-чипа, то конденсаторы к нему не нужны, поскольку внутри радио-чипа имеются. А так, похоже, Вас можно поздравить с успехом.
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Ну как поздравить? Кварц-то не запускается. Добавляю лишнюю емкость в виде руки или провода - есть запуск.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Кварц у радио-чипа? Какая номинальная нагрузочная ёмкость у применённого кварца? Скорее всего где-то нет контакта. Рекомендую перепаять кварц термофеном, если не поможет, то сам радио-чип.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

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. Она хотя бы в "правильном" корпусе с широко растопыренными ногами.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Явно где-то непропай. Может обрыв земли где-то. Пропаяйте паяльником под микроскопом все выводы деталей, в том числе пассив и МК. Непредно все цепи прозпонить на предмет трещин в дорожках. Мистика.
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

В статье пишется
Структуры, определённые в файле заголовков, используются функциями, краткое описание которых приведено в [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 на МК. Благо одна свободная нога и осталась.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Всегда замыкаю 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 организовать? Вообще, если не секрет, выложите всю схему.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Ser60 писал(а):Какой у Вас 430-й
[uquote="parovoZZ",url="/forum/viewtopic.php?p=3903386#p3903386"]MSP430FR2111[/uquote]
Ser60 писал(а):хотите на нём AES организовать
библиотека вот
https://www.ti.com/tool/AES-128
Ser60 писал(а):выложите всю схему
Изображение

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

[uquote="parovoZZ",url="/forum/viewtopic.php?p=3904680#p3904680"]Пока попробую максимально "приглушить" MSP430 на старте[/uquote]
Чтобы МК не суетился на старте, зажал ему ресет и подал питание. Не помогло. Стал думать дальше.
Вот что такое ЛА? Это же кусок провода с какой-то индуктивностью, входная емкость и входное высокоомное сопротивление самого прибора. Раз с ним стартует без проблем, значит его надо либо прицепить навсегда, либо сэмулировать его подключение. Первый вариант - это только смешить, а второй вариант реализовал с помощью заглушки:

Код: Выделить всё

int main (void)
{
P1DIR = MOSI_PIN | MISO_PIN | CLK_PIN;
P1OUT = 0x00;
Т.е. все линии интерфейса на выход и на землю!
Запускаю дебаг и не верю своим глазам.
Так ещё и МК не надо ресетить, чтобы он заходил в обработчик прерывания от RTC. Всё начинает работать сразу после подачи питания, как схемы из журнала Радио)). Вот что за фокусы? Оптимизация специально выключена, чтобы компилятор ничего не тасовал.

Ещё одну платку распаяю с SI4060 и посмотрю. На этой пока SI4461 оставлю, чтобы отладиться до конца.
Вложения
MSPSI.png
(24.3 КБ) 453 скачивания
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Поздравляю! В начале main() я обычно ставлю power-up задержку на 200-500мс чтобы радио проинициализировалось внутренним МК и для сенсоров тоже полезно.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Я взвожу RTC таймер и спать! Даташит говорит про 10 мс, но я сплю почти целую секунду.

Код: Выделить всё

WDTCTL = WDTPW | WDTHOLD;                    // Вырубаем собаку

    RTCMOD = RTC_START;

    RTCCTL = RTCSS__VLOCLK | RTCPS__100 | RTCIE | RTCSR;

    __bis_SR_register(LPM4_bits | GIE);
Друг Кота
Сообщения: 9405
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Всякие Радио модули...
Всякие МК...
Это всё понятно))
[uquote="parovoZZ",url="/forum/viewtopic.php?p=3904680#p3904680"]хочу прикрутить шифрование AES 128...[/uquote]
Во !
Давайте лучше поговорим про шифрование. Это самое "энергозатратная" часть всех подобных проектов.
Как оно у Вас работает ?
:tea:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Кстати, в 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 КБ) 341 скачивание
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

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

Сообщение Ser60 »

Рекомендую вместо EZR32 посмотреть на более новые EFR32. Статью мою читали?
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

EZR32 уже куплен и ждёт, когда будет посажен на плату.
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Тоже неплохой вариант. Удачи!
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Почитал про EFR32. Это или Cortex M33, или Cortex M4. Мне сейчас столько не надо) Да и стоит оно под стать.
А RAIL я давно смотрел. Но с ним сейчас заморачиваться не хочется.
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

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

Вернуться в «Радиотехника: приемники, передатчики, антенны»