esaulenka 7 29 июля, 2016 Опубликовано 29 июля, 2016 · Жалоба Ну вот и моя хитрость. Чтение делаю 3 (три) раза подряд. Извините за резкость, но, может быть, стоило разик подумать?.. В даташите прямо картинками нарисовано, даже читать особо не надо: - записать адрес регистра0 - считать мусор - записать адрес регистра1 - считать данные регистра0 uint8_t TM_MFRC522_ReadRegister(uint8_t addr) { uint8_t cmd[2]; uint8_t answ[2]; cmd[0]=cmd[1]= (addr << 1) | 0x80; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, cmd, answ, 2, 20); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET); return answ[1]; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 29 июля, 2016 Опубликовано 29 июля, 2016 (изменено) · Жалоба может здесь и говорится о нашей проблемке ..... страница 9 Если вы после приведенного фрагмента кода не используете явно data1,2,3. - data1 после (2) не упоминается - так зачем он нужен ? - элемент массива записывается в неупоминаемый data1 - так зачем он (массив) нужен ? А то что вы в ф-ию передали &Var, и что этот адрес принадлежит именно Var - компилятор "не знает". ------- В общем мои "смутные сомненья" Вы поняли. Это IMHO. возможно есть такие сверхумные компиляторы...с суппероптимизацией....я пока до сих пор с такими "глубокими" эффектами не сталкивался. Неиспользуемые переменные, невызываемые функции, глухие циклы для задержек - это я видел, убирает на раз. Но чтобы компилятор отслеживал всю цепочку присвоений, да еще глобальных переменных.... Возможно такое и есть. Но возникает вопрос работы с указателями. И какова "глубина" этих цепочек. Если к примеру: int a1,a2,a3............................a999; a1=0; a2=a1; a3=a2; ...... a999 = a998; data1= a999; Если все эти строки разбросаны по сотням тысяч строк кода, и не будет присвоения data1=a999 то все уберется? А если будет присвоение data1=a999, то компилер полезет искать использование data1 во всем проекте и участие data1 в многочисленных структурах, массивах, указателях, функциях. И соотвественно начнет смотреть на использование этих структур,массивов, функций в проекте...и так далее и так до бесконечности? Утверждать стопроцентно не буду....но есть у меня сомнения.... Изменено 29 июля, 2016 пользователем Pasa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 30 июля, 2016 Опубликовано 30 июля, 2016 · Жалоба Открываются глаза. Народ говорит, что вся разница в том, что 'L4 есть "Data packing", а вот в семействах STM32f4... его нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 1 августа, 2016 Опубликовано 1 августа, 2016 · Жалоба На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 1 августа, 2016 Опубликовано 1 августа, 2016 · Жалоба На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят. Фактически я делаю то же самое, но другим способом. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 1 августа, 2016 Опубликовано 1 августа, 2016 · Жалоба Фактически я делаю то же самое, но другим способом. :-) Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение. Хотя там где скорости не важны, то можно делать как кому больше нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 2 августа, 2016 Опубликовано 2 августа, 2016 · Жалоба Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение. Хотя там где скорости не важны, то можно делать как кому больше нравится. Ну да, там у меня чтение нескольких байт за 25 мсек. Хотя прямое чтение DR - это надо иметь в виду. Теперь скоро буду с 1-мегабайтной памятью по SPI работать. Вот там посмотрим. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ave! 0 9 мая, 2017 Опубликовано 9 мая, 2017 · Жалоба Прочитал всю ветку, пробовал все варианты под CooCox и Keil, SPL и HAL - у меня не работает на STM32F030K6. На STM32F103С8 у меня работает и SPL и HAL - https://zxlogin.com/stm/stm32f103-rc522+hal.zip Поделитесь рабочим кодом под STM32F030 для RC522. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 10 мая, 2017 Опубликовано 10 мая, 2017 · Жалоба Прочитал всю ветку, пробовал все варианты под CooCox и Keil, SPL и HAL - у меня не работает на STM32F030K6. На STM32F103С8 у меня работает и SPL и HAL - https://zxlogin.com/stm/stm32f103-rc522+hal.zip Поделитесь рабочим кодом под STM32F030 для RC522. Могу только предложить то, что у меня работает для STM32L476. Куб проиницилизировал SPI так (8 бит, 5 МГц): static 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_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } } Все функции в файле - mfrc522.c (прикладываю). После запуска моей программы - инициализация RC522: void TM_MFRC522_Init(void) { TM_MFRC522_Reset(); TM_MFRC522_WriteRegister(MFRC522_REG_T_MODE, 0x8D); TM_MFRC522_WriteRegister(MFRC522_REG_T_PRESCALER, 0x3E); TM_MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_L, 30); TM_MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_H, 0); /* 48dB gain */ TM_MFRC522_WriteRegister(MFRC522_REG_RF_CFG, 0x70); TM_MFRC522_WriteRegister(MFRC522_REG_TX_AUTO, 0x40); TM_MFRC522_WriteRegister(MFRC522_REG_MODE, 0x3D); TM_MFRC522_AntennaOn(); //Open the antenna } Потом для чтения ID карты вызываю: STAT=TM_MFRC522_Check(CardID); SC522=0; if (STAT==0) { } Все мои беды в прошлом году были с буфером Фифо в STM32. И всё поперло после глупости, что я применил при чтении регистров RC522: uint8_t TM_MFRC522_ReadRegister(uint8_t addr) { uint8_t val; ZAPRC522[0] = (addr << 1) & 0x7E; ZAPRC522[0] = ZAPRC522[0] | 0x80; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); val = OTVRC522[0]; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); val = OTVRC522[0]; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); val = OTVRC522[0]; return val; } Глупость в 3-кратном чтении одно и того же. Но работает. Но работает только с HAL-драйверами для STM32L4... не позже октября 2016 (версия 1.5.0). После их обновления в феврале (версия 1.7.0) перестала работать. Я смотрел отличия - ребята пытались как раз что-то замутить с фифо. Но я убирал своё 3-краное чтение, комбинировал всяко, но облом. Пришлось вернуться на драйверы октября 2016 и так оставить. Похоже вопрос с 8-битным чтением по SPI в STM32 (через HAL) так нормально и не решен. mfrc522.rar mfrc522.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться