主题中讨论的其他器件:TM4C123、 TRF7970A、
工具/软件:Code Composer Studio
我使用 tm4c123通过 SPI 驱动 DLP7970。 我正在尝试读取卡号和到期日期。 T0型智能卡通常不是问题、但在 T1卡上、它们通常只读作 MIFARE。 此错误的原因是什么? 为什么我只能读取某些卡上的 MIFARE 信息?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我使用 tm4c123通过 SPI 驱动 DLP7970。 我正在尝试读取卡号和到期日期。 T0型智能卡通常不是问题、但在 T1卡上、它们通常只读作 MIFARE。 此错误的原因是什么? 为什么我只能读取某些卡上的 MIFARE 信息?
您好、Helfried、
感谢您的回答。
我正在使用 T4T 型智能卡。 我可以读取 MasterCard 卡。 在签证卡中、下面发送的 T4T 属于错误状态。
使用此结构、我可以从母卡中读取卡号和到期日期信息。 但在签证卡中、这属于我在下面用粗体标记的错误。
void T4T_stateMachine (void)
{
tISO7816ConnectionStatus sISO7816Status;
uint16_t ui16RxLength;
uint8_t * pui8RxData;
uint8_t pui8LenBuffer[3];
uint8_t pdolLen = 0;
uint8_t i;
//等待某种状态的响应
if (g_bT4WaitForRsp)
{
开关(g_eT4State)
{
案例 T4T_APP_SEL:
sISO7816Status = ISO_7816_4_getSelectStatus ();
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
#ifdef NFC_debug
if (((offset + ui16RxLength)>= 1024)
偏移= 0;
memcpy (whole+offset、pui8RxData、ui16RxLength);
偏移+= ui16RxLength;
#endif
if (sISO7816Status = ISO_7816_4_connection_select_Success)
{
G_bT4WaitForRsp =错误;
pdolLen = parseForPDOL (pui8RxData);
G_eT4TState = T4T_EMV_GET_PROC;
//g_eT4TState =T4T_EMV_READ_REC_TEST;
}
否则、如果(sISO7816Status = ISO_7816_4_connection_select_fail)
{
G_bT4WaitForRsp =错误;
//g_eT4TState = T4T_ERROR;
//TODO:在这里应该做什么
//if ((((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6A82)
{
aidIdx++;
}
if (aidIdx >= AID_COUNT)
{
//g_eT4TState = T4T_ERROR;
G_eT4TState = T4T_SELECTED_IDLE;
//Serial_printfLine ("辅助不支持");
}
}
中断;
案例 T4T_EMV_READ_REC_ALL:
sISO7816Status = ISO_7816_4_getWriteRawStatus();
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
#ifdef NFC_debug
if (((offset + ui16RxLength)>= 1024)
偏移= 0;
memcpy (whole+offset、pui8RxData、ui16RxLength);
偏移+= ui16RxLength;
#endif
if (sISO7816Status = ISO_7816_4_connection_write_raW_Success)
{
G_bT4WaitForRsp =错误;
parseForData_CL (pui8RxData);
if (foundObj_CL >= 3)
{
G_eT4TState = T4T_SELECTED_IDLE;
}
if (recno > 6)
{
RecNo = 1;
sfiNo++;
if (sfiNo > 6)
{
G_eT4TState = T4T_SELECTED_IDLE;
}
}
其他
RecNo++;
//转至选择功能容器
}
否则、如果(sISO7816Status = ISO_7816_4_connection_write_raW_FAIL)
{
G_bT4WaitForRsp =错误;
//if ((((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6A82 ||
//(((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6A83 ||
//(((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6A86)
if (((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6985)
{
_nop();
_nop();
}
{
if (recno > 6)
{
RecNo = 1;
sfiNo++;
if (sfiNo > 6)
{
G_eT4TState = T4T_SELECTED_IDLE;
}
}
其他
RecNo++;
if (((pui8RxData[0]<< 8)| pui8RxData[1])= 0x6985)
_nop();
}
/*else
{
//g_eT4TState = T4T_ERROR;
//recNo++;
}*/
}
中断;
案例 T4T_EMV_GET_PROC:
sISO7816Status = ISO_7816_4_getWriteRawStatus();
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
#ifdef NFC_debug
if (((offset + ui16RxLength)>= 1024)
偏移= 0;
memcpy (whole+offset、pui8RxData、ui16RxLength);
偏移+= ui16RxLength;
#endif
if (sISO7816Status = ISO_7816_4_connection_write_raW_Success)
{
G_bT4WaitForRsp =错误;
parseForFiles (pui8RxData);
recNo = FileRecords[fileIdx].startRec;
sfiNo =文件记录[fileIdx].SFI;
//转至选择功能容器
//g_eT4TState = T4T_SEL_CC;
G_eT4TState = T4T_EMV_READ_REC;
}
否则、如果(sISO7816Status = ISO_7816_4_connection_write_raW_FAIL)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_EMV_READ_REC_ALL;
}
中断;
案例 T4T_EMV_READ_REC:
sISO7816Status = ISO_7816_4_getWriteRawStatus();
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
#ifdef NFC_debug
if (((offset + ui16RxLength)>= 1024)
偏移= 0;
memcpy (whole+offset、pui8RxData、ui16RxLength);
偏移+= ui16RxLength;
#endif
if (sISO7816Status = ISO_7816_4_connection_write_raW_Success)
{
G_bT4WaitForRsp =错误;
parseForData_CL (pui8RxData);
RecNo++;
if (recNo > FileRecords[fileIdx].endRec)
{
fileIdx++;
recNo = FileRecords[fileIdx].startRec;
if (fileIdx < numOfFiles)
{
sfiNo =文件记录[fileIdx].SFI;
G_eT4TState = T4T_EMV_READ_REC;
}
其他
{
G_eT4TState = T4T_SELECTED_IDLE;
//if (foundObj_CL)
//printdata();
AidIdx = 0;
fileIdx = 0;
//foundObj_CL = 0;
}
}
//转至选择功能容器
}
否则、如果(sISO7816Status = ISO_7816_4_connection_write_raW_FAIL)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_ERROR;
}
中断;
案例 T4T_ERROR:
serial_printfLine ("T4T 错误");
中断;
案例 T4T_SEL_CC:
sISO7816Status = ISO_7816_4_getSelectStatus ();
if (sISO7816Status = ISO_7816_4_connection_select_Success)
{
G_bT4WaitForRsp =错误;
//转至读取功能容器
G_eT4TState = T4T_Read_CC;
}
否则、如果(sISO7816Status = ISO_7816_4_connection_select_fail)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
案例 T4T_Read_CC:
sISO7816Status = ISO_7816_4_getReadStatus ();
if (sISO7816Status = ISO_7816_4_connection_read_Success)
{
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
// MLE
G_ui8NdefMaxReadBytes = pui8RxData[4];
// MLC
G_ui8NdefMaxWriteBytes = pui8RxData[6];
// NDEF 文件 ID
G_pui8NDEFFileId[0]= pui8RxData[9];
G_pui8NDEFFileId[1]= pui8RxData[10];
//检查 NDEF 只读标志
if (pui8RxData[14]> 0x00)
{
G_bNdefReadOnly = true;
}
其他
{
G_bNdefReadOnly = false;
}
G_bT4WaitForRsp =错误;
//检查版本号是否为3.0
if (pui8RxData[2]= 0x30)
{
G_eT4TState = T4T_SELECTED_IDLE;
}
//检查版本号是否为2.2
否则、如果(pui8RxData[2]= 0x20 || pui8RxData[2]= 0x22)
{
//转至选择 NDEF 文件
G_eT4TState = T4T_SEL_NDEF_FILE;
}
其他
{
G_eT4TState = T4T_SELECTED_IDLE;
}
}
否则、如果(sISO7816Status = ISO_7816_4_connection_read_FAIL)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
案例 T4T_SEL_NDEF_FILE:
sISO7816Status = ISO_7816_4_getSelectStatus ();
if (sISO7816Status = ISO_7816_4_connection_select_Success)
{
G_bT4WaitForRsp =错误;
//转至读取 NDEF 文件长度
G_eT4TState = T4T_READ_NDEF_LEN;
}
否则、如果(sISO7816Status = ISO_7816_4_connection_select_fail)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
案例 T4T_READ_NDEF_LEN:
sISO7816Status = ISO_7816_4_getReadStatus ();
if (sISO7816Status = ISO_7816_4_connection_read_Success)
{
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
G_ui16NdefLength =(uint16_t)(pui8RxData[0]<< 8)+(uint16_t) pui8RxData[1];
G_ui16NdefRemainingBytes = g_ui16NdefLength;
//重置索引
G_ui16T4TNdefIndex = 0x00;
G_bT4WaitForRsp =错误;
//具体取决于测试
//写入测试
//读取测试
if (g_ui16NdefRemainingBytes >0)
{
// Go 读取 NDEF 消息
G_eT4TState = T4T_READ_NDEF;
}
其他
{
//未完成剩余的字节时
G_eT4TState = T4T_SELECTED_IDLE;
}
}
否则、如果(sISO7816Status = ISO_7816_4_connection_read_FAIL)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
案例 T4T_Read_NDEF:
sISO7816Status = ISO_7816_4_getReadStatus ();
if (sISO7816Status = ISO_7816_4_connection_read_Success)
{
ISO_7816_4_getPacketStatus (&pui8RxData、&ui16RxLength);
ui16RxLength = ui16RxLength - 2;
//将 NDEF 存储在虚拟缓冲区中
memcpy (g_pui8T4TBuffer、pui8RxData、ui16RxLength);
serial_printBuffer (((char *) g_pui8T4TBuffer、ui16RxLength、rW_PAYLOAD_DATA);
//更新剩余的字节
G_ui16NdefRemainingBytes = g_ui16NdefRemainingBytes - ui16RxLength;
//增加存储索引
G_ui16T4TNdefIndex = g_ui16T4TNdefIndex + ui16RxLength;
G_bT4WaitForRsp =错误;
//完成后进入空闲状态
//完成 NDEF 消息后,我们完成了
if (g_ui16NdefRemainingBytes =0)
{
G_eT4TState = T4T_SELECTED_IDLE;
}
}
否则、如果(sISO7816Status = ISO_7816_4_connection_read_FAIL)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
案例 T4T_SELECTED_IDLE:
中断;
案例 T4T_WRITE_NDEF:
sISO7816Status = ISO_7816_4_getWriteStatus ();
if (sISO7816Status = ISO_7816_4_connection_write_success)
{
if (g_ui16NdefRemainingBytes = 0x00)
{
G_eT4TState = T4T_SELECTED_IDLE;
serial_printf ("写入成功!"、rw_status_data);
pui8LenBuffer[0]= 0x0D;
pui8LenBuffer[1]= 0x0A;
pui8LenBuffer[2]= 0x00;
serial_printf ((char *) pui8LenBuffer、RW_STATUS_DATA);
}
//完成测试
G_bT4WaitForRsp =错误;
}
否则、如果(sISO7816Status = ISO_7816_4_connection_write_fail)
{
G_bT4WaitForRsp =错误;
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
默认值:
中断;
}
}
//发送命令
if (g_bT4WaitForRsp = false)
{
开关(g_eT4State)
{
案例 T4T_APP_SEL:
if (ISO_7816_4_sendSelectApplication (AID_LIST_NFC[aidIdx]、7)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_EMV_READ_REC_ALL:
G_pui8ReadRec[0]= 0x00;
G_pui8ReadRec[1]= 0xB2;
G_pui8ReadRec[2]=重新编号;
G_pui8ReadRec[3]=(sfiNo << 3)| 0x04;
G_pui8ReadRec[4]= 0x00;
if (ISO_7816_4_sendAPDU (g_pui8ReadRec、5)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_EMV_GET_PROC:
if (ISO_7816_4_sendAPDU (g_pui8PROC、7 + pdolLen)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_EMV_READ_REC:
G_pui8ReadRec[0]= 0x00;
G_pui8ReadRec[1]= 0xB2;
G_pui8ReadRec[2]=重新编号;
G_pui8ReadRec[3]=(sfiNo << 3)| 0x04;
G_pui8ReadRec[4]= 0x00;
if (ISO_7816_4_sendAPDU (g_pui8ReadRec、5)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_ERROR:
NFC_RW_TRIGGERRWProtocolError();
中断;
案例 T4T_SEL_CC:
if (ISO_7816_4_sendSelectFile (g_pui8CCFileId、2)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_Read_CC:
if (ISO_7816_4_sendReadFile (0、0x0F)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_SEL_NDEF_FILE:
if (ISO_7816_4_sendSelectFile (g_pui8NDEFFileId、2)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_READ_NDEF_LEN:
if (ISO_7816_4_sendReadFile (0、0x02)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
中断;
案例 T4T_Read_NDEF:
if (g_ui16NdefRemainingBytes > g_ui8NdefMaxReadBytes)
{
if (ISO_7816_4_sendReadFile (g_ui16T4TNdefIndex+2、g_ui8NdefMaxReadBytes)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
}
其他
{
if (ISO_7816_4_sendReadFile (g_ui16T4TNdefIndex+2、(uint8_t) g_ui16NdefRemainingBytes)= STATUS_SUCCESS)
{
G_bT4WaitForRsp = true;
}
}
中断;
案例 T4T_SELECTED_IDLE:
//foundObj_CL = 0;
nameFound = 0;
PANFound = 0;
ExpDateFound = 0;
AidIdx = 0;
RecNo = 1;
sfiNo=1;
中断;
案例 T4T_WRITE_NDEF:
//如果要写入的剩余字节数小于最大字节数
if (g_ui16NdefRemainingBytes >0)
{
if (g_ui16NdefRemainingBytes >(uint16_t) g_ui8NdefMaxWriteBytes)
{
//出于功能目的清除 NDEF Len
if (ISO_7816_4_sendWriteFile (g_ui16T4TNdefIndex、g_ui8NdefMaxWriteBytes、&g_pui8T4TBuffer[g_ui16T4TNdefIndex])=status_Success)
{
G_bT4WaitForRsp = true;
G_ui16NdefRemainingBytes = g_ui16NdefRemainingBytes -(uint16_t) g_ui8NdefMaxWriteBytes;
}
}
其他
{
//出于功能目的清除 NDEF Len
if (ISO_7816_4_sendWriteFile (g_ui16T4TNdefIndex、(uint8_t) g_ui16NdefRemainingBytes、&g_pui8T4TBuffer[g_ui16T4TNdefIndex])=status_Success)
{
G_bT4WaitForRsp = true;
G_ui16NdefRemainingBytes = 0;
}
}
}
其他
{
G_eT4TState = T4T_SELECTED_IDLE;
}
中断;
默认值:
中断;
}
}
}
您好、Onur、
好的、需要注意的一点是:TRF7970A 由于勘误项 器件#B01: https://www.ti.com/lit/er/sloz011b/sloz011b.pdf、无法通过 EMVco 测试
由于我们不适合支付系统、因此我们尚未为此进行任何开发。
至于错误、我怀疑卡拒绝了发送的命令-这是导致该错误的最常见原因。 当卡收到无效命令时、它们将回复、然后 NFC 堆栈将向较低级别报告失败。 因此、您需要查看使用的命令序列。
如果我记得对、万事达卡和维萨有不同的序列、但这只是我四年前所了解到的情况、很遗憾在很长一段时间内没有提及任何内容、因此无法真正提供更多反馈。 希望这足以让您向前迈进。
您好、Onur、
[报价用户="Onur Ilyas YAVUZ"]此问题是否是由设备#B01错误引起的?
[报价 USER="Onur Ilyas YAVUZ">我们是否确定由于错误 Device#B01而在信用卡通信方面会出现问题? 还是可以解决这个问题?
勘误表仅会导致认证问题。 如果它影响了一张卡、那么您将完全无法与其通信。
[引用 user="Onur Ilyas YAVUZ">专用文件是在上述图像中发送帮助编号之前发送的。 在我共享的代码中、将发送一个直接帮助号码。 这是否会造成问题?
我不知道、我们没有经验、也不支持付款申请。
[报价用户="Onur Ilyas YAVUZ"]您是否曾使用过 trf7970应用过信用卡?我检查了所有应用手册,但我没有看到这样的示例。
不支持、这种应用不受支持、因为我们无论如何都无法通过 EVMco。
遗憾的是、只要这仍然是有关如何读取支付卡的应用特定问题、您就可以自行解决、这超出了我们能够支持的范围。
您好、Onur、
RSSI 基于信号强度、信号强度基于标签和读取器的天线耦合以及读取器的输出功率。
要增加输出功率、您需要在 GUI 中提供 TRF7970A 5V 并使用5V 模式-您必须编辑 Launchpad 才能这样做。
关于天线耦合、以下因素适用:
DLP-7970ABP 具有合适尺寸的天线、可与信用卡大小的标签配合使用。 它经过精心设计、支持所有 NFC 技术、包括 ISO14443边带所需的更宽带宽、且以13.56MHz 为中心。
但是、我已经看到、用于安全应用的某些 Mifare 标签有时会特意调谐到15-17MHz、以最大程度地减小读取范围、从而通过要求将标签放置在非常靠近读取器的位置来增强安全性。 使用支付卡可能也是如此、因此您会看到较低的 RSSI 结果。
[引用用户="Ralph Jacobi"]
要增加输出功率、您需要在 GUI 中提供 TRF7970A 5V 并使用5V 模式-您必须编辑 Launchpad 才能这样做。
[/报价]
我在 TRF7970驱动程序中进行如下设置。
uint8_t TRF79x0_init (void)
{
g_ui8IrqFlag = 0x00;
g_ui8TimeOutFlag = 0x00;
g_bTRFPowerSupply5V = true;
g_bTRFExtAmpEnable = false;
MOD_DIR_OUT;
MOD_OFF;
//将从器件选择设置为输出方向
SLAVE_SELECT_PORT_SET;
//取消从器件选择
SLAVE_SELECT_HIGH 的置位;
//***** TODO:创建全局标志、还是要求用户在应用程序空间中执行此操作?
//必须在使能以具有 SS 模式的 SPI 启动之前将 I/O_2置为高电平。
SDM_TXENABLE_ON;
SDM_PORT_SET;
//********
//
// TRF79x0需要在使能线路上进行从低到高的转换。
//
//在 TRF79x0
TRF_DISABLE 上设置 EN = 0;
//将 EN 设置为输出方向
ENABLE_PORT_SET;
//等待系统时钟启动
MCU_delayisecMillond (10);
//在 TRF 79xx
TRF_ENABLE 上设置 EN = 1;
//
TRF79x0需要在使能线路上进行从低电平到高电平转换。
//
//////在 TRF79x0上设置 EN = 0
//TRF_DISABLE2;
////将 EN 设置为输出方向
//ENABLE_PORT_SET;
//ENABLE2_PORT_SET;
//等待系统时钟启动
//MCU_delayisecond (3)
;// TSALE2;//(1);// TDIESIESU2;//
////在 TRF 79xx 上设置 EN = 1
//TRF_ENABLE;
SPI_setup();
//
为 TRF7970A 上的 IRQ 引脚启用一个低电平到高电平的中断//
IRQ_PIN_SET;
IRQ_EDGE_SET;
IRQ_INT_ON;
IRQ_CLR;
//SDM_BITCLK_PIN_SET;
//SDM_BITCLK_EDGE_SET;
//SDM_BITCLK_CLR;
//SDM_BITCLK_INT_ON;
MCU_delayMillisecond (10);
g_eTrf7970Version = TRF7970_A;
返回 STATUS_SUCCESS;
}
我将 DLP7970的电源输入连接到了5伏。
我还在 NFC 上进行了如下配置。
我可以进行其他调整吗?
谢谢你。
您好、Ralph、
[引用用户="Ralph Jacobi"]
您好、Onur、
假设它是信用卡大小的标签、正确。 您看到的范围是多少?
[/报价]
读卡距离约为2-3厘米。
[引用用户="Ralph Jacobi"]
如果您可以使用频谱分析仪和第三台打印机、如果您想了解标签共振、我可以向您发送一种测量方法。 可能不值得您花时间、但希望提供的只是无实例。
您好、Onur、
请参阅随附的演示 文稿:e2e.ti.com/.../5165.How-to-use-Network-Analyzer-to-measure-resonant.ppt