2025-12-01 10:01:10 +08:00
|
|
|
|
#include "./rfid_hal.h"
|
|
|
|
|
|
#include "gSensor/gSensor_manage.h"
|
|
|
|
|
|
#include "./include/rfid_main.h"
|
|
|
|
|
|
#include "./include/READER_REG.h"
|
|
|
|
|
|
#include "asm/spi.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define FUN_ENABLE_XLOG 1
|
|
|
|
|
|
#ifdef xlog
|
|
|
|
|
|
#undef xlog
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if FUN_ENABLE_XLOG
|
|
|
|
|
|
#define xlog(format, ...) printf("[XT:%s] " format, __func__, ##__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define xlog(format, ...) ((void)0)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2025-12-01 18:51:24 +08:00
|
|
|
|
/*
|
|
|
|
|
|
IFSEL1 IFSEL0 Host_Interface
|
|
|
|
|
|
0 0 UART
|
|
|
|
|
|
1 0 SPI
|
|
|
|
|
|
0 1 IIC
|
|
|
|
|
|
1 1 SPI
|
|
|
|
|
|
INTERFACE_TYPE == 0:iic
|
|
|
|
|
|
== 1: spi
|
|
|
|
|
|
== 2: uart
|
|
|
|
|
|
*/
|
2025-12-01 10:01:10 +08:00
|
|
|
|
#define INTERFACE_TYPE 0
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#if INTERFACE_TYPE == 0 //iic接口
|
2025-12-01 18:51:24 +08:00
|
|
|
|
/*
|
|
|
|
|
|
注:iic读取rfid不建议使用底层的硬件iic,很容易造成程序崩溃,并且时序有时候对不上会造成读写信息错误
|
|
|
|
|
|
这里利用底层写好的软件iic接口来实现寄存器的读写
|
|
|
|
|
|
*/
|
2025-12-01 10:01:10 +08:00
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
IF2 IF0 ADDR
|
|
|
|
|
|
0 0 0x28
|
|
|
|
|
|
0 1 0x29
|
|
|
|
|
|
1 0 0x2A
|
|
|
|
|
|
1 1 0x2B
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define FM176_7BIT_ADDR 0x28 //后两位地址由IF2、IF1决定
|
2025-12-01 11:11:07 +08:00
|
|
|
|
#define FM176_WRITE_ADDR (FM176_7BIT_ADDR << 1)
|
|
|
|
|
|
#define FM176_READ_ADDR ((FM176_7BIT_ADDR << 1) | 0x01)
|
2025-12-01 10:01:10 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char FM176XX_HardInit(void){
|
2025-12-01 18:05:09 +08:00
|
|
|
|
#if TCFG_GSENOR_USER_IIC_TYPE == 1// 硬件iic
|
2025-12-01 10:01:10 +08:00
|
|
|
|
int ret = hw_iic_init(0);
|
2025-12-01 18:05:09 +08:00
|
|
|
|
#else
|
|
|
|
|
|
int ret = soft_iic_init(0);
|
|
|
|
|
|
#endif
|
2025-12-01 10:01:10 +08:00
|
|
|
|
xlog("init iic result:%d\n", ret); //返回0成功
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 从FM176XX芯片读取一个字节的寄存器值。
|
|
|
|
|
|
* @param address [in] 目标寄存器的地址。
|
|
|
|
|
|
* @param reg_data [out] 指向用于存储读取数据的字节的指针。
|
|
|
|
|
|
* @return 操作状态,SUCCESS表示成功。
|
|
|
|
|
|
* @details
|
|
|
|
|
|
* 接口:iic
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char GetReg(unsigned char address, unsigned char *reg_data){
|
2025-12-01 18:51:24 +08:00
|
|
|
|
soft_iic_start(0);
|
|
|
|
|
|
if (0 == soft_iic_tx_byte(0, FM176_WRITE_ADDR)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 == soft_iic_tx_byte(0, address)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_start(0);
|
|
|
|
|
|
if (0 == soft_iic_tx_byte(0, FM176_READ_ADDR)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
2025-12-01 18:51:24 +08:00
|
|
|
|
*reg_data = soft_iic_rx_byte(0, 0);
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return SUCCESS;
|
2025-12-01 10:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 向FM176XX芯片写入一个字节的寄存器值。
|
|
|
|
|
|
* @param address [in] 目标寄存器的地址。
|
|
|
|
|
|
* @param reg_data [in] 要写入的字节数据。
|
|
|
|
|
|
* @return 操作状态,SUCCESS表示成功。
|
|
|
|
|
|
* @details
|
|
|
|
|
|
* 接口:iic
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char SetReg(unsigned char address, unsigned char reg_data){
|
2025-12-01 18:51:24 +08:00
|
|
|
|
soft_iic_start(0);
|
|
|
|
|
|
if (0 == soft_iic_tx_byte(0, FM176_WRITE_ADDR)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 == soft_iic_tx_byte(0, address)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
2025-12-01 18:51:24 +08:00
|
|
|
|
if (0 == soft_iic_tx_byte(0, reg_data)) {
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(0);
|
|
|
|
|
|
return SUCCESS;
|
2025-12-01 10:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 软件复位,命令:0x1F
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return unsigned char
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char FM176XX_SoftReset(void){
|
2025-12-01 13:57:54 +08:00
|
|
|
|
return SetReg(REG_COMMAND, 0x1F);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#elif INTERFACE_TYPE == 1 //spi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char FM176XX_HardInit(void){
|
|
|
|
|
|
gpio_set_direction(IO_PORTA_05,0); //nss
|
|
|
|
|
|
gpio_set_output_value(IO_PORTA_05, 1); //初始设置为高
|
|
|
|
|
|
spi_open(SPI1); //初始化spi1:PC3、PC5
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 从FM176XX芯片读取一个字节的寄存器值。
|
|
|
|
|
|
* @param address [in] 目标寄存器的地址。
|
|
|
|
|
|
* @param reg_data [out] 指向用于存储读取数据的字节的指针。
|
|
|
|
|
|
* @return 操作状态,SUCCESS表示成功。
|
|
|
|
|
|
* @details
|
|
|
|
|
|
* 接口:SPI
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char GetReg(unsigned char address, unsigned char *reg_data){
|
|
|
|
|
|
unsigned char addr_byte;
|
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
|
|
// 准备地址字节:地址左移1位,Bit0置1表示读
|
|
|
|
|
|
addr_byte = (address << 1) | 0x01;
|
|
|
|
|
|
|
|
|
|
|
|
// ---- 开始SPI事务 ----
|
|
|
|
|
|
gpio_set_output_value(IO_PORTA_05,0);
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 发送地址字节,忽略接收到的数据
|
|
|
|
|
|
spi_send_byte(SPI1, addr_byte);
|
|
|
|
|
|
asm("nop");
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 接收数据字节 (通过发送一个Dummy Byte 0xFF 来产生时钟)
|
|
|
|
|
|
*reg_data = spi_recv_byte(SPI1, &err);
|
|
|
|
|
|
asm("nop");
|
|
|
|
|
|
|
|
|
|
|
|
// ---- 结束SPI事务 ----
|
|
|
|
|
|
gpio_set_output_value(IO_PORTA_05,1);
|
|
|
|
|
|
|
|
|
|
|
|
if (err != 0) {
|
|
|
|
|
|
xlog("GetReg error\n");
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 向FM176XX芯片写入一个字节的寄存器值。
|
|
|
|
|
|
* @param address [in] 目标寄存器的地址。
|
|
|
|
|
|
* @param reg_data [in] 要写入的字节数据。
|
|
|
|
|
|
* @return 操作状态,SUCCESS表示成功。
|
|
|
|
|
|
* @details
|
|
|
|
|
|
* 接口:SPI
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char SetReg(unsigned char address, unsigned char reg_data){
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char addr_byte = (address << 1) & 0xFE; // Bit0=0 for write
|
|
|
|
|
|
int err1, err2;
|
|
|
|
|
|
|
|
|
|
|
|
gpio_set_output_value(IO_PORTA_05,0); // <<-- CS拉低,开始事务
|
|
|
|
|
|
|
|
|
|
|
|
err1 = spi_send_byte(SPI1, addr_byte); // 发送地址
|
|
|
|
|
|
asm("nop");
|
|
|
|
|
|
err2 = spi_send_byte(SPI1, reg_data); // 发送数据
|
|
|
|
|
|
asm("nop");
|
|
|
|
|
|
|
|
|
|
|
|
gpio_set_output_value(IO_PORTA_05,1); // <<-- CS拉高,结束事务
|
|
|
|
|
|
|
|
|
|
|
|
if (err1 != 0 || err2 != 0) {
|
|
|
|
|
|
return FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 软件复位,命令:0x1F
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return unsigned char
|
|
|
|
|
|
*/
|
|
|
|
|
|
unsigned char FM176XX_SoftReset(void){
|
|
|
|
|
|
return SetReg(REG_COMMAND, 0x1F);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#elif INTERFACE_TYPE == 2 //uart
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void rfid_delay_ms(unsigned int ms){
|
2025-12-01 18:05:09 +08:00
|
|
|
|
// delay(ms);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
os_time_dly(ms/10);
|
|
|
|
|
|
}
|