硬汉嵌入式论坛

 找回密码
 立即注册
查看: 207|回复: 1
收起左侧

[有问必答] MFRC522改用SI522问题

[复制链接]

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2025-4-3 14:14:23 | 显示全部楼层 |阅读模式
MFRC522用了很多年没什么问题
最近想替换成SI522试下

发现寄存器读取有问题
参照文档 https://item.szlcsc.com/datasheet/SI522/3027565.html?spm=sc.gb.xds.a&lcsc_vid=FVFcUlEHFQcIAQZfQVVaVAZWRldXVQdVQFhaVgZRFFAxVlNSRFRWU1JWR1FcXzsOAxUeFF5JWBYZEEoVDQ0NFAdIFA4DSA%3D%3D
写了之后
想试下刷M1卡读下卡号,发现寻卡一直失败。
Updated Gain: 70
Fixed RF Control: 83
FIFO Level: 01
IRQ Status: 14
FIFO Data: 26
No card detected or error, Status: 0, BackBits: 08

天线打开成功的,增益0x00,0x10,0x20,0x30,x40,0x50,0x60,0x70都试了,结果一样的
SPI时钟频率降低试了2M,1M,500k,125k 结果也一样

有没有大佬用过SI522的,帮忙指导下

下附代码:
[C] 纯文本查看 复制代码
#define READER522_CS_LOW()      HAL_GPIO_WritePin(READER522_CS_GPIO_Port, READER522_CS_Pin, GPIO_PIN_RESET)
#define READER522_CS_HIGH()     HAL_GPIO_WritePin(READER522_CS_GPIO_Port, READER522_CS_Pin, GPIO_PIN_SET)
#define READER522_RST_LOW()     HAL_GPIO_WritePin(READER522_NRST_GPIO_Port, READER522_NRST_Pin, GPIO_PIN_RESET)
#define READER522_RST_HIGH()    HAL_GPIO_WritePin(READER522_NRST_GPIO_Port, READER522_NRST_Pin, GPIO_PIN_SET)

// SPI 写寄存器
void READER522_WriteRegister(uint8_t reg, uint8_t value)
{
  uint8_t data[2] = {(reg << 1) & 0x7E, value}; // SPI 写命令格式
  READER522_CS_LOW();
  HAL_SPI_Transmit(&READER522_SPI, data, 2, 100);
  READER522_CS_HIGH();
}

// SPI 读寄存器
uint8_t READER522_ReadRegister(uint8_t reg)
{
  uint8_t addr = ((reg << 1) & 0x7E) | 0x80; // SPI 读命令格式
  uint8_t value = 0;

  READER522_CS_LOW();
  HAL_SPI_Transmit(&READER522_SPI, &addr, 1, 100);
  HAL_SPI_Receive(&READER522_SPI, &value, 1, 100);
  READER522_CS_HIGH();

  return value;
}

void READER522_ClearBitMask(uint8_t reg, uint8_t mask)
{
  uint8_t tmp = READER522_ReadRegister(reg);
  READER522_WriteRegister(reg, tmp & (~mask)); // 清除特定位
}

/////////////////////////////////////////////////////////////////////
//通讯时返回的错误代码
/////////////////////////////////////////////////////////////////////
#define MI_OK                 0
#define MI_NOTAGERR           1
#define MI_ERR                2

void READER522_Reset()
{
  READER522_RST_LOW();
  HAL_Delay(10);
  READER522_RST_HIGH();
  HAL_Delay(50);
}

void READER522_AntennaOn(void)
{
  uint8_t value = READER522_ReadRegister(0x14);
  if (!(value & 0x03))
  {
    READER522_WriteRegister(0x14, value | 0x03); // 打开天线
  }

  HAL_Delay(10);
  uint8_t rfControl = READER522_ReadRegister(0x14);
  printf("Fixed RF Control: %02X\n", rfControl);
}

bool READER522_Init()
{
  READER522_Reset(); // 复位芯片

  READER522_WriteRegister(0x01, 0x0F); // 复位 SI522
  HAL_Delay(10);
  READER522_WriteRegister(0x0A, 0x80); // 允许 FIFO 写入
  READER522_ClearBitMask(0x14, 0x80);  // 强制 ISO14443A

  // 关闭天线
  READER522_WriteRegister(0x14, 0x00);

  // 设置定时器
  READER522_WriteRegister(0x2A, 0x8D); // TMode 寄存器:内部定时器设定
  READER522_WriteRegister(0x2B, 0x3E); // TPrescaler
  READER522_WriteRegister(0x2D, 30);   // TReloadLow
  READER522_WriteRegister(0x2C, 0);    // TReloadHi

  READER522_WriteRegister(0x15, 0x40); // TxAuto: 100%ASK
  READER522_WriteRegister(0x11, 0x3D); // RxSel:增益控制 48dB

  // 调节增益
  READER522_WriteRegister(0x26, 0x70); // 设置最大增益
  HAL_Delay(10);
  uint8_t gain = READER522_ReadRegister(0x26);
  printf("Updated Gain: %02X\n", gain);

  // 使能天线
  READER522_AntennaOn();  
  return true;
}

int8_t READER522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backBits)
{
  uint8_t status = 1;
  uint8_t irqEn = 0x00;
  uint8_t waitIRq = 0x00;
  uint8_t lastBits;
  uint8_t n;
  uint8_t i;

  switch (command)
  {
  case 0x0C: // 发送 REQA / 寻卡
    irqEn = 0x77;
    waitIRq = 0x30;
    break;
  }

  READER522_WriteRegister(0x02, irqEn | 0x80); // 启用中断
  READER522_WriteRegister(0x04, 0x00);         // 清除中断标志
  READER522_WriteRegister(0x0A, 0x80);         // FIFO 初始化

  // 写入 FIFO
  for (i = 0; i < sendLen; i++)
  {
    READER522_WriteRegister(0x09, sendData[i]);
  }

  READER522_WriteRegister(0x01, command); // 执行命令

  // 等待执行完成
  i = 25;
  do {
    HAL_Delay(1);
    n = READER522_ReadRegister(0x04);
    i--;
  }
  while ((i != 0) && !(n & 0x01) && !(n & waitIRq));

  if (i != 0)
  {
    if (!(READER522_ReadRegister(0x06) & 0x1B)) // 检查错误寄存器
    {
      status = 0;                       // 成功
      n = READER522_ReadRegister(0x0A); // FIFO Level
      lastBits = READER522_ReadRegister(0x0C) & 0x07;
      if (lastBits)
      {
        *backBits = (n - 1) * 8 + lastBits;
      }
      else
      {
        *backBits = n * 8;
      }
    }
    else
    {
      status = 1; // 失败
    }
  }

  return status;
}


uint8_t READER522_Request(uint8_t reqMode, uint8_t *backBits)
{
    uint8_t status;
    uint8_t data[2];

    READER522_WriteRegister(0x0D, 0x07);  // 设置 FIFO 数据宽度
    READER522_ClearBitMask(0x08, 0x08);   // 关闭自动增益
    READER522_WriteRegister(0x04, 0x00);  // 清除中断标志

    data[0] = reqMode; // 0x26(寻卡)
    status = READER522_ToCard(0x0C, data, 1, backBits);

    return status;
}






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-4 12:10:19 | 显示全部楼层
SPI硬件上还有就是SPI GPIO的上拉使能了,速度等级降低试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 22:00 , Processed in 0.230714 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表