Gitee仓库地址:
https://gitee.com/rao-jiechang/HarmonyOS_ScanCard
一、初始化
RC522的初始化包括:GPIO的初始化、SPI的初始化
void RC522_GPIO_Init(void)
{
// GPIO 初始化
GpioInit();
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_FUNC_GPIO_6_SPI0_CK); //RC522_SCK
IOSetDriverStrength(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_DRIVER_STRENGTH_2);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_SPI0_RXD); //RC522_MISO
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_SPI0_TXD); //RC522_MOSI
IOSetDriverStrength(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_DRIVER_STRENGTH_0);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO); //RC522_NSS
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO); //RC522_RST
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
//SPI 初始化
WifiIotSpiCfgInitParam init_param; //主从模式:主
init_param.isSlave = HI_FALSE;
WifiIotSpiCfgBasicInfo spi_cfg_basic_info; //spi cfg 参数设置
spi_cfg_basic_info.cpol = WIFI_IOT_SPI_CFG_CLOCK_CPOL_0; /* 极性 */
spi_cfg_basic_info.cpha = WIFI_IOT_SPI_CFG_CLOCK_CPHA_0; /* 相位 */
/* Motorola protocol(成功) */ /* Texas Instruments protocol(失败) */ /* Microwire protocol(失败) */
spi_cfg_basic_info.framMode = WIFI_IOT_SPI_CFG_FRAM_MODE_MOTOROLA; /* 帧协议 */
spi_cfg_basic_info.dataWidth = WIFI_IOT_SPI_CFG_DATA_WIDTH_E_8BIT; /* 数据位宽 */
spi_cfg_basic_info.endian = WIFI_IOT_SPI_CFG_ENDIAN_LITTLE; /* 小端 */
spi_cfg_basic_info.freq = 1000000; /* 频率 */ //1M
SpiInit(WIFI_IOT_SPI_ID_0, init_param, &spi_cfg_basic_info);
SPI0_ReadWriteByte(0xFF); //启动传输
}
void RC522_HW_Config(void)
{
PcdReset();
PcdAntennaOff();
usleep(5000);
PcdAntennaOn();
}
void RC522_Init(void)
{
RC522_GPIO_Init();
RC522_HW_Config();
}
这里需要注意的是其中的通信协议类型:framMode
一定要选WIFI_IOT_SPI_CFG_FRAM_MODE_MOTOROLA
,否则选另外的两个是不行的。
如下图所示:
二、测试
编写测试代码
unsigned char status;
unsigned char g_ucTempbuf[20];
unsigned char UID[5];
void RC522_Dispose(void)
{
unsigned char i;
status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
if (status != MI_OK)
{
return;
}
printf("PcdRequest success\r\n");
status = PcdAnticoll(UID);//防冲撞
if (status != MI_OK)
{
return;
}
printf("PcdAnticoll success\r\n");
printf("RC522-ID:");
for(i=0;i<4;i++)
printf("[%2X]",UID[i]);
printf("\r\n");
}
测试结果如下图所示: