【超详细】TRF7960的开发(有代码)

背景说明

通过TI的TRF7960a与C8051f340对13.56MHz进行项目开发,实现15693协议,14443A/B协议,Tag-it协议的读写操作。


项目经过

  1. 了解15693,14443A/B,Tag-it的协议内容,熟悉各个协议的工作流程,尤其指令的含义与功能。理解各个协议直接的异同,并对对应协议的PICC进行分析,通过了解内部存储的分块及各分块的数据存储容量。

  2. 了解C8051f340的操作,并进行demo的编写。主要关注于时钟时序的理解,以及常用外部中断和定时器的使用。仔细摸索实验箱13.56.mhz部分电路,主要关注c8051f340各端口的连接,以及trf7960与c8051f340的连接。通过demo来测试各个端口是否能正常连接和工作。

  3. 收集相关开发文档和程序源码,在其他大佬的工作基础上进行快捷开发。主要的参考代码有:实验箱的实验代码,MSP340+TRF7960中文代码(另一个13.56MHz箱子),MSP340+TRF7960英文代码(来自于csdn),以及TI公司提供的代码(其实是TRF7970A的代码,与TRF7960A有不同)。

  4. 2018/11/6—2018/1/15
    编写初步demo,开始为15693,接着为14443a/b,tag-it。首先将实验箱的代码通过KEIL编译运行,由于只有15693协议的PICC防碰撞,没有对于PICC的其他功能的处理。在参考15693协议和对应的PICC的文档后,实现了读写功能以及读取安全状态, 写AFI,写DSFID等功能。然后基于其他三个基于MSP430的代码,完成了14443A,14443B,tag-it的函数功能的编写。

  5. 对代码进行debug。由于之前没有相关C8051作为主控芯片的TRF7960的案例,所以以MSP430为基础的代码改写存在问题,导致PICC没有反应。通过debug其中的寄存器和buff发现其中数据正确,但是PICC依然没有反应。问题在于中断处理和时序问题。


目前进度

实现了15693的防碰撞以及其他读写功能,而其他协议射频芯片对PICC没有响应。


问题说明

  1. anticollision.c中的RequestCommand函数中,多次对i_reg赋值为1,而程序中有多个while(i_reg==1)的死循环,导致程序卡死。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于这个问题,我思考如下:RequestCommand函数在15693协议中也用到了。在debug之后发现,但是在函数中,while语句之前程序进入了Port_0函数(即外部中断函数),中断函数中有一个中断处理函数InterruptHandlerReader(),在这个函数中i_reg值进行改变了。因此对于14443A/B和Tag-it来说,问题应该在于中断函数。在进行debug后又发现,中断函数处理第一次发送指令给TRF7960进行了响应,所以i_reg的值变为了0x00。但是之后,程序对i_reg进行赋值为1,在while之前就没有产生中断。于是就不可能改变i_reg的值。
我尝试将赋值语句注释掉,但是后面又无法进入AnticollisionLoopA()函数,于是程序陷入死局。

  1. 在上一个问题的基础上,尝试探究为什么TRF7960对14443A/B的PICC没有响应。
    首先就是对于参数设置的再次对应,发现这没有问题。然后又考虑了时钟频率的问题,这部分可能真的有问题,因为c8051内部为12M晶振,这个频率的晶振时间最不准确,因此问题可能就是出在这。还考虑过C8051对TRF7960a指令没有写入,但是读取buff里面数据后发现是成功写入了TRF7960的,说明TRF7960没有执行指令,或是执行指令但是PICC没有响应。这个问题尝试过查找资料。
  2. 之前由于不知道TI公司没有被“墙”,所以在CSDN上傻乎乎的花了很多积分下载相关资料,而且许多还是重复。在TI的资料中提到可以支持15693,14443A/B,tag-it等13.56MHz协议,但是提供的资料只有15693和14443b。在这里插入图片描述
    且提供的源码为TRF7970的
    在这里插入图片描述
    接着在国内搜索相关问题和类似用TRF7960进行读取的案例,资料很少,而且基本上都没有用c8051作为主控。然后在国外进行搜索,刚好有类似的帖子

在这里插入图片描述
但是这个问题也没有解决,网友提供的解决方案也都试过,都没有用。
在这里插入图片描述
还有一些大佬做过类似工作,但是也只完成了15693协议部分

  1. 还有的问题就比较奇诡了,例如开始说道15693协议 也用到了RequestCommand()函数,但是我在这个函数中,断点位置不同,到某个地方的值就完全不同,而且不同的值导致程序运行的结果完全不同,一个正常运行,一个就陷入循环。在这里插入图片描述
  2. 还有的问题就是对于串口发送和接收的问题,即C8051能通过sendchar()函数发送出去字符,但是没有办法通过void RXhandler (void) interrupt 4接收到数据。而且sendchar函数的构造也很奇诡
sendchar(char TXchar)
{
     
      if (TXchar == '\n')  {                // check for newline character
         while (!TI0);                 // wait until UART0 is ready to transmit
         TI0 = 0;                      // clear interrupt flag
         SBUF0 = 0x0d;                 // output carriage return command
      }
      while (!TI0);                    // wait until UART0 is ready to transmit
      TI0 = 0;
	  SBUF0 = TXchar;                         // clear interrupt flag
      return (SBUF0);              // output <c> using UART 0
}

资料整理

我将我收集到的所有关于TRF7960的资料的放到了github上面,如果您认可的话希望能给我一个star。
地址

发布了150 篇原创文章 · 获赞 450 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/Caoyang_He/article/details/89003360