中级会员
积分 211
金钱 211
注册时间 2015-12-6
在线时间 47 小时
10 金钱
本帖最后由 我是520老谢 于 2017-1-19 14:46 编辑
最近在看TRF7963A的资料,关于TI提供的例程,有个地方没看明白,如果有使用过的人,希望可以不吝赐教,先谢过了。
使用 Trf796xRawWrite(&buf[0], 6);的时候,这些参数是这样的
buf[0] = 0X8F 复位FIFO,
buf[1] = 0X91 带CRC,
buf[2] = 0X3D 连续写寄存器
buf[3] = 0X00 写到0x1D寄存器的值
buf[4] = 0X20 寄存器1E,传输的字节数。
buf[5] = 0X31 [RD 2B command] ------ 最后这个我就没看明白什么意思了前面的都还好对应,但是最后的这条指令看备注还是没看明白表示的是什么?
//buf[6+30] = rd2b; // addressed block
Trf796xRawWrite(&buf[0], 7); // set Special Function Register
是不是读两个字节命令
--------------------------------------------------------------------------------------------------相似的还有下面这个,都是类似的。
buf[0] = 0x8F; //复位 FIFO
buf[1] = 0x90; //发送命令,不带CRC
buf[2] = 0x3D; //连续写寄存器,0X1D
buf[3] = 0x00; //0XID的值
buf[4] = 0x0F; //寄存器0X1E(传输的字节数) 【发送的是破碎字节,就是一个不完整的字节】
{关于bit1~bit3,破碎字节的位数。bit0不完整字节的标志位,表示这是一个不完整的字节,只有3个bit.那么为什么发送REQA和WUPA需要使用破碎字节的方式。}
buf[5] = 0x26; //发送REQA
Trf796xRawWrite(&buf[0], 6);
--------------------------------------------------------------------------------------------------
在TI的的论坛中还看到了这么一个
用连写寄存器的方式。
如发两字节0102就写8f913d00200102,可以用示波器看到数据正常发送(带crc)。
但如只想发1字节数据如0xa3,就写8f913d0010a3,但示波器观察不到数据发出,没有任何中断产生!
那么8f 91 3d 00 20 0102
8f 91 3d 00 10 a3
我想了一下,是不是说,20 就是传输两个字节
10就是传输一个字节
但是这都是我的猜测,还是不太明白。所以有了解的希望可以一起讨论
经过查看寄存器的一些介绍
http://www.icpdf.com/PartnoView.asp?id=8345318_256232&page=55#view
上面有说明 0X1D 和 0X1E寄存器的介绍。关于破碎字节。
貌似写入到0X1E的就是需要发送的字节的长度:
写个例子:eg
buf[0] = 0x8F; // reset FIFO
buf[1] = 0x91; // send with CRC
buf[2] = 0x3D; // write continuous from register
buf[3] = 0x00; // value for register 1D
buf[4] = 0xA0; // register 1E (# of bytes to be transmitted)
buf[5] = 0xA1; // WR2B command
//buf[6] = wr2b;
Trf796xRawWrite(&buf[0], 15);
节选另外的一段代码,表示发送的字节长度是10个,那么10 + 5(bit0~bie4) = 15;
/*******************************************************************************/
buf[0] = 0x8F; // reset FIFO
buf[1] = 0x91; // send with CRC
buf[2] = 0x3D; // write continuous from register
buf[3] = 0x00; // value for register 1D
buf[4] = 0x60; // register 1E (# of bytes to be transmitted)
buf[5] = 0xA2; // WR2B command
//buf[6] = wr1b;
Trf796xRawWrite(&buf[0], 11);
那么这么看这个register 1E (# of bytes to be transmitted) ,的确是代表的是发送的是数据长度。
疑问2:
else if((*irq_status & BIT1) == BIT1)
{
#ifdef ENABLE14443A
//读取碰撞位置
coll_poss = COLLISION_POSITION;
Trf796xReadSingle(&coll_poss, 1);
len = coll_poss - 0x20; // number of valid bytes if FIFO
if((len & 0x0f) != 0x00) len = len + 0x10; // add 1 byte if broken byte recieved
//添加一个字节如果接受到打断字节
len = len >> 4;
1、读写器触发了中断,
2、判断中断位碰撞错误的位置
3、将碰撞位置- 0x20, 这个可以获取FIFO字节的有效位,这个是怎么获取这个计算方式的。
我来回答