主题中讨论的其他器件: TRF7970A、 CC3200
您好!
我正在尝试使用 C3200 Launchpad 为卡仿真模式编写 DLP-7970ABP 代码。
在浏览了技术文档和 TRF7970A 的参考代码之一之后、我已经完成了初始化、使 DLP-7970ABP 成为 A 类侦听 Android 手机命令的目标模式。 下面是代码。
无效
Trf796xInitialSettings (空)
{
unsigned int i;
u08_t 命令[7];
u08_t ISO_CONTROL;
u08_t temp1[30];
u08_t temp2[20];
如果(1)
{
命令[0]= SOFT_INIT;
Trf7970DirectCommand (命令);
COMMAN[0]=空闲;
Trf7970DirectCommand (命令);
McuDelayMillisecond(3);
//寄存器00h。 芯片状态控制寄存器
命令[0]= 0x00;
命令[1]= 0x20;
//发送器打开- 3V 工作电压
Trf7970WriteSingle (&command[0]、2);
命令[0]= 0x01;
命令[1]= 0xA4;//0x24;//类型 A
// 106kbps 标签仿真器14443A 模式
Trf7970WriteSingle (&command[0]、2);
//用一个额外的虚拟时钟复位 FIFO
命令[0]= 0x0F;
Trf7970DirectCommand (命令);
//寄存器02h。 ISO14443B TX 选项寄存器
COMMAN[0]= ISO_14443B_OPTIONS;
命令[1]= 0x01;
#if 1.
//
//自动 SDD 禁用
//
命令[1]= 0x00;
#endif
//自动 SDD 配置(符合 ISO14443A 4层标准)
Trf7970WriteSingle (&command[0]、2);
//寄存器09h。 调制器和 SYS_CLK 控制寄存器
//选项1:
// BIT6 - OOK 调制被启用
//选项2:
// BIT0 - OOK (100)
COMMAN[0]=调制器控制;
命令[1]= 0x01;
//无 SYS_CLK 输出、调制 OOK (100%)
Trf7970WriteSingle (&command[0]、2);
//寄存器0Ah。 RX 特别设置寄存器
COMMAN[0]= RX_SPECIAL_SETTINGS;
命令[1]= 0x30;
//位5 -带通450kHz 至1.5MHz -适用于 ISO14443A/B 中使用的曼彻斯特编码848kHz 副载波
//位4 -带通100kHz 至1.5MHz -适用于高比特率 ISO14443中使用的最高比特率(848kbps)
Trf7970WriteSingle (&command[0]、2);
//寄存器0Bh。 RX 特别设置寄存器
COMMAN[0]=稳压器_CONTROL;
命令[1]= 0x87;
//自动调节器设置
Trf7970WriteSingle (&command[0]、2);
//寄存器14h。 FIFO IRQ 电平寄存器
COMMAN[0]= FIFO_IRQ_LEVEL;
命令[1]= 0x0F;
//为 RX 高电平设置 FIFO IRQ 电平= 96字节和 TX 低电平32字节
Trf7970WriteSingle (&command[0]、2);
//寄存器16h。 NFC 低场侦测水平寄存器
COMMAND_0]= NFC_LOW_DETection;
命令[1]= 0x83;
//位7 -禁用时钟提取器- NFC 无源106kbps 和 ISO14443A 卡仿真
//位2:0 =用于 RF 冲突避免的 RF 场水平(显示在寄存器0x19的 B6中)
Trf7970WriteSingle (&command[0]、2);
命令[0]= NFCID;
对于(i=1;i < 11;i++)
Command[i]= TargetCID1[I-1];
// NFCID 编号(4、7或10字节)
Trf7970WriteCont (命令、11);
//寄存器18h。 NFC 目标方侦测水平寄存器
命令[0]= NFC_TARGET_LEVEL;
命令[1]= 0x27;//类型 A
#if 1.
//
//自动 SDD 禁用
//
命令[1]= 0x07;
#endif
//
//位7:6 - NFC 目标方侦测水平(NFCID 大小= 7)
//位5 -使用内部状态机的自动 SDD
//位2:0 =系统唤醒所需的 RF 场水平-显示在寄存器0x19的 B7中)
Trf7970WriteSingle (&command[0]、2);
//寄存器17h。 NFCID1编号寄存器
////寄存器1Ah。 测试寄存器(用于测试或直接使用)
COMMAND_0]= NFC_TEST_SETTING1_REG;
命令[1]= 0x40;
//设置第一个 RX 增益级
Trf7970WriteSingle (&command[0]、2);
//用一个额外的虚拟时钟复位 FIFO
命令[0]= 0x0F;
Trf7970DirectCommand (命令);
//块接收器,然后启用接收器
//--Resetting Decoders-//
命令[0]= STOP_解码 器;
Trf7970DirectCommand (命令);
命令[0]= run_decoders;
Trf7970DirectCommand (命令);
// radio_DIRECTCOMMAND (stop_decoders、buf);
// radio_DIRECTCOMMAND (run_decoders、buf);
TEMP1[0]= CHIP_STATE_CONTROL;
Trf7970ReadCont (temp1、0x17);
TEMP2[0]=NFC_TARGET_LEVEL;
Trf7970ReadCont (temp2、0x17);
ISO_CONTROL = ISO_CONTROL;
Trf7970ReadSingle (&ISO_CONTROL、1);
TEMP1[19]= NFC_TARGET_Protocol;
Trf7970ReadSingle (&temp1[19]、1);
while (1){
}
}
下面是中断代码
void Trf7970PortB (void)//中断处理程序
{
// GPIOIntClear (GPIOA0_BASE、GPIO_PIN_7);
u08_t IRQ_STATUS[4]、ISO_CONTROL;
u08_t 寄存器[4];
静态无符号 char retry_counter = 0;
IRQ_FLAG = 0x02;
// Sergey 修复 stop_counter;//停止计时器模式
RESET_COUNTER;
操作
{
GPIOIntClear (GPIOA0_BASE、GPIO_PIN_7);//中断标志清零
ISO_CONTROL = ISO_CONTROL;
Trf7970ReadSingle (&ISO_CONTROL、1);
Trf7970ReadIrqStatus (IRQ_STATUS);
寄存器[0]= IRQ_STATUS;
Trf7970ReadCont (寄存器、2);// IRQ 状态寄存器地址
// Trf796xReadSingle (&Register[0]、1);
寄存器[2]= NFC_TARGET_Protocol;
Trf7970ReadSingle (&Register[2]、1);
IF (寄存器[2]=0xC5)
Trf7970ISR (IRQ_STATUS);
//否则
// Trf796xInitialSettings();
if ((ISO_CONTROL & BIT5)!= BIT5)// RFID 模式
{
// Trf7970ISR (IRQ_STATUS);
}
} while (GPIOIntStatus (GPIOA0_BASE、1)& GPIO_PIN_7);
//__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);
}
根据我参考的 TRF7970A 技术文档和参考代码。 初始化后、如果我从寄存器"NFC 目标方协议寄存器(0x19)"中读取值、 则当产生中断时(当移动设备靠近 Booster Pack 时)、该值应为"0xC9"。 我在这里的观察结果是、该值有时不相同、有时为0x00、有时为0x09、有时为0xC9。
并且 IRQ 状态寄存器也提供值0x04而不是0x40、这是组帧错误。
在这种方法中出错的地方、任何人都能帮助解决这一问题。
此致、
Vamsi