RC522与STM32F103通信
void InitRc522(void)
{
Spi_IO_Init();
PcdReset();
PcdAntennaOff();
delay_ms(2);
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
}
我使用的是SPI通信的方式与RC522进行通信,其中天线的初始化是必须的。通信成功后可以进行后续的配置。
寻卡、防冲突、完成选卡
void RC522_Config ( void )
{
uint8_t ucStatusReturn; //返回状态
uint8_t flag_station = 1; //跳出函数的标志位
while ( flag_station )
{
/* 寻卡(方式:范围内全部),第一次寻卡失败后再进行一次,寻卡成功时卡片序列传入数组ucArray_ID中 */
if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )
ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/* 防冲突操作,被选中的卡片序列传入数组ucArray_ID中 */
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
// sprintf ( id_cpu, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );
// printf ("%srn", id_cpu );
if ( PcdSelect ( ucArray_ID ) == MI_OK )
{
printf ("nRC522 is Ready!n");
flag_station = 0;
}
}
}
}
}
这里完成后就已经完成对复旦CPU卡的通信了,后面可以通过命令进行操作,接下来的发卡流程可以参考复旦微电子CPU卡发卡流程
这里博主已经写的很详细,我简略提一下其中我碰到的问题。
DES算法进行随机数加密
在进行外部认证进行随机数加密的时候,我发现开发手册里是没有给出DES加密的指令,因此当时是自己找了一个可以用的DES加密算法对随机数进行加密,然后将加密后的八字节数送入外部认证命令当中。
//取随机数
res = FM1208_GetChallenge(ran_number_long, ran_number);
if (res == 0x9000) {
printf("random number generated: rn");
for(int i = 0; i < 8; i++)
printf ( "%x " , ran_number
);
printf("rn");
}
else
printf ( "random get failed!, error code: %xrn", res);
memset(des_encrypted_code, 0x00, 8); //清0
//其中newkey是我自己写入的密钥,卡的初始密钥为八字节的FFFFFFFF。
DES_Encrypt(ran_number, new_key, des_encrypted_code);
printf("des encrypted code: rn");
for(int i = 0; i < 8; i++)
printf ( "%x " , des_encrypted_code);
printf("rn");
//外部认证
res = FM1208_External_Authenticate(0x00, des_encrypted_code, g_cReceBuf);
if (res == 0x9000) {
printf("card authenticated.rn");
}
else {
printf("Authenticate failed, error code: %xrn", res);
}
二进制文件的读写问题
当我外部认证完成,创建完二进制文件后,发现当外部认证失败的时候,二进制文件也同样可以进行读写,经过一段时间的研究后,发现可以通过PIN加密,来实现对读写操作的权限设置。这里可以先看明白手册中的FMCOS 独特的安全体系,然后可以进行相应的指令配置,就可以设置PIN进行安全认证了。
RC522与STM32F103通信
void InitRc522(void)
{
Spi_IO_Init();
PcdReset();
PcdAntennaOff();
delay_ms(2);
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
}
我使用的是SPI通信的方式与RC522进行通信,其中天线的初始化是必须的。通信成功后可以进行后续的配置。
寻卡、防冲突、完成选卡
void RC522_Config ( void )
{
uint8_t ucStatusReturn; //返回状态
uint8_t flag_station = 1; //跳出函数的标志位
while ( flag_station )
{
/* 寻卡(方式:范围内全部),第一次寻卡失败后再进行一次,寻卡成功时卡片序列传入数组ucArray_ID中 */
if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )
ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/* 防冲突操作,被选中的卡片序列传入数组ucArray_ID中 */
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
// sprintf ( id_cpu, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );
// printf ("%srn", id_cpu );
if ( PcdSelect ( ucArray_ID ) == MI_OK )
{
printf ("nRC522 is Ready!n");
flag_station = 0;
}
}
}
}
}
这里完成后就已经完成对复旦CPU卡的通信了,后面可以通过命令进行操作,接下来的发卡流程可以参考复旦微电子CPU卡发卡流程
这里博主已经写的很详细,我简略提一下其中我碰到的问题。
DES算法进行随机数加密
在进行外部认证进行随机数加密的时候,我发现开发手册里是没有给出DES加密的指令,因此当时是自己找了一个可以用的DES加密算法对随机数进行加密,然后将加密后的八字节数送入外部认证命令当中。
//取随机数
res = FM1208_GetChallenge(ran_number_long, ran_number);
if (res == 0x9000) {
printf("random number generated: rn");
for(int i = 0; i < 8; i++)
printf ( "%x " , ran_number
);
printf("rn");
}
else
printf ( "random get failed!, error code: %xrn", res);
memset(des_encrypted_code, 0x00, 8); //清0
//其中newkey是我自己写入的密钥,卡的初始密钥为八字节的FFFFFFFF。
DES_Encrypt(ran_number, new_key, des_encrypted_code);
printf("des encrypted code: rn");
for(int i = 0; i < 8; i++)
printf ( "%x " , des_encrypted_code);
printf("rn");
//外部认证
res = FM1208_External_Authenticate(0x00, des_encrypted_code, g_cReceBuf);
if (res == 0x9000) {
printf("card authenticated.rn");
}
else {
printf("Authenticate failed, error code: %xrn", res);
}
二进制文件的读写问题
当我外部认证完成,创建完二进制文件后,发现当外部认证失败的时候,二进制文件也同样可以进行读写,经过一段时间的研究后,发现可以通过PIN加密,来实现对读写操作的权限设置。这里可以先看明白手册中的FMCOS 独特的安全体系,然后可以进行相应的指令配置,就可以设置PIN进行安全认证了。
举报