STM32 SPI: Conference Entry using RFID Card

HAL_SPI_Transmit/ HAL_SPI_Transmit_IT/ HAL_SPI_Transmit_DMA (SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_SPI_Receive/ HAL_SPI_Receive_IT / HAL_SPI_Receive_DMA (SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_SPI_TransmitReceive/ HAL_SPI_TransmitReceive_IT / HAL_SPI_TransmitReceive_DMA (SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

if we use IT no Timeout parameter is needed.

#define CS_SELECT                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)
#define CS_DESELECT               HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)
uint8_t readFromRegister(uint8_t addr) 
{
  uint8_t value[2]={((addr<<1)&0x7E)|0x80,0};
  uint8_t Rx_buffer[2];
  CS_SELECT;
  //Read Address format: 1XXXXXX0
  HAL_SPI_TransmitReceive(&hspi2,value,Rx_buffer,2,100);
  CS_DESELECT;
  return Rx_buffer[1];
}
void writeToRegister(uint8_t addr, uint8_t val) 
{
  CS_SELECT;
  uint8_t value[2]={(addr<<1)&0x7E,val};
  uint8_t Rx_buffer[2];
  //Write Address format: 0XXXXXX0
  HAL_SPI_TransmitReceive(&hspi2,value,Rx_buffer,2,100);
  CS_DESELECT;
}
void reset(void) 
{
  writeToRegister(CommandReg, MFRC522_SOFTRESET); // MFRC522_SOFTRESET: 0x0F
}  
void setBitMask(uint8_t addr, uint8_t mask) 
{
  uint8_t current;
  current = readFromRegister(addr);
  writeToRegister(addr, current | mask);
}
void clearBitMask(uint8_t addr, uint8_t mask) 
{
  uint8_t current;
  current = readFromRegister(addr);
  writeToRegister(addr, current & (~mask));
}
void begin(void) 
{
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
  reset();
  //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
  writeToRegister(TModeReg, 0x8D);   // Tauto=1; f(Timer) = 6.78MHz/TPreScaler
  writeToRegister(TPrescalerReg, 0x3E);  // TModeReg[3..0] + TPrescalerReg
  writeToRegister(TReloadRegL, 30);  writeToRegister(TReloadRegH, 0);
  writeToRegister(TxAutoReg, 0x40);      // 100%ASK
  writeToRegister(ModeReg, 0x3D);        // CRC initial value 0x6363
  setBitMask(TxControlReg, 0x03);        // Turn antenna on.
}
uint8_t FoundTag,ReadTag,TagData[16]; // Variable used to store Full Tag Data
FoundTag = requestTag(MF1_REQIDL, TagData); 
if (FoundTag == 0x00) ReadTag = antiCollision(TagData);
sprintf(display_tag," %2X,%2X,%2X,%2X ",TagData[0],TagData[1],TagData[2],TagData[3]);
OLCD_write_string(6,0,display_tag);
uint8_t Card1[4]={0xB3,0x4A,0x63,0xA9}; // Subeer Sarkar
uint8_t Card2[4]={0x13,0xF9,0xFF,0xFA}; // Swarnolata
HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc,&sDate,RTC_FORMAT_BCD);
sprintf(display_time," %02X:%02X:%02X ",sTime.Hours,sTime.Minutes,sTime.Seconds);
OLCD_write_string(3,0,display_time);
sprintf(display_time," %02X/%02X/%02X %s",sDate.Date,sDate.Month,sDate.Year,day_name[sDate.WeekDay+1]);
	  OLCD_write_string(4,0,display_time);
if((Card1[0]==TagData[0])&&(Card1[1]==TagData[1])&&(Card1[2]==TagData[2])&&(Card1[3]==TagData[3]))
	 {
		 OLCD_write_string(5,0,"Subeer Sarkar");            // person name here
         OLCD_write_string(6,0,display_time);
		 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);  // open for 10s
		 HAL_Delay(10000);
		 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
		 OLCD_write_string(5,0,"               ");
         OLCD_write_string(6,0,"               ");
	     }
else if((Card2[0]==TagData[0])&&(Card2[1]==TagData[1])&&(Card2[2]==TagData[2])&&(Card2[3]==TagData[3]))
     {
		 OLCD_write_string(5,0,"Swarnolata   ");            // person name here
         OLCD_write_string(6,0,display_time);
		 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);  // open for 10s
		 HAL_Delay(10000);
		 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
		 OLCD_write_string(5,0,"               ");
         OLCD_write_string(6,0,"               ");
	 }
FoundTag = requestTag(MF1_REQIDL, TagData); 
if(sTime.Hours == 0x10 && sDate.Date == 0x06 &&  sDate.Month == 0x01)
if (FoundTag == 0x00) ReadTag = antiCollision(TagData); // Read tag only at 10am, 06/01/25

MFRC522 📱 SPI Interface ▶ RFID Card Reader