历史上的今天
返回首页

历史上的今天

今天是:2025年05月25日(星期日)

正在发生

2021年05月25日 | MSP430F2131读写多密钥芯片DS1991范例

2021-05-25 来源:eefocus

//程序功能:完成msp430f2131读写ds1991


//芯片配置: msp430f2131的MCLK来至DCO,配置成1M

#include "msp430x20x1.h" //头文件


//宏定义一些常用的代码,写成函数形式,方便阅读理解。


#define TM_OUT(level) P2OUT = ((unsigned int)level) ? (P2IN|BIT4) : (P2IN&~BIT4)

#define TM_DIR(level) P2DIR = ((unsigned int)level) ? (P2DIR|BIT4) : (P2DIR&~BIT4)

#define TM_IN (P2IN&BIT4)


/******************************

函数 wrbyte()


功能:DS1991写数据

*byte1为数据指针,

num表示写的数据个数

********************************/

void wrbyte(unsigned char *byte1,unsigned char num)

{

unsigned char i=0,j=0,k=0,byte=0,temp=0;

TM_DIR(1);

for(k=0;k{

byte=*(byte1+k);

for(j=0;j<8;j++)

{

temp=(byte>>j)&0x01; //14us

TM_OUT(0); //1us

i=0; //2us //总线值低电平tLow1=1us~15us

TM_OUT(temp);

//TM=temp; //4us//写周期TH=60us-tLow1, 对方在检测到总线=0开始15us后,将总线采样写入

for(i=0;i<0x12;i++); //91us

TM_OUT(1);

for(i=0;i<1;i++); //5us

}

}

}

/******************************

函数:rbyte()


功能:DS1991读数据

num表示读的数据个数

函数返回指针

********************************/

unsigned char *rbyte(unsigned char num)

{

unsigned char i,j,k,byte1=0,byte2=0;

unsigned char *pp,temp[48]={0};

for(k=0;k{

for(j=0;j<8;j++)

{

TM_OUT(0); //总线值低电平tSu<1us

i=0;

i=1; //2us

TM_OUT(1); //等待总线数据到达tLOW=1us~15us

TM_DIR(0);

//采样周期,对方在检测到总线=0开始15us后,将数据放在总线上,持续时间0~45us

//然后释放总线,总时间共60us-TL.

if(TM_IN) byte2|=0x01;


byte2=byte2<<7;

byte1=byte1>>1;

byte1=byte1|byte2;

byte2=0;

for(i=0;i<0x8;i++); //40us

TM_DIR(1);

TM_OUT(1);

for(i=0;i<1;i++); //5us

}

temp[k]=byte1;

}

pp=temp;

return pp;

}



/******************************

函数:rext()


功能:测试DS1991是否在线

DS1991在线则返回1,

否则返回0

********************************/

unsigned char rest(void)

{

unsigned char i=0;

unsigned char k=0;

TM_DIR(1); //5u

TM_OUT(0); //9u

for(i=0;i<0x61;i++); //3+x*5 //492us //发复位低脉冲tRSTL>80us

TM_OUT(1); //9u //释放总线,等待上拉电阻将总线恢复高电平tPDH=5us~60us

TM_DIR(0); //5u

i=0;

do //等待对方返回低脉冲, tPDL=60us~240us

{

if(TM_IN==0)

{

k=1;

for(i=0;i<0x09;i++); //52us

i=0;

do

{

if(TM_IN==1) //等待对方恢复高电平

break;

}while(i++<0x20);

TM_DIR(1);

TM_OUT(1);

for(i=0;i<0x61;i++); //482us

break;

}


}

while(i++<0x35); //530us

TM_DIR(1);

TM_OUT(1);

for(i=0;i<0x5;i++); //27us

return k;


}


unsigned char *rdsubkey(unsigned char quNO)

{

unsigned char temp[56]={0};

unsigned char i=0,*pp;

i=rest();

temp[0]=0xcc;

wrbyte(temp,1);

i=(quNO<<6);

temp[0]=0x66;temp[1]=(0x10+i);temp[2]=(0xff-temp[1]); // Read

wrbyte(temp,3);

pp=rbyte(0x8); //读取ID

for(i=0;i<8;i++)

temp=*(pp+i);

wrbyte(oldpw,8);//写密码

pp=rbyte(0x30); //读取数据

for(i=0;i<0x30;i++)

temp[i+0x08]=*(pp+i);

i=rest();

pp=temp;

return pp;

}

//注意考虑操作的可靠性

void TM_pro(void)

{

unsigned int i=0;

unsigned char j=0,*pp,temp[56]={0};

_DINT(); //关中断

for(;;)

{

i=rest(); //测试TM卡是否在线,i=1表示在线,

//在线则跳出循环

if(i==1){break;}

if(j++>0x0A){break;} //不在线时,多测试几次,这里为10次

for(i=0;i<1000;i++);

}

if(i==1) //TM卡在线

{

// 读取8 位家族码48 位唯一的序列号和8 位CRC 校验码

temp[0]=0x33;

wrbyte(temp,1);

pp=rbyte(0x8);

for(i=0;i<8;i++)

temp=*(pp+i);

if(temp[0]==0x02) //ds1991家族码为02

{

pp=rdsubkey(0x10); //00,01,10

for(i=0;i<56;i++)

temp=*(pp+i);

switch(temp[8])

{}

}

else;//家族码不正确

}

else ; //卡不在线

TM_DIR(0);

_EINT();

}

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;

for (;;)

{

if(tmflag==1)

{

P2IE |= 0x00; // P2.4 interrupt enabled

P2IES |= 0x00;

tmflag=0;

//TM_pro();

// 读取8 位家族码48 位唯一的序列号和8 位CRC 校验码

temp[0]=0x33;

wrbyte(temp,1);

pp=rbyte(0x8);

for(i=0;i<8;i++)

temp=*(pp+i);

if(temp[0]==0x02) //ds1991家族码为02

{

i=rest();

temp[0]=0xcc; //Skip ROM

wrbyte(temp,1);

temp[0]=0x96;temp[1]=0xc0;temp[2]=(0xff-temp[1]); //Write Scratchpad [96H]

wrbyte(temp,3);

temp[0]=0x34;

wrbyte(temp,1);

// pp=rbyte(0x8);

// for(i=0;i<8;i++)

// temp=*(pp+i);

// wrbyte(temp,8);

// wrbyte(id,8);

// wrbyte(pw,8);

i=rest();

i=rest();

temp[0]=0xcc;

wrbyte(temp,1);

temp[0]=0x69;temp[1]=0xc0;temp[2]=(0xff-temp[1]); // Read Scratchpad [69H]

wrbyte(temp,3);

pp=rbyte(0x2);

for(i=0;i<2;i++)

temp=*(pp+i);

i=rest();

i=9;

}

}

TM_DIR(0);

P2IE |= 0x10; // P2.4 interrupt enabled

P2IES |= 0x10; // P2.4 Hi/lo edge

P2IFG &= ~0x10;

_EINT();

}

}

推荐阅读

史海拾趣

DURABLE公司的发展小趣事

在竞争激烈的电子行业中,DURABLE公司深知单打独斗难以取得长远发展。因此,公司积极寻求与其他行业的跨界合作机会。通过与汽车制造商、医疗设备制造商等行业的合作,DURABLE成功将自身的技术优势应用于更多领域的产品中。这种跨界合作模式不仅拓宽了公司的业务领域和收入来源,还为公司带来了更多的创新灵感和市场机遇。通过与其他行业的合作,DURABLE实现了资源共享和优势互补,实现了共赢发展。

ARRA Inc公司的发展小趣事

DURABLE公司成立于20世纪90年代初,最初是一家专注于电子材料研发的小型科技公司。在创始人李博士的带领下,DURABLE不断投入研发资金,积极探索新材料在电子行业的应用。经过数年的努力,公司成功开发出一种具有超高耐用性和稳定性的新型电子材料,这一创新为DURABLE赢得了业界的广泛认可。随着技术的不断成熟,DURABLE的产品逐渐应用于智能手机、平板电脑等高端电子产品中,公司的市场份额也逐年攀升。

Adaptive Networks Inc公司的发展小趣事

DURABLE公司成立于20世纪90年代初,最初是一家专注于电子材料研发的小型科技公司。在创始人李博士的带领下,DURABLE不断投入研发资金,积极探索新材料在电子行业的应用。经过数年的努力,公司成功开发出一种具有超高耐用性和稳定性的新型电子材料,这一创新为DURABLE赢得了业界的广泛认可。随着技术的不断成熟,DURABLE的产品逐渐应用于智能手机、平板电脑等高端电子产品中,公司的市场份额也逐年攀升。

Cermetek Microelectronics公司的发展小趣事

在电子行业快速发展的背景下,Cermetek Microelectronics公司深知创新的重要性。公司不断加大对研发的投入,引进先进的研发设备和人才,持续推出具有创新性的微电子产品。这些新产品不仅具有更高的性能和更低的功耗,还更加符合市场需求,为公司带来了更多的商业机会。

Blue Giga公司的发展小趣事

2015年,Silicon Labs(芯科科技有限公司)宣布收购Blue Giga。这一收购对于双方来说都是一个重要的里程碑。Silicon Labs通过收购获得了Blue Giga的先进技术和广泛的产品线,进一步增强了其在物联网和无线连接领域的竞争力。而Blue Giga则借助Silicon Labs的全球资源和市场渠道,实现了更快速的发展。

Facon公司的发展小趣事

在竞争激烈的电子行业中,品牌形象对于企业的成功至关重要。Facon深知这一点,因此他们始终注重品牌塑造和形象维护。通过举办技术研讨会、参加行业展会等方式,Facon不断向外界展示自己的技术实力和产品优势。同时,他们还积极参与公益活动和社会责任项目,提升企业的社会形象。这些努力让Facon在消费者和合作伙伴中树立了良好的品牌形象。

问答坊 | AI 解惑

求购一本书...二手也行...

哪位大侠手里有这本书 或都能帮我找到这本书 请与我联系QQ:749560730…

查看全部问答>

关于RS422中两片MAX487的连接问题

问题如上,请各位高手帮帮我,不然,小妹就要挂科了 两片MAX487中,A连接A,B连接B,中间加上120欧的电阻,但是/RE和DI的连接应该怎样连啊? …

查看全部问答>

急求教MC35和Q39的问题

我原先是买了MC35模块和配套的开发板,但是MC35没有TCP协议不方便 于是购买了WAVECOM的Q39模块,它据说是和MC35/TC35/MC39硬件兼容的 实际上也是接口完全一样可以直接接上开发板 但是接上去无法使用 AT指令发出全部不返回,然后我不输指令它也 ...…

查看全部问答>

容易么,从CE3移植到CE6?

从winpcap下了一个通信用的DLL源码,但它是ce3的。我想把它移植到CE6,不知道会不会很麻烦啊? 谢谢! …

查看全部问答>

大家的板板都是从哪里买的?

公司里面的就不要回答啦,我是想问自己研究时用的。…

查看全部问答>

avr或单片机可以运行wince操作系统吗

如题,如果可以怎么做,不可以请大家帮我推荐可以在那样的单片机里运行的操作系统,谢谢了…

查看全部问答>

Windows CE 错误报告 是什么意思?是我开发的软件有问题,还是Windows CE有问题?

Windows CE  错误报告  是什么意思?是我开发的软件有问题,还是Windows CE有问题?…

查看全部问答>

问个WINCE调试的基本方法问题

我在PB5.0中调试单一的工程可以么?就是我不想每次都生成新的系统镜像。就像在VS2005中调试一样,修改代码、F5就开始编译链接、部署、断点,这样就方便多了阿,要不我不是在PB中每次都得从新生成系统镜像了?多麻烦…

查看全部问答>

新手请教如何进行bsp的开发

想学习bsp开发,不知如何下手,请大叫给点经验,让小弟少走些弯路。 谢谢!…

查看全部问答>

DM900使用指南

DM9000 PHY 1.DM9000控制器的实现 从DataSheet已经明确,DM9000提供了通用的CPU接口,简化了与MirRoBlaze硬件接口的实现过程,可直接通过EDK库中的EPC(外设控制器)核控制DM9000。 DM9000可利用EDK提供的xps_epc核来实现,该核的时序完全满足DM ...…

查看全部问答>