Files
99_7018_lmx/apps/earphone/remote_control/RFID/rfid_hal.c

183 lines
4.4 KiB
C
Raw Normal View History

2025-11-24 16:33:33 +08:00
#include "./rfid_hal.h"
#include "gSensor/gSensor_manage.h"
#include "./include/rfid_main.h"
#include "./include/READER_REG.h"
2025-11-25 14:12:44 +08:00
#include "asm/spi.h"
2025-11-24 16:33:33 +08:00
2025-11-24 18:58:32 +08:00
#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-11-25 14:12:44 +08:00
#define INTERFACE_TYPE 1
2025-11-24 16:33:33 +08:00
//////////////////////////////////////////////////////////////////////////////////////////////////
//
#if INTERFACE_TYPE == 0 //iic接口
/*
IF2 IF0 ADDR
0 0 0x28
0 1 0x29
1 0 0x2A
1 1 0x2B
*/
2025-11-25 14:12:44 +08:00
#define FM176_7BIT_ADDR 0x2A //后两位地址由IF2、IF1决定
2025-11-24 16:33:33 +08:00
#define FM176_READ_ADDR (FM176_7BIT_ADDR << 1)
#define FM176_WRITE_ADDR ((FM176_7BIT_ADDR << 1) | 0x01)
unsigned char FM176XX_HardInit(void){
int ret = hw_iic_init(0);
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){
if(_gravity_sensor_get_ndata(FM176_READ_ADDR, address, reg_data, 1)){
return SUCCESS;
}else{
return FAIL;
}
}
/**
* @brief FM176XX芯片写入一个字节的寄存器值
* @param address [in]
* @param reg_data [in]
* @return SUCCESS表示成功
* @details
* iic
*/
unsigned char SetReg(unsigned char address, unsigned char reg_data){
if(gravity_sensor_command(FM176_WRITE_ADDR, address, reg_data) == 0){
return FAIL;
}else{
return SUCCESS;
}
}
/**
* @brief 0x1F
*
* @return unsigned char
*/
unsigned char FM176XX_SoftReset(void){
gravity_sensor_command(FM176_WRITE_ADDR,REG_COMMAND,0x1F);
}
#elif INTERFACE_TYPE == 1 //spi
2025-11-25 14:12:44 +08:00
unsigned char FM176XX_HardInit(void){
2025-11-25 16:22:28 +08:00
gpio_set_direction(IO_PORTA_05,0); //nss
2025-11-25 16:40:37 +08:00
gpio_set_output_value(IO_PORTA_05, 1); //初始设置为高
2025-11-25 14:12:44 +08:00
spi_open(SPI1); //初始化spi1PC3、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事务 ----
2025-11-26 11:25:20 +08:00
gpio_set_output_value(IO_PORTA_05,0);
2025-11-25 14:12:44 +08:00
// 1. 发送地址字节,忽略接收到的数据
2025-11-26 11:25:20 +08:00
spi_send_byte(SPI1, addr_byte);
asm("nop");
2025-11-25 14:12:44 +08:00
// 2. 接收数据字节 (通过发送一个Dummy Byte 0xFF 来产生时钟)
*reg_data = spi_recv_byte(SPI1, &err);
2025-11-26 11:25:20 +08:00
asm("nop");
2025-11-25 14:12:44 +08:00
// ---- 结束SPI事务 ----
2025-11-26 11:25:20 +08:00
gpio_set_output_value(IO_PORTA_05,1);
os_time_dly(1);
2025-11-25 14:12:44 +08:00
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){
2025-11-25 16:22:28 +08:00
unsigned char addr_byte = (address << 1) & 0xFE; // Bit0=0 for write
int err1, err2;
2025-11-26 11:25:20 +08:00
gpio_set_output_value(IO_PORTA_05,0); // <<-- CS拉低开始事务
2025-11-25 16:22:28 +08:00
err1 = spi_send_byte(SPI1, addr_byte); // 发送地址
2025-11-26 11:25:20 +08:00
asm("nop");
2025-11-25 16:22:28 +08:00
err2 = spi_send_byte(SPI1, reg_data); // 发送数据
2025-11-26 11:25:20 +08:00
asm("nop");
2025-11-25 16:22:28 +08:00
2025-11-26 11:25:20 +08:00
gpio_set_output_value(IO_PORTA_05,1); // <<-- CS拉高结束事务
os_time_dly(1);
2025-11-25 16:22:28 +08:00
if (err1 != 0 || err2 != 0) {
return FAIL;
2025-11-25 14:12:44 +08:00
}
return SUCCESS;
2025-11-25 16:22:28 +08:00
2025-11-25 14:12:44 +08:00
}
/**
* @brief 0x1F
*
* @return unsigned char
*/
unsigned char FM176XX_SoftReset(void){
return SetReg(REG_COMMAND, 0x1F);
}
2025-11-24 16:33:33 +08:00
#elif INTERFACE_TYPE == 2 //uart
#endif
void rfid_delay_ms(unsigned int ms){
os_time_dly(ms/10);
}