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;
}
|