一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 8791|回复: 12

[其他综合] DS2431的1-wire通讯求助

[复制链接]
发表于 2012-7-16 16:52 | 显示全部楼层 |阅读模式
今天收到了美信样片,DS2431和DS2482各两片,不过不会通讯呀,不知道哪位手上有读写DS2431的程序,UART的最好,I2C的也行,还有,哪位朋友能帮我写一下,DS2482的得用I2C,官网看了代码,看到头都大了也没编译通过,这是I2C的应用http://china.maxim-ic.com/app-notes/index.mvp/id/3684,谢谢大家
发表于 2012-7-16 17:21 | 显示全部楼层
如果你是使用avr芯片,我这里有个i2c的例程,是用汇编写的,比较经典,使用的是模拟i2c。我发现模拟I2c居然比硬件TWI代码还少,真是见鬼了。
这个代码中,你需要修改一下端口定义,另外,这是按8M时钟写的延时,需要修改延时的代码。
i2c_mod.rar (3.84 KB, 下载次数: 704)
回复

使用道具 举报

 楼主| 发表于 2012-7-17 15:01 | 显示全部楼层
回复 2# kazuyuki

谢谢,我的是用CH341产生I2C通讯信号,DS2482-800做连接,再接DS2431,
参考http://china.maxim-ic.com/app-notes/index.mvp/id/3684
如下图
3684Fig01.JPG
不知道有没有什么好的方案,另外,你不知道你用的什么电路,什么方案,望百忙中给予回复,谢谢
回复

使用道具 举报

 楼主| 发表于 2012-7-17 15:45 | 显示全部楼层
如果能给出一个Uart的方案就更好了,明天再申请一片2480B试试,看到别的坛子有用C写的基于串口的软件,不知道是什么电路的
回复

使用道具 举报

发表于 2012-7-17 16:05 | 显示全部楼层
回复  kazuyuki

谢谢,我的是用CH341产生I2C通讯信号,DS2482-800做连接,再接DS2431,
参考,
如下图 ...
silentcookie 发表于 2012-7-17 15:01 https://www.yleee.com.cn/images/common/back.gif



   这个例程的好处在于支持几乎所有的atmega或attiny单片机,只需要两个io外加两个上拉电阻即可。至于如果处理数据,如何显示,是另外的代码了。这个代码只是用来负责i2c通信的。
   如果要写i2c,代码为:

      
i2c_start_wait(i2c_address & 0xfe); //设备地址
   
i2c_write(0x08); //设备指令
   
i2c_write(0x10); //设备数据
        .....
   
i2c_stop();

  如果需要读某数据,代码为:
      
i2c_start_wait(i2c_address & 0xfe); //
   
i2c_write(0x08); //设备指令
   
i2c_rep_start(0xaaress | 1);
   
tmp = i2c_read(1); //读第一个数据
   
tmp1 = i2c_read(0); //读第二个数据
   
i2c_stop();
回复

使用道具 举报

发表于 2012-7-17 16:13 | 显示全部楼层
具体需要是读还是写,读写什么样的数据,需要根据2482后面接的从设备而定了。2482只负责将i2c的指令序列转换成1-wire的指令序列
回复

使用道具 举报

 楼主| 发表于 2012-7-17 16:57 | 显示全部楼层
回复 6# kazuyuki

哦,我这里是想读DS2431的内容,再写到另外的片子里,1线通讯真是麻烦
回复

使用道具 举报

 楼主| 发表于 2012-7-18 13:22 | 显示全部楼层
网上找了个代码,不知道能不能编译出来
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>

sbit DQ=P1^6;         //定义DS2431端口
bit  DS2431err;       //DS2431的错误标志

/*void delay(INT8U cnt)

{
data INT16U i;
for(i=cnt;i>0;i--);
}*/
void delay(unsigned int num)     //延时程序
{
  while( --num ) ;
}
void Delay()          //1us延时

{
        _nop_();
        _nop_();

}


Init_DS2431(void)       //初始化DS2431
{  
bit Presece;
DQ=1;                 
delay(5);

DQ=0;                 //将DQ信号线拉低
delay(120);           //保持DQ低电平480us

DQ=1;                //将DQ信号拉高、释放总线
delay(14);           //保持DQ高电平70us

Presece = DQ;       //保存当前总线状态
delay(140);         

return Presece;     //返回是否有设备将总线拉低
}


read_bit(void)   //从单总线上读取一个数据位
{
bit i;
DQ=0;            //启动读时序

Delay();        //1us
Delay();        //1us
Delay();        //1us
Delay();        //1us

DQ=1;            //释放总线,等待从机返回数据位

Delay();       //1us
Delay();       //1us

i=DQ;
delay(6);              //30us
DQ=1;
return i;       //返回总线状态
}


void write_bit(unsigned char bitvalue)  //向单总线设备写入一个数据位
{
DQ=0;             //启动写时序

Delay();          //1us
Delay();          //1us
Delay();          //1us
Delay();          //1us
Delay();          //1us
if(bitvalue) DQ=1;            //写1
delay(5);        //等待写时序结束        25us
DQ=1;             //释放总线
delay(2);        //等待写时序结束        10us

}


void read_byte(void)          //从单总线上读一个字节数据
{
unsigned char i,value=0;
EA=0;                        //关中断
for(i=0;i<8;i++)
{
  if(read_bit()) value=value|(0x01<<i); //如果当前读取的数据位为1,将返回字节对应的位置1
}
EA=1;//打开中断
delay(2);                              //等待释放总线
return value;                          //返回读取的数据
}


void write_byte(unsigned char bytevalue)   //向单总线写一个字节
{
unsigned char i,temp;
EA=0;                        //关中断
for(i=0;i<8;i++)
{
  temp = bytevalue>>i;        //将要写的数据字节右移i位
  temp = temp &0x01;          //取出数据字节的第i位
  write_bit(temp);            //向总线写一个数据位
}
EA=1;//打开中断
delay(2);                   //等待写时序结束
}

       
bit skip_matchRom(void)                //发出跳过ROM匹配命令
{
   bit tmp=1;
        if(Init_DS2431()) return tmp;         //如果没有DS2431,返回0
        write_byte(0xcc);                     //发出跳过ROM匹配的命令
        tmp = 0;
        return tmp;
}




void read_ds2431(unsigned int Readaddr)
{
unsigned char ch;

//        WDTCN=0xa5;//喂狗
        DS2431err=skip_matchRom();         //发出跳过ROM匹配命令
        write_byte(0xF0);                  //发出读存储器命令
        write_byte((unsigned char)Readaddr);
        write_byte((unsigned char)(Readaddr>>=8));
        ch=read_byte();
//        WDTCN=0xa5;//喂狗
        return ch;
}


INT8U *read_ds2431_str(unsigned int Readaddr)
{
unsigned char ch[8],i;

        WDTCN=0xa5;//喂狗
        DS2431err=skip_matchRom();//发出跳过ROM匹配命令
        write_byte(0xF0);         //发出读存储器命令
        write_byte((unsigned char)Readaddr);
        write_byte((unsigned char)(Readaddr>>=8));
        for(i=8;i>0;i--)
        {
                ch[8-i]=read_byte();
                WDTCN=0xa5;//喂狗
        }
        return ch;
}



INT8U write_ds2431(unsigned int Writeaddr, unsigned char *Writedata)
{
unsigned char ch,es,i,hight,low;
unsigned int tem;

//        WDTCN=0xa5;//喂狗
        hight=(unsigned char)(Writeaddr>>=4);
        low  =(unsigned char)Writeaddr;
        if(skip_matchRom())                   //发出跳过ROM匹配命令
                return 1;
        write_byte(0x0F);         //发送写暂存器命令
        write_byte(low);
        write_byte(hight);
        for(i=0;i<8;i++)
        {
                ch=*Writedata;
                Writedata++;
                write_byte(ch);
        }
        delay(25);

        DS2431err=skip_matchRom();//发出跳过ROM匹配命令
        write_byte(0xAA);         //复制暂存器数据到存储器中
        tem=read_byte();
        tem<<=8;
        tem+=read_byte();
        es=read_byte();
        if(es!=0x07)
                return 1;

        DS2431err=skip_matchRom();//发出跳过ROM匹配命令
        write_byte(0x55);//发出启动转换命令
        write_byte((unsigned char)Writeaddr);
        write_byte((unsigned char)(Writeaddr>>=4));
        write_byte(es);
        for(i=0;i<50;i++)
        delay(250);      //等待写时序结束        510us

        if(read_byte()!=0xAA)
                return 1;
//        WDTCN=0xa5;//喂狗
                return 0;
}
回复

使用道具 举报

 楼主| 发表于 2012-7-18 14:21 | 显示全部楼层
回复 6# kazuyuki

用M8最小系统就行吗?电脑端的上位机要怎么做呢
回复

使用道具 举报

发表于 2012-7-18 14:42 | 显示全部楼层
回复  kazuyuki

用M8最小系统就行吗?电脑端的上位机要怎么做呢
silentcookie 发表于 2012-7-18 14:21 https://www.yleee.com.cn/images/common/back.gif



   这个问题比较复杂,就看你需要什么样的结果了。
  如果你仅仅是对2431进行读写试验,可以使用usb2serial+M8+2431,usb先转成串行协议接M8,然后M8去访问2431,自己设计一套串行口指令,控制M8去对2431读写。

   更简单的是利用M8模拟usbcdc设备,这样就能省掉一片usb转232,但M8的代码会更复杂点
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-3 17:25 , Processed in 0.035242 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表