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

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);
                                    }                                
            

 

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

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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);

 

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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 пользователей онлайн

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

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