Цитата(ave! @ May 10 2017, 00:34)

Прочитал всю ветку, пробовал все варианты под 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) так нормально и не решен.