📄 ri-r6c-001a.c
字号:
#include <ht46r24.h>
#define SCLOCK _pa3
#define CCLOCK _13_3 //时钟控制权的设置
#define M_ERR _pa2
#define DIN _pa1
#define DOUT _pa0
#define LED _pc0
#define HTTX _pd0
#define HTTR _pd1
#define T 90 //波特率 9600 = 4M/4/(T+14) ===> T = 90
#define merr 0x40
/////////////////////////////////////////////////////////////////////////////////////
// HT46R24初始化
/////////////////////////////////////////////////////////////////////////////////////
void init(){
_pac = 0x05; //其中SCLOCK、DIN初始化为输出,M_ERR、DOUT初始化为输入
_pa = 0x00;
_pcc = 0x00; //全部设置为输出
_pc = 0x00;
_pdc = 0x02; //HTTX设置为输出、HTTR设置为输入
_pd = 0x00;
}
//////////////////////////////////////////////////////////////////////////////////////
// 延时函数
//////////////////////////////////////////////////////////////////////////////////////
void delay()
{
_nop();
_nop();
_nop();
_nop();
}
//////////////////////////////////////////////////////////////////////////////////////
// 向串口发送一个字节
//////////////////////////////////////////////////////////////////////////////////////
void transmit(unsigned char val)
{
unsigned char i;
HTTX = 0;
for(i=0; i<8; i++)
{
_delay(T);
if (val & 1)
HTTX = 1;
else
HTTX = 0;
val >>= 1;
}
_delay(T);
HTTX = 1;
_delay(T);
}
//////////////////////////////////////////////////////////////////////////////////////
// 从串口接收一个字节
//////////////////////////////////////////////////////////////////////////////////////
void receive(unsigned char *val)
{
unsigned char i, v;
v = 0;
while(HTTR); //wait start bit
for(i=0; i<8; i++)
{
_delay(T);
if (HTTR)
v |= (unsigned char)0x80;
v >>= 1;
}
_delay(T); //skip stop bit
_delay(T);
*val = v;
}
//////////////////////////////////////////////////////////////////////////////////////
// CRC效验函数
//////////////////////////////////////////////////////////////////////////////////////
unsigned int CRC(unsigned char *cBuffer, unsigned int iBufLen, bit fan)
{
unsigned int i, j;
unsigned long wPolynom = 0x8408, wCrc = 0xffff;
for (i = 0; i < iBufLen; i++)
{
wCrc ^= cBuffer[i];
for (j = 0; j < 8; j++)
{
if (wCrc &0x0001)
{
wCrc = (wCrc >> 1) ^ wPolynom;
}
else
{
wCrc = wCrc >> 1;
}
}
}
if (fan)
{
wCrc = ~wCrc;
}
return wCrc;
}
//////////////////////////////////////////////////////////////////////////////////////
// 时钟信号函数
//////////////////////////////////////////////////////////////////////////////////////
void clock(void)
{
_nop();
SCLOCK = 1;
delay();
SCLOCK = 0;
}
///////////////////////////////////////////////////////////////////////////////
// 开始信号函数
///////////////////////////////////////////////////////////////////////////////
void start()
{
SCLOCK = 0;
delay();
DIN = 0;
delay();
SCLOCK = 1;
delay();
DIN = 1;
delay();
SCLOCK = 0;
delay();
}
///////////////////////////////////////////////////////////////////////////////
// 结束信号函数
///////////////////////////////////////////////////////////////////////////////
void stop()
{
SCLOCK = 0;
delay();
DIN = 1;
delay();
SCLOCK = 1;
delay();
DIN = 0;
delay();
SCLOCK = 0;
delay();
}
///////////////////////////////////////////////////////////////////////////////
// TRAN1
///////////////////////////////////////////////////////////////////////////////
void tran1()
{
SCLOCK = 0;
DIN = 1;
delay();
CCLOCK = 1; //时钟控制权交给RI-R6C-001A
delay();
DIN = 0;
delay();
DIN = 1;
}
////////////////////////////////////////////////////////////////////////////////
// TRAN2
////////////////////////////////////////////////////////////////////////////////
void tran2()
{
DIN = 0;
delay();
DIN = 1;
delay();
DIN = 0;
delay();
}
////////////////////////////////////////////////////////////////////////////
// 发8位数据到RI-R6C-001A,低位在先
////////////////////////////////////////////////////////////////////////////
void SendByte(unsigned char datas)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
while (DOUT); //检测FIFO是否允许MCU发送是数据
DIN = (bit)(datas & 0x01);
clock();
datas = datas >> 1;
}
}
////////////////////////////////////////////////////////////////////////////
// 发8位数据到RI-R6C-001A,高位在先
////////////////////////////////////////////////////////////////////////////
void SendCmd(unsigned char datas, unsigned char length)
{
unsigned char i;
for (i = 0; i < length; i++)
{
while (DOUT); //检测FIFO是否允许MCU发送是数据
DIN = (datas >> (7 - i)) & 0x01;
clock();
}
}
/////////////////////////////////////////////////////////////////////////////
// 向RI-R6C-001A发送数据
/////////////////////////////////////////////////////////////////////////////
void SendData(unsigned char *sdatas, unsigned char length)
{
unsigned char i;
SendCmd(0x2b, 8); //命令编码选用‘2B’--->获取系统信息
for (i = 0; i < length; i++)
{
SendByte(sdatas[i]);
}
}
/////////////////////////////////////////////////////////////////////////////
// 初始化RI-R6C-001A
/////////////////////////////////////////////////////////////////////////////
void InitTIC(void)
{
SCLOCK = 0;
DIN = 0;
start(); //发送起始信号
SendCmd(0x7b, 8); //初始化时间寄存器
SendCmd(0x80, 8);
SendCmd(0xC0, 5);
stop();
start();
SendCmd(0x7D, 8); //初始化配置寄存器
SendCmd(0x2A, 8);
stop();
}
/////////////////////////////////////////////////////////////////////////////
// 从RI-R6C-001A接收数据
/////////////////////////////////////////////////////////////////////////////
unsigned char ReceiveData(unsigned char *datas, unsigned char len)
{
#define timeout 1000
unsigned char rd = 0, i = 0, j = 0, k = 0;
unsigned int time;
bit rdb;
time = 0;
while (!SCLOCK)
{
time++;
if (time > timeout)
{
return 0;
}
}
time = 0;
while (SCLOCK)
{
time++;
if (time > timeout)
{
return 0;
}
}
for (i = 0; i < len; i++)
{
time = 0;
while (!SCLOCK)
{
if (M_ERR == 1)
{
return merr;
}
time++;
if (time > timeout)
{
return 0;
}
}
rd = rd >> 1;
rdb = DOUT;
if (rdb == 1)
{
rd = rd | 0x80;
}
j++;
if (j == 0x08) // 已经有8位
{
datas[k] = rd;
k++;
rd = 0;
j = 0;
}
time = 0;
while (SCLOCK)
{
if (M_ERR == 1)
{
return merr;
}
time++;
if (time > timeout)
{
return 0;
}
}
}
return 1;
}
///////////////////////////////////////////////////////////////////////////////
// 获取电子标签的UID号
///////////////////////////////////////////////////////////////////////////////
unsigned char getid(unsigned char *id)
{
unsigned char datas[4]; //={0x03,0x2b,0xfe,0xba};
unsigned char buffer[17]; //={0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,};
//for(i=0;i<4;i++) buffer[i]=0xff;
buffer[0] = 0xff;
buffer[1] = 0xff;
buffer[2] = 0xff;
buffer[3] = 0xff;
//buffer[4] = 0;buffer[5] = 0;buffer[6] = 0;buffer[7] = 0;
//buffer[8] = 0;buffer[9] = 0;buffer[10] = 0;buffer[11] = 0;buffer[12] = 0;buffer[13] = 0;
//buffer[14] = 0;buffer[15] = 0;buffer[16] = 0;
datas[0] = 0x03;
datas[1] = 0x2b;
datas[2] = 0xfe;
datas[3] = 0xba;
start();
SendData(datas, 0x04);
stop();
tran1();
ReceiveData(buffer, 136);
tran2();
if (0xF0B8 == CRC(buffer, 14, 0)) //Calc the Receive-data CRC.
{
id[0] = buffer[9]; //
id[1] = buffer[8]; //
id[2] = buffer[7]; //
id[3] = buffer[6]; // return result
id[4] = buffer[5]; //
id[5] = buffer[4]; //
id[6] = buffer[3]; //
id[7] = buffer[2]; //
return (0x1); // CRC ok
}
else
{
return (0x0); //CRC error
}
}
/////////////////////////////////////////////////////////////
// main()函数
/////////////////////////////////////////////////////////////
void main()
{
char tmp,i;
unsigned char id[8];
LED = 0;
delayms(500);
LED = 1;
init();
InitTIC(); //配置RI-R6C-001A-iso15693
while (1)
{
tmp = getid(id);
if (tmp == 1)
{
LED = 0;
delayms(1);
for (i = 0; i < 8; i++)
{
transmit(id[i]);
}
}
LED = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -