#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 #define INTERFACE_TYPE 1 ////////////////////////////////////////////////////////////////////////////////////////////////// // #if INTERFACE_TYPE == 0 //iic接口 /* IF2 IF0 ADDR 0 0 0x28 0 1 0x29 1 0 0x2A 1 1 0x2B */ #define FM176_7BIT_ADDR 0x2A //后两位地址由IF2、IF1决定 #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 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); os_time_dly(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拉高,结束事务 os_time_dly(1); 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){ os_time_dly(ms/10); }