да, в целом у меня всё так и сделано. Не работает. Понимаю, что если у всех работает, а у меня нет, то я чего-то не доделываю. Вот чего? Сами функции чтения/записи регистров RC522 проверил - читается то, что должно быть по умолчанию после сброса. После записи читается то, что записал.
Вот так делаю инициализацию 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;
}