Ну вот. Убедился с помощью Ардуино (ха-ха-ха), что считыватель Мифаре RC522 и сами карты у меня рабочие. Так чего ж не так? Использовал доработанную библиотеку от http://stm32f4-dis …522-stm32f4xx-devices/
Перед этим через STM32CubeL4 создал проект для SPI1 (под Кейл).
Соответственно в скачанной библиотеке поправил вызовы функций передачи и приема байтов по SPI через HAL-драйверы.
В результате с RC522 нормально читаю все регистры. Их содержимое соответствует тому, что должно быть после сброса по умолчанию.
Потом провожу инициализацию и вижу правильное их изменение .
Антенна включается и поле видно даже петлей.
После этого проводится непрерывный запрос карты командой 0х26 (функция из библиотеки TM_MFRC522_Check(CardID)).
В поле виден байт запроса и потом байт остановки (функция TM_MFRC522_Halt())
Независимо от присутствия/отсутствия карты ничего не происходит (всегда status = MI_ERR).
Осциллографом из ответов ничего не обнаруживается ни в поле, ни на ножках RC522.
Была попытка продублировать ответы карты внутри RC522 на ножку MFOUT (установкой регистра TxSelReg/0х16 байтом 0х17), но на этой ножке всегда 3-е состояние почему-то.
Всё это проверено на 2 считывателях, 3 картах и 2 брелках (из комплекта).
Таким образом нахожусь в недоумении.
Я что-то не включаю? Хотя по той библиотеке я делаю тот же Init.
Могут ли быть два считывателя подряд неисправными?
MFRC522 подключен к SPI1 STM32L476
PE15 - MOSI
PE14 - MISO
PE13 - SCK
PE12 - SS
PE10 - RST
Вот так делаю инициализацию RC522:
void TM_MFRC522_Init(void)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);
HAL_Delay(500);
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
}
Потом просто циклично вызываю опрос TM_MFRC522_Check:
TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id)
{
TM_MFRC522_Status_t status;
//Find cards, return card type
status = TM_MFRC522_Request(PICC_REQIDL, id);
if (status == MI_OK)
{
//Card detected
//Anti-collision, return card serial number 4 bytes
status = TM_MFRC522_Anticoll(id);
}
TM_MFRC522_Halt(); //Command card into hibernation
HAL_Delay(2);
return status;
}
На TM_MFRC522_Anticoll никогда не выходит. Потому что после TM_MFRC522_Request(PICC_REQIDL, id) никто не отвечает.
TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType)
{
TM_MFRC522_Status_t status;
uint16_t backBits; //The received data bits
TM_MFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x07); //TxLastBists = BitFramingReg[2..0] ???
TagType[0] = reqMode;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
if ((status != MI_OK) || (backBits != 0x10))
{
status = MI_ERR;
}
return status;
}
Вот это обращение к карте TM_MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits) моими познаниями в Си совершенно не постигается. Возможно вот тут я и косячу.
TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen)
{
TM_MFRC522_Status_t status = MI_ERR;
uint8_t irqEn = 0x00;
uint8_t waitIRq = 0x00;
uint8_t lastBits;
uint8_t n;
uint16_t i;
switch (command)
{
case PCD_AUTHENT:
{
irqEn = 0x12;
waitIRq = 0x10;
break;
}
case PCD_TRANSCEIVE:
{
irqEn = 0x77;
waitIRq = 0x30;
break;
}
default:
break;
}
TM_MFRC522_WriteRegister(MFRC522_REG_COMM_IE_N, irqEn | 0x80);
TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);
TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);
TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_IDLE);
//Writing data to the FIFO
for (i = 0; i < sendLen; i++)
{
TM_MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, sendData[i]);
}
//Execute the command
TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, command);
if (command == PCD_TRANSCEIVE)
{
TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80); //StartSend=1,transmission of data starts
}
//Waiting to receive data to complete
i = 2000; //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???
do
{
//CommIrqReg[7..0]
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
n = TM_MFRC522_ReadRegister(MFRC522_REG_COMM_IRQ);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitIRq));
TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80); //StartSend=0
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
if (i != 0)
{
if (!(TM_MFRC522_ReadRegister(MFRC522_REG_ERROR) & 0x1B))
{
status = MI_OK;
if (n & irqEn & 0x01)
{
status = MI_NOTAGERR;
}
if (command == PCD_TRANSCEIVE)
{
n = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_LEVEL);
lastBits = TM_MFRC522_ReadRegister(MFRC522_REG_CONTROL) & 0x07;
if (lastBits)
{
*backLen = (n - 1) * 8 + lastBits;
}
else
{
*backLen = n * 8;
}
if (n == 0)
{
n = 1;
}
if (n > MFRC522_MAX_LEN)
{
n = MFRC522_MAX_LEN;
}
//Reading the received data in FIFO
for (i = 0; i < n; i++)
{
backData[i] = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_DATA);
}
}
}
else
{
status = MI_ERR;
}
}
return status;
}