Валерий Киселёв Опубликовано 21 декабря, 2016 Поделиться Опубликовано 21 декабря, 2016 Использую библиотеку 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 ,®,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); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Стальной Опубликовано 21 декабря, 2016 Поделиться Опубликовано 21 декабря, 2016 А с каким устройством связь идёт? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Барабашка Опубликовано 21 декабря, 2016 Поделиться Опубликовано 21 декабря, 2016 (изменено) >>HAL_SPI_Transmit(&hspi1 ,®,8,1000); третий параметр количество передаваемых байт, а не бит 6 минут назад, Стальной сказал: А с каким устройством связь идёт? в шапке темы написано RC522 Изменено 21 декабря, 2016 пользователем Барабашка 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
mail_robot Опубликовано 21 декабря, 2016 Поделиться Опубликовано 21 декабря, 2016 (изменено) Вообще с такой простой ерундой как SPI никогда проблем небыло. Сделай скриншот конфига модуля SPI из куба и код инитки бы посмотреть. Чето чую там напутано. Ну и не мешало бы вызовы HAL_SPI_Transmit обрамить в обработчик ошибки типа if (HAL_SPI_Transmit() != HAL_OK) Error_Handler(); а то программа ведь без обработчика ошибки не остановится и знать даже не будешь 1 час назад, Валерий Киселёв сказал: Вроде поднял SPI для HAL это оооочень громко сказано Изменено 21 декабря, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 21 декабря, 2016 Автор Поделиться Опубликовано 21 декабря, 2016 1 час назад, Барабашка сказал: >>HAL_SPI_Transmit(&hspi1 ,®,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); 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Барабашка Опубликовано 21 декабря, 2016 Поделиться Опубликовано 21 декабря, 2016 1. void PCD_WriteNumberRegister( uint8_t reg, uint8_t value ) { reg=(reg & 0x7E); HAL_SPI_Transmit(&hspi1 ,®,8,1000); } У вас данных ОДИН байт, а функции Вы говорите передать восемь 2. Я NSS управлял вручную, почему отказался от аппаратного, сейчас не помню, но с аппаратным у меня не работало. (писал без HAL) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 21 декабря, 2016 Автор Поделиться Опубликовано 21 декабря, 2016 (изменено) И как я умудрился билеберду написать туда ... теперь вот так Скрытый текст 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); } Изменено 21 декабря, 2016 пользователем Валерий Киселёв 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 22 декабря, 2016 Автор Поделиться Опубликовано 22 декабря, 2016 На данный момент поправил команды - но читаю всеравно 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); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) дык мож он (522-ой) и не передает ничего. Чтото не то значит отправляется в командах. Или не той стороной. Так то SPI по всей видимости работает Изменено 22 декабря, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 22 декабря, 2016 Автор Поделиться Опубликовано 22 декабря, 2016 а может 522 реагировать на дергание SS между передачами? сейчас попробую командой на одновременную передачу считывание - может что ответит... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 22 декабря, 2016 Автор Поделиться Опубликовано 22 декабря, 2016 (изменено) Убивая 3 й день на разбор полетов заметил в одном из русских объяснений цитирую : Цитата Если же SPI модуль работает в режиме мастера, то ногу NSS нужно подтянуть к питанию или включить программное управление (SSM=1) и установить бит SSI. В противном случае - SPI модуль подумает, что появился новый мастер и сам станет слейвом. Этот момент для меня был не совсем очевиден и я потратил много времени чтоб разобраться. Возможно это вы имели в виду ? Хотя судя по руководству возможных состояния 3 SPI_NSS_SOFT SPI_NSS_HARD_INPUT SPI_NSS_HARD_OUTPUT У меня указан 3й вариант. Ап - Сейчас вчитался - все верно должно быть... Изменено 22 декабря, 2016 пользователем Валерий Киселёв 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 да нормально все у тебя с NSS. И даже его дергания не должны влиять. Надо смотреть порядок команд 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Валерий Киселёв Опубликовано 22 декабря, 2016 Автор Поделиться Опубликовано 22 декабря, 2016 (изменено) да я уже скатился читаю регистор версии чипа 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.... Изменено 22 декабря, 2016 пользователем Валерий Киселёв 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) к сожалению нет времени въедливо читать немаленький мануал на 522-ой чип. Одно знаю точно - чудес не бывает. Если чип молчит в ответ, то он нифига не понимает что ему там пытается сказать мастер. Либо надо еще раз проверить монтаж, либо протокол, либо чипу трындец Простой способ проверить - подключить чтонить SPI-ное взамен. Да хоть SPI самого на себя замкнуть и лупом протестить Изменено 22 декабря, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 А подключено все верно? Да, возможно перепутан порядок MSB/LSB, кто должен быть первым, кто последним. Плюс выводом NSS надо рулить вручную, он не должен передергиваться после передачи каждого байта. Плюс, плюс крайне советую писать без HAL, по крайней мере пока учишься. Код будет в разы понятнее и проще. Ну и писать библиотеку надо по даташиту, а не по кривой фигне для ардуино. Для начала добейся считывания версии чипа, которая лежит в регистре 0x37. Соответственно тебе надо опустить NSS, передать 0x37 и передать еще одно любой значение чтобы МК выдал клок для считывания данных с чипа и только потом поднять NSS. Ответ должен быть 0x91 или 0x92. Сразу скажу, что руками это сделать гораздо быстрее и проще, чем разбираться с причудами HAL. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) 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 Изменено 22 декабря, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) 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 не следует поднимать до конца обмена пакетом Изменено 22 декабря, 2016 пользователем BARS_ 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 Да как вашей душеньке угодно, так и делайте наздоровье. Главное чтобы работало. Так и так будет работать совершенно одинаково 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 3 минуты назад, mail_robot сказал: Да как вашей душеньке угодно Вы правы) А можно подробнее про выдачу клока мастером?) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Барабашка Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 void RC_WriteRawRC(u8 addr, u8 value) { RC_ChipSelect(0); RC_WriteByte((addr<<1) & 0x7E); RC_WriteByte(value); RC_ChipSelect(1); } я когда писал (списывал) свою реализацию то CS управлял вручную. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 16 минут назад, ART_ME сказал: Гений сдулся? Вы про что? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
elki Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 Это у них личное в теме рядом 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) пардон, ужинал я ужо старый и больной и все точно не помню, но вот сверился с мануалом на всякий пожарный Цитата 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, он с перепугу примет байт ничо не высылая Изменено 22 декабря, 2016 пользователем mail_robot 1 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
BARS_ Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 34 минуты назад, mail_robot сказал: дернуть проц за яйки флагом SPE и BIDIOE Ага, попробую, спасибо =) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 22 декабря, 2016 Поделиться Опубликовано 22 декабря, 2016 (изменено) @BARS_ незачто ) пусть флудит до усеру, люблю смотреть как дурачки бесятся. На поступок умнее у него все равно тямки не хватит. А придет модер и на форуме станет спокойнее на недельку Изменено 22 декабря, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.