搜索
bottom↓
回复: 20

求 读写 DS2431 程序

[复制链接]

出0入0汤圆

发表于 2010-5-31 09:27:25 | 显示全部楼层 |阅读模式
各位大哥  求读写DS2431芯片的程序

我以前的读写DS18B20的程序写的很顺利,一试就好了,但是吧这个程序拿来读写DS2431却读ROM出来全是FFFF

请各位大侠帮帮忙!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-5-31 12:43:54 | 显示全部楼层
这是我的程序 帮我看看是哪儿有错误 谢谢了!

点击此处下载 ourdev_558523.zip(文件大小:2K) (原文件名:ds2431.zip)

出0入0汤圆

发表于 2010-5-31 12:55:56 | 显示全部楼层
时序貌似不对吧
写1:
--|___|------------

写0:
--|____________|---

-表示高,_表示低

读和写1一样,只是升高电平后将方向改成输入,然后读PIN值。

出0入0汤圆

发表于 2010-5-31 13:02:17 | 显示全部楼层
点击此处下载 ourdev_558527.pdf(文件大小:746K) (原文件名:DS2431_cn_1.pdf)

看第18页

另外,我前几天也在弄这个东东,但CRC部分没有搞定,也只做了读ROM部分,读写EEPROM等都没有做过,有机会大家探讨一下。
我的程序在实验室电脑里,这两天不去那里,回头大家交流一下吧

出0入0汤圆

 楼主| 发表于 2010-5-31 13:59:01 | 显示全部楼层
我程序里面的 CRC是对的 在DS18B20里面验证过 以前读DS18B20没有问题的

LS可以参考我的 CRC8 应该是对的

您能把你的 DS2431读写程序给我看看么?

出0入0汤圆

 楼主| 发表于 2010-5-31 14:08:59 | 显示全部楼层
呵呵 读出来了 呵呵 正确程序发过来 CRC校验也通过

点击此处下载 ourdev_558542.rar(文件大小:2K) (原文件名:ds2431.rar)


(原文件名:AA.JPG)

出0入0汤圆

 楼主| 发表于 2010-5-31 14:10:13 | 显示全部楼层
非常感谢楼上z_zt提醒   根据时序图从新设置延时 就OK 了

出0入0汤圆

发表于 2010-5-31 16:26:58 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2010-6-2 09:45:35 | 显示全部楼层
现在又遇到问题了
Q1---往暂存器写入数据WriteScratchpad: 地址为:TA1=0x10 TA2=0x00  8个字节数据为 45 33 A5 67 12 76 EE B5
写完后 从DS2431返回CRC16校验码 为:4C FA
但是我自己算出来的CRC16是: 83 11  

Q2---然后我复位再读暂存器 读出来全部是FF  一直找不到原因  哪位大侠帮帮我

出0入0汤圆

 楼主| 发表于 2010-6-2 09:46:38 | 显示全部楼层
//---------------------------------------------
//             DS2431_WriteScratchpad
//
// 功能                Write Scratchpad
// 输入                addr --- 写数据偏移地址
//                        *p   --- 写缓存首地址
// 输出              
// 返回值          false--写入错误
//                        true--写入成功
//   
//---------------------------------------------
bool        
DS2431_WriteScratchpad(uint16_t addr,uint8_t* p)
{
    uint8_t i,temp;
    uint16_t crc=0;

  //复位
    if (!DS2431_RST())
    {
        return 0;
    }

  //跳过ROM匹配
    DS2431_WR_BYTE(DS2431CMD_SKIP_ROM);        
    _delay_us(10);
  
  //发送Write Scratchpad命令
    DS2431_WR_BYTE(DS2431CMD_WR_SCP);                
    _delay_us(60);

  //写入偏移地址 TA1 TA2
    TA1=(uint8_t)(addr&0xff);       
    TA2=(uint8_t)((addr>>8)&0xff);
    DS2431_WR_BYTE( TA1 );         //写入地址低位
    DS2431_WR_BYTE( TA2 );        //写入地址高位
    //printstr("TA=",3);
    //printHex(TA1);
    //printHex(TA2);

    //crc = _crc16_update(crc,DS2431CMD_WR_SCP);
    crc = _crc16_update(crc,TA1);
    crc = _crc16_update(crc,TA2);

//写入8字节数据       
    //printstr("Data=",5);
    for (i=0;i<8;i++)
    {       
        temp=p;
        //printHex(temp);
        DS2431_WR_BYTE(temp);
        crc = _crc16_update(crc,temp);
               
    }
       
    //printstr("CRC1=",5);
    //printHex(crc & 0xff);
    //printHex( (crc>>8) & 0xff);       

    //printstr("CRC2=",5);

    for (i=0;i<2;i++)
    {
        temp=DS2431_RD_BYTE();
        //printHex(temp);       
    }       
    return true;
}



//---------------------------------------------
//             DS2431_ReadScratchpad
//
// 功能                Read Scratchpad
// 输入                *p 读取数据存放首地址
// 输出            TA1\TA2\E_S
// 返回值          false -- 读取数据校验不正确
//                        true --  读取数据校验正确   
//---------------------------------------------
bool        
DS2431_ReadScratchpad(uint8_t *p)
{
    uint8_t i,temp;
    uint16_t crc=0;

  //复位
    if (!DS2431_RST())
    {
        return 0;
    }


  //跳过ROM匹配
    DS2431_WR_BYTE(DS2431CMD_SKIP_ROM);        
    _delay_us(10);
  
  //发送Read Memory命令
     DS2431_WR_BYTE(DS2431CMD_RD_MEMO);                
     _delay_us(60);

  //读取 TA1 TA2 E/S
    TA1=DS2431_RD_BYTE();
    TA2=DS2431_RD_BYTE();
    E_S=DS2431_RD_BYTE();
    //printstr("TA=",3);
    //printHex(TA1);
    //printHex(TA2);
    //printstr("ES=",3);
    //printHex(E_S);

  //读取8字节数据
    //printstr("RD=",3);
    for (i=0;i<8;i++)
    {
        temp=DS2431_RD_BYTE();
        //printHex(temp);
        p=temp;
        crc= _crc16_update(crc,temp);
    }

  //校验数据
    //printstr("CRC3=",5);                               
    temp=DS2431_RD_BYTE();
    //printHex(temp);
    if ( (crc&0x0f) != temp )
    {
        //return false;
    }

    temp=DS2431_RD_BYTE();
    //printHex(temp);
    if ( (crc>>8) != temp )
    {
        //return false;
    }

    return true;
}

出0入0汤圆

 楼主| 发表于 2010-6-2 10:14:29 | 显示全部楼层
现在 WriteScratchpad 校验成功! 原来是补码 而且 写入的命令DS2431CMD_WR_SCP=0x0f也需要加入计算

现在第二问题还没有解决 边调试 边在线等 大侠帮助!

出0入0汤圆

 楼主| 发表于 2010-6-2 11:14:46 | 显示全部楼层
已解决!

出25入84汤圆

发表于 2011-5-19 11:52:02 | 显示全部楼层
楼主能不能说说DS2431CMD_RD_MEMO是什么东西呢?

出25入84汤圆

发表于 2011-5-20 14:52:54 | 显示全部楼层
引用图片【5楼】knight_avr  
-----------------------------------------------------------------------

(原文件名:AA.JPG)

出0入0汤圆

发表于 2012-7-3 15:54:17 | 显示全部楼层
knight_avr 发表于 2010-6-2 11:14
已解决!

请教,怎么解决的呀

出0入0汤圆

发表于 2012-7-29 11:00:06 | 显示全部楼层
knight_avr 发表于 2010-6-2 09:45
现在又遇到问题了
Q1---往暂存器写入数据WriteScratchpad: 地址为:TA1=0x10 TA2=0x00  8个字节数据为 45  ...

你好,我现在也是卡在这个CRC16校验这里,感觉怎么算都得不到正确的数字,我已经把0f,还有地址等都算进去了,能不能指点下,或者发下你的CRC16给我参考下,谢谢,我的QQ23858236,邮箱vigors@163.com

出0入0汤圆

发表于 2012-7-29 11:02:33 | 显示全部楼层
knight_avr 发表于 2010-6-2 10:14
现在 WriteScratchpad 校验成功! 原来是补码 而且 写入的命令DS2431CMD_WR_SCP=0x0f也需要加入计算

现在 ...

这句话怎么理解,我尝试将每个数据变成补码计算,或者保持数据不变,只将CRC结果补码,但是都不对,好奇怪!郁闷啊,请指示啊!

出0入0汤圆

发表于 2012-8-1 22:08:26 | 显示全部楼层
LS用什么系统实现的

出0入0汤圆

发表于 2015-11-11 17:15:06 | 显示全部楼层
可以吧你的工程共享出来吗

出0入0汤圆

发表于 2015-11-12 11:16:26 | 显示全部楼层
ds2431 只读过Id 码,,,不知咋写
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 08:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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