Перейти к содержанию

STM32F1 SPI & RC-522(RFID)


Валерий Киселёв

Рекомендуемые сообщения

Использую библиотеку HAL  Вроде поднял SPI (как проверить не знаю) . Пытаюсь  переписать существующию библиотеку для ардуино под стм

но все что выдает SPI либо 0x00 либо 0xFF =(  иногда пробегают цифры но это скорее случайность. Может кто объяснить в чем может быть причина?

SS pin управляется железом. если есть время сегодня то - скайп Discord teamspeak Radmin - буду признателен за помощь - достаточно результата в правильном считывание регистров или ткнуть носом что идет не так. Для начала делаю без прирываний и DMA

Использую мк - stm32f103c8t6 модуль : rc-522 - данные отправляю через USB в ПК KEil 5 + cubeMX последней версии.

Код процедур прилагаю.

Скрытый текст

void PCD_WriteNumberRegister(    uint8_t reg, uint8_t value    ) 
                                    {
                                    reg=(reg & 0x7E);                
                                    HAL_SPI_Transmit(&hspi1 ,&reg,8,1000);    
                                    }

void PCD_WriteTextRegister(    uint8_t reg, uint8_t count,    uint8_t *value) 
                                    {
                                    reg=(reg & 0x7E);
                                    uint8_t Data[64]={reg};    
                                    for (uint8_t index = 0; index < count; index++)
                                            {Data[index+1]=value[index];}
                                    HAL_SPI_Transmit(&hspi1,Data,count,1000);
                                    }

uint8_t PCD_ReadRegister(    uint8_t reg)
                                    {uint8_t value[1];
                                    reg=(0x80 | (reg & 0x7E));

                                    HAL_SPI_Transmit(&hspi1,value,1,1000);
                                    HAL_SPI_Receive(&hspi1 ,value,1,1000);
                                    return *value;
                                    } 
void PCD_BigReadRegister(    uint8_t reg, uint8_t count, uint8_t *values)
                                    {
                                        uint8_t address = 0x80 | (reg & 0x7E);
                                        count--;                            
                                        HAL_SPI_Transmit(&hspi1 ,&address,1,10000);    
                                        HAL_SPI_TransmitReceive(&hspi1,&address,values,count,1000);
                                    }                                
            

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

>>HAL_SPI_Transmit(&hspi1 ,&reg,8,1000);

третий параметр количество передаваемых байт, а не бит

6 минут назад, Стальной сказал:

А с каким устройством связь идёт?

в шапке темы написано RC522

Изменено пользователем Барабашка
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вообще с такой простой ерундой как SPI никогда проблем небыло.

Сделай скриншот конфига модуля SPI из куба и код инитки бы посмотреть. Чето чую там напутано. Ну и не мешало бы вызовы HAL_SPI_Transmit обрамить в обработчик ошибки типа

if (HAL_SPI_Transmit() != HAL_OK) Error_Handler();

а то программа ведь без обработчика ошибки не остановится и знать даже не будешь

1 час назад, Валерий Киселёв сказал:

Вроде поднял SPI

для HAL это оооочень громко сказано

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Барабашка сказал:

>>HAL_SPI_Transmit(&hspi1 ,&reg,8,1000);

третий параметр количество передаваемых байт, а не бит

 

В курсе  - это я тестировал =( вроде верно это потому что  если reset  rc 522 прижать к 0 то идут 0 .

Скрытый текст

SPI_HandleTypeDef hspi1;

/* SPI1 init function */
void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();
  
    /**SPI1 GPIO Configuration    
    PA4     ------> SPI1_NSS
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

Ссылка на комментарий
Поделиться на другие сайты

1.

void PCD_WriteNumberRegister(    uint8_t reg, uint8_t value    ) 
                                    {
                                    reg=(reg & 0x7E);                
                                    HAL_SPI_Transmit(&hspi1 ,&reg,8,1000);    
                                    }

У вас данных ОДИН байт, а функции Вы говорите передать восемь 

2. Я NSS управлял вручную, почему отказался от аппаратного, сейчас не помню, но с аппаратным у меня не работало. (писал без HAL)

Ссылка на комментарий
Поделиться на другие сайты

И как я умудрился билеберду написать туда ... теперь вот так 

Скрытый текст

void PCD_WriteNumberRegister(    uint8_t reg, uint8_t value    ) 
                                    {
                                    uint8_t Data[2];
                                    Data[0]=(reg & 0x7E);
                                    Data[1]=value;
                                    
                                    HAL_SPI_Transmit(&hspi1 ,&Data,2,1000);    
                                    }

 

Изменено пользователем Валерий Киселёв
Ссылка на комментарий
Поделиться на другие сайты

На данный момент поправил команды - но читаю всеравно FF FF .....

Скрытый текст

void PCD_WriteNumberRegister(    uint8_t reg, uint8_t value    ) 
                                    {
                                    uint8_t Data[2];
                                    Data[0]=(reg & 0x7E);
                                    Data[1]=value;
                                    
                                    HAL_SPI_Transmit(&hspi1 ,Data,2,1000);    
                                    }

void PCD_WriteTextRegister(    uint8_t reg, uint8_t count,    uint8_t *value) 
                                    {
                                    reg=(reg & 0x7E);
                                    uint8_t Data[64]={reg};    
                                    for (uint8_t index = 0; index < count; index++)
                                            {Data[index+1]=value[index];}
                                    HAL_SPI_Transmit(&hspi1,Data,count,1000);
                                    }

uint8_t PCD_ReadRegister(    uint8_t reg)
                                    {uint8_t value[1];
                                    reg=(0x80 | (reg & 0x7E));

                                    HAL_SPI_Transmit(&hspi1,value,1,1000);
                                    HAL_SPI_Receive(&hspi1 ,value,1,1000);
                                    return *value;
                                    } 
void PCD_BigReadRegister(    uint8_t reg, uint8_t count, uint8_t *values)
                                    {
                                        uint8_t address = 0x80 | (reg & 0x7E);
                                        uint8_t Data[1]= {address};
                                        HAL_SPI_Transmit(&hspi1 ,Data,1,10000);    
                                        HAL_SPI_Receive(&hspi1,values,count,5000);
                                    }                                

 

Ссылка на комментарий
Поделиться на другие сайты

дык мож он (522-ой) и не передает ничего. Чтото не то значит отправляется в командах. Или не той стороной. Так то SPI по всей видимости работает

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

а может  522 реагировать на дергание SS между передачами?  сейчас попробую командой на одновременную передачу считывание - может что ответит... 

 

Ссылка на комментарий
Поделиться на другие сайты

Убивая 3 й день на разбор полетов заметил в одном из русских объяснений цитирую :

Цитата

Если же SPI модуль работает в режиме мастера, то ногу NSS нужно подтянуть к питанию или включить программное управление (SSM=1) и установить бит SSI. В противном случае - SPI модуль подумает, что появился новый мастер и сам станет слейвом. Этот момент для меня был не совсем очевиден и я потратил много времени чтоб разобраться. 

Возможно это вы имели в виду ?  Хотя судя по руководству возможных состояния 3 

SPI_NSS_SOFT

SPI_NSS_HARD_INPUT

SPI_NSS_HARD_OUTPUT

У меня указан 3й вариант.

 

Ап - Сейчас вчитался - все верно должно быть...

Изменено пользователем Валерий Киселёв
Ссылка на комментарий
Поделиться на другие сайты

да нормально все у тебя с NSS. И даже его дергания не должны влиять. Надо смотреть порядок команд

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

да я уже скатился читаю регистор версии чипа 

	ResetRFID();
	HAL_SPI_TransmitReceive(&hspi1,Exsample_Data,Exsample_Data2,5,10000);
	HAL_Delay(100);
	CDC_Transmit_FS(Exsample_Data2,5);

где Exsample_Data - масив из 5 элементов 0xEE

должно считать хоть что-то =(

но в ответ только FF FF FF....

Изменено пользователем Валерий Киселёв
Ссылка на комментарий
Поделиться на другие сайты

к сожалению нет времени въедливо читать немаленький мануал на 522-ой чип. Одно знаю точно - чудес не бывает. Если чип молчит в ответ, то он нифига не понимает что ему там пытается сказать мастер. Либо надо еще раз проверить монтаж, либо протокол, либо чипу трындец

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

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

А подключено все верно? Да, возможно перепутан порядок MSB/LSB, кто должен быть первым, кто последним. Плюс выводом NSS надо рулить вручную, он не должен передергиваться после передачи каждого байта. Плюс, плюс крайне советую писать без HAL, по крайней мере пока учишься. Код будет в разы понятнее и проще. Ну и писать библиотеку надо по даташиту, а не по кривой фигне для ардуино. Для начала добейся считывания версии чипа, которая лежит в регистре 0x37. Соответственно тебе надо опустить NSS, передать 0x37 и передать еще одно любой значение чтобы МК выдал клок для считывания данных  с чипа и только потом поднять NSS. Ответ должен быть 0x91 или 0x92. Сразу скажу, что руками это сделать гораздо быстрее и проще, чем разбираться с причудами HAL.

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, BARS_ сказал:

он не должен передергиваться после передачи каждого байта

для SPI это никогда не являлось обязательным условием. Паузы там вполне допускаются. Или вы думаете разработчики модуля SPI такие идиоты, что не знают об этом? Если бы паузы не допускались, то был бы режим Hold NSS. Но чето такого я не встречал нигде

12 минуты назад, BARS_ сказал:

Для начала добейся считывания версии чипа, которая лежит в регистре 0x37. Соответственно тебе надо опустить NSS, передать 0x37

совершенно правильно

12 минуты назад, BARS_ сказал:

и передать еще одно любой значение чтобы МК выдал клок для считывания данных

а вот это не надо. Мастер в режиме приема в состоянии выдавать такты без передачи пустых байт. Хотя это со стороны приемника и будет выглядеть как передача пустого байта.

 

12 минуты назад, BARS_ сказал:

Сразу скажу, что руками это сделать гораздо быстрее и проще, чем разбираться с причудами HAL

чего там разбираться то и с какими причудами?
 

HAL_SPI_Transmit(&hspi1,0х37,1,0хFF);

HAL_SPI_Receive(&hspi1,Exsample_Data,1,0xFF);


Ни разу еще в моей практике не случалось такого, чтобы правильно подключенный SPI девайс не заработал на HAL

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, mail_robot сказал:

Мастер в режиме приема в состоянии выдавать такты

Это как? У меня не получалось, обязательно надо что-то заслать в регистр, даже в режиме полудуплекс.

SPI_Read(uint8_t send, uint8_t *data_mas, uint8_t count){

	uint8_t i = 1;

	SPI2->CR1 |= SPI_CR1_BIDIOE; // переключение на отправку
	SPI2->DR = send; 			 // отправка данных

	while (!(SPI2->SR & SPI_SR_TXE)); // ожидание окончания отправки
	while ((SPI2->SR & SPI_SR_BSY));

	SPI2->CR1 &= ~SPI_CR1_BIDIOE; // переключение в режим приема. При этом будет отправлено 8 тактовых импульсов

	while (!(SPI2->SR & SPI_SR_RXNE));
	while ((SPI2->SR & SPI_SR_BSY));

	data_mas[0] = SPI2->DR; // забираем полученные данные из регистра SPI

	while(count-- > 1){ // повторяем необходимое количество раз

		SPI2->DR = 0xFF; // запись в регистр любого в режиме приема инициализирует отправку тактирования

		while (!(SPI2->SR & SPI_SR_RXNE));
		while ((SPI2->SR & SPI_SR_BSY));

		data_mas[i++] = SPI2->DR;
	}

	SPI2->CR1 |= SPI_CR1_BIDIOE;
}

Иначе, откуда мастер узнает, что надо клок давать?

 

20 минут назад, mail_robot сказал:

HAL_SPI_Transmit(&hspi1,0х37,1,0хFF);

Ни о чем не говорит, функция с набором чего-то. В то время, как вся отправка - это 3 строки:

void SPI_Send(uint8_t data){
	SPI2->DR = data;
	while (!(SPI2->SR & SPI_SR_TXE));
	while ((SPI2->SR & SPI_SR_BSY));
}

Прочитать еще 3 строки =) На мой взгляд для новичка это куда проще выглядит

21 минуту назад, mail_robot сказал:

для SPI это никогда не являлось обязательным условием

Ну хз, в даташитах обычно указывается, что ChipSelect не следует поднимать до конца обмена пакетом

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Да как вашей душеньке угодно, так и делайте наздоровье. Главное чтобы работало. Так и так будет работать совершенно одинаково

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

void RC_WriteRawRC(u8 addr, u8 value)
{
    RC_ChipSelect(0);                                  
    RC_WriteByte((addr<<1) & 0x7E);                    
    RC_WriteByte(value);                               
    RC_ChipSelect(1);
}

я когда писал (списывал) свою реализацию то CS управлял вручную.

Ссылка на комментарий
Поделиться на другие сайты

пардон, ужинал

я ужо старый и больной и все точно не помню, но вот сверился с мануалом на всякий пожарный

Цитата

In bidirectional mode, when receiving (BIDIMODE=1 and BIDIOE=0)
– The sequence begins as soon as SPE=1 and BIDIOE=0.
– The received data on the MOSI pin are shifted in serially to the 8-bit shift register
and then parallel loaded into the SPI_DR register (Rx buffer).
The transmitter is not activated and no data are shifted out serially to the MOSI
pin.

жирным шрифтом читаем внимательно

если коротко, то надо дернуть проц за яйки флагом SPE и BIDIOE, он с перепугу примет байт ничо не высылая

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

@BARS_  незачто )

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

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Там на примерах видос уже с задержкой писанный, дропов нет.   уже предлагалось 
    • БОРОДА ! я там все верно написал. Просто так резисторы не горят !!! Вы видимо то же дуб дубом в этом деле как и ФАЛКОНИСТ модератор.
    • Можно скрин с программы  Victoria по проверки диска "С"  и флэшки? С диска "с" воспроизводится как? Если так же, то можно эту же флэшку вставить в телефон/фотоаппарат и проверить, с качеством записи не хуже чем на вашей камере? Если копировать видео с камеры которая подключена к компьютеру, то за сколько копируется файл например гигабайтной длинны? А если его же записать?  
    • В ГДР-овских швейных машинах позднего периода линейки Famula присутствуют модели с т.н. автоматическими функциями, они отличаются от остальных словом Electronic в названии, индексом 51 в номере модели, и наличием трёх кнопок справа: левая кнопка: положение иглы (в нажатом состоянии - игла всегда будет возвращаться вниз, в отжатом - уходить наверх) средняя: одиночный прокол - при нажатой кнопке и нажатии на педаль отрабатывается один цикл опускания и подъёма иглы правая: пониженная скорость - при нажатой кнопке, скорость ограничена фиксированным значением Электронная часть состоит из модуля Управления скоростью, модуля Позиционирования иглы и мотора с педалью. Вот схемы из той документации, что удалось добыть:     Указанные функции реализованы в модуле Позиционирования иглы (схема на стр. 22), позиция иглы отслеживается по герконовому датчику на маховике, подключенного непосредственно к модулю позиционирования (разъём X5). Модуль модуль управления скоростью (стр. 21) подключен к сети 220 через выключатель, к мотору (стр.18) и к одному из выводов педали. Модуль позиционирования подключен к модулю управления скорости (X4.2, X4.3, X4.4) и второму выводу педали (X4.1), к первому выводу педали - через X4.4.   Педаль представляет собой угольный реостат, в нажатом положении сопротивление стремится к нулю. Проблема: Не работает позиционирование иглы в крайних точках, в зависимости от положения левой кнопки (S1) - после отпускания педали игла останавливается в произвольном положении. Не работает функция т.н. Одиночного прокола - когда нажата кнопка S2, по нажатию педали маховик стоит на месте и не двигается. Не учитывая функционал этих кнопок, всё остальное исправно работает, включая функцию пониженной скорости - при нажатии правой кнопки (S3). Что было сделано: Визуальный осмотр, чистка контактов и замена электролитических конденсаторов на всех платах. Замена симистора на Модуле оборотов и всех транзисторов и микросхемы логики на Модуле позиционирования на полные аналоги. Прозвонка герконового датчика положения иглы, кнопочных переключателей S1, S2, S3, прозвонка дорожек. Эксперименты по замене сдвоенного операционного усилителя B2761 на имеющийся в наличии сдвоенный компаратор LM393 (неудачные). После этого была получена в распоряжение полностью рабочая машина аналогичной модели, используемая в дальнейшем, как референсная, и окончательно выявлен неисправный модуль - м. позиционирования. Методом кросс-замены были проверены и исключены все активные элементы: сдвоенный операционный усилитель B2761 (N1), микросхема логики D1, транзисторы V1 и V8, а также диодные сборки V2 и V7, и конденсаторы. При очередной выпайке и запайке транзистора V8 начало наблюдаться такое поведение: после включения машина отрабатывает функцию одиночного прокола (при нажатой кнопке S2), но только один раз, иногда не до конца; дальнейшие повторные нажатия педали ни к чему не приводят. При выключении питания и последующем включении, функция одиночного прокола может снова отработать один раз. После этого были пропаяны и прозвонены все элементы и дорожки по периметру, находящиеся рядом с транзистором V8, без положительного результата.     Дальнейшая работа по поиску неисправности осложняется тем, что я не очень хорошо понимаю, как работает схема Модуля позиционирования и не могу даже приблизительно сформулировать фазы её работы, в силу своей квалификации: мне непонятно подключение второго операционного усилителя N1.2 - его выход упирается в диоды V4 и V6, и его функция в этой схеме (компаратор?) работа AND-логики, в особенности элементов D1.1 и D1.2 в контексте подключения к усилителю и транзистору V8Для прояснения ситуации, с некоторых контрольных точек, обозначенных номерами в кружках на схеме были сняты осциллограмы на рабочем аппарате: Замеры производились на прибор Fnirsi DPOX180H. Здесь канал 1 (жёлтый) - датчик позиции (геркон), точка №6, негативный контакт - X4.3 Выводы: Предположительно, управляющее напряжение на контакте X4.2. Контакты X4.1 и X4.4 соединены с соответствующими выводами реостата педали. Следующим шагом планирую последовательное выпаивание и проверку всех диодов и резисторов на плате Модуля позиционирования. Буду признателен за помощь и советы. Сам я по уровню начинающий радиолюбитель, мой опыт ограничен сборкой / мелким ремонтом и доработками БПЛА и работой с несложными схемами на базе микроконтроллеров ATMega и ESP, со схемотехникой советского периода знаком только по опыту с радиоконтрукторами и простыми транзисторными приёмниками, но очень бы хотелось разобраться, поэтому буду признателен также за ссылки на конкретные обучающие материалы по теме и методикам работы.
    • Давно уже 85% сервисов так работают. Реально грамотных еще надо поискать.
  • Похожий контент

×
×
  • Создать...