搜索
bottom↓
回复: 16

谁能帮我看一下我的DS2431芯片的驱动 1-wire 为什么读暂存器的地址都是ff啊?

[复制链接]

出25入84汤圆

发表于 2011-5-24 17:35:23 | 显示全部楼层 |阅读模式
/*--------------------------------------------------------------------------------------
*  Include
*-------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <sys/unistd.h>  //usleep头文件
#include <io.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"

#define   OUT     1
#define   IN      0

char  DS2431err;//DS2431的错误标志
unsigned int ch[8]={9,8,7,6,5,4,3,2};


char bus_reset(void)
//产生单总线系统的总线复位信号,并返回总线上是否存在单总线器件信息,若返回0表明总线上存在单总线器件;返回1则表明总线上不存在单总线器件
{
unsigned int Presece;

IOWR_ALTERA_AVALON_PIO_DIRECTION(DS2431_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 0);//将DQ信号线拉低
usleep(480);  //保持DQ低电平480us{Trstl 480-640us}
IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 1);//释放总线
usleep(33);    //保持DQ低电平33us   {Tpdh 15-60us}
IOWR_ALTERA_AVALON_PIO_DIRECTION(DS2431_BASE, IN);
Presece=IORD_ALTERA_AVALON_PIO_DATA(DS2431_BASE);//保存当前总线状态
usleep(165);   //等待总线初始化过程结束165us{Tpdh 60-240us}  
printf("presece=%d\n",Presece);
return Presece;//返回是否有设备将总线拉低信息

}

unsigned int read_bit_2431(void)
//从单总线上读取一个数据位
{
unsigned int i;
IOWR_ALTERA_AVALON_PIO_DIRECTION(DS2431_BASE, OUT);
IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 0);//启动读时序
usleep(6);
IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 1);//释放总线,等待从机返回数据位
usleep(1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(DS2431_BASE, IN);
i=IORD_ALTERA_AVALON_PIO_DATA(DS2431_BASE)&0x01;
usleep(50);      //50us
IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 1);
return i;       //返回总线状态
}

void write_bit_2431(unsigned int bitvalue)
//向单总线设备写入一个数据位
{
    IOWR_ALTERA_AVALON_PIO_DIRECTION(DS2431_BASE, OUT);
    if (bitvalue)
        {
                // Write '1' bit
                IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 0);// Drives DQ low
                usleep(6);    //Tw1l   {1-15us}
                IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 1);// Releases the bus
                usleep(60);    //Tslot-Tw1l   {60us}
        }
    else
        {
                // Write '0' bit
                IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 0);// Drives DQ low
                usleep(60);       //等待写时序结束60us
                IOWR_ALTERA_AVALON_PIO_DATA(DS2431_BASE, 1);// Releases the bus
                usleep(6);       //等待写时序结束    6us
        }

}

unsigned int read_byte_2431(void)
//从单总线上读一个字节数据
{
        unsigned int loop, result=0;
        for (loop = 0; loop < 8; loop++)
        {
                // shift the result to get it ready for the next bit
                result >>= 1;
                // if result is one, then set MS bit
                if (read_bit_2431())
                        result |= 0x80;
        }
        return result;
}

void write_byte_2431(unsigned int bytevalue)
//向单总线写一个字节
{
   unsigned int loop;
    // Loop to write each bit in the byte, LS-bit first
    for (loop = 0; loop < 8; loop++)
        {
                write_bit_2431(bytevalue & 0x01);
                // shift the data byte for the next bit
                bytevalue >>= 1;
        }
   // usleep(12);               //等待写时序结束
}

   
unsigned int skip_matchRom(void)
//发出跳过ROM匹配命令
{
unsigned int tmp=1;
if(bus_reset()) return tmp;//如果没有DS2431,返回1{原来是0}
write_byte_2431(0xcc);//发出跳过ROM匹配的命令
tmp = 0;
printf("tep=%d\n",tmp);
return tmp;
}


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

** 函数名称: read_ds2431
** 功能描述: 读取DS2431数据
** 作 者  :
** 日 期  : 2011年05月20日

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

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

    DS2431err=skip_matchRom();//发出跳过ROM匹配命令
    write_byte_2431(0xF0);         //发出读存储器命令
    write_byte_2431((unsigned int)Readaddr);
    write_byte_2431((unsigned int)(Readaddr>>=8));
    ch=read_byte_2431();
    return ch;
}

unsigned int *read_ds2431_str(unsigned int Readaddr)
{                                
unsigned int i;

    DS2431err=skip_matchRom();//发出跳过ROM匹配命令
    write_byte_2431(0xF0);         //发出读存储器命令
    write_byte_2431(Readaddr);
    write_byte_2431(Readaddr>>8);
    for(i=0;i>8;i++)
    {
        ch=read_byte_2431();
    }
    printf("read_ds2431_over\n");
    return ch;
}

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

** 函数名称: write_ds2431
** 功能描述: 写数据至ds2431 返回1写入出错,返回0写入正常。
** 作 者:
** 日 期: 2008年07月28日

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

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

    low  =((unsigned int)Writeaddr&0x00ff);
    high =((unsigned int)(Writeaddr>>8)&0x00ff);
    printf("address=%x\n",high|low);
    skip_matchRom(); //发出跳过ROM匹配命令
    if(skip_matchRom())        //发出跳过ROM匹配命令
       return 1;
   // printf("match_ds2431_over\n");   
    write_byte_2431(0x0F);         //发送写暂存器命令
    write_byte_2431(low);
    write_byte_2431(high);
    // printf("write_zhan_address_over\n");
    for(i=0;i<8;i++)
    {
        ch=*Writedata;
        printf("write data=%d\n",ch);
        write_byte_2431(ch);
        Writedata++;
    }
   // printf("write_zhan_data_over\n");
    usleep(100);

    skip_matchRom(); //发出跳过ROM匹配命令
    //printf("ds2431err=%d\n",skip_matchRom());
    write_byte_2431(0xAA);          //复制暂存器数据到存储器中
    tem=read_byte_2431();
    printf("TA1=%d\n",read_byte_2431());
    tem<<=8;
    tem+=read_byte_2431();
    printf("TA2=%d\n",read_byte_2431());
    printf("ADDRESS=%d\n",tem);
    es=read_byte_2431();
    printf("es=%x\n",es);
    if(es!=0x07)               //{即111代表8字节数据已经传完}
        return 1;

    DS2431err=skip_matchRom(); //发出跳过ROM匹配命令
    write_byte_2431(0x55);          //发出启动转换命令
    write_byte_2431((unsigned int)Writeaddr);
    write_byte_2431((unsigned int)(Writeaddr>>8));
    write_byte_2431(es);
    usleep(10000);              //等待写时序结束

    if(read_byte_2431()!=0xAA)
        return 1;
        printf("write_ds2431_over\n");
        return 0;
}

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

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

出25入84汤圆

 楼主| 发表于 2011-5-24 17:47:13 | 显示全部楼层
坐等恩人

出25入84汤圆

 楼主| 发表于 2011-5-27 16:16:21 | 显示全部楼层
真的就没人会吗 ?给点意见也成啊

出25入84汤圆

 楼主| 发表于 2011-6-1 09:59:11 | 显示全部楼层
终于找到问题了 原来是usleep惹的祸

出25入84汤圆

 楼主| 发表于 2011-6-3 13:38:17 | 显示全部楼层
自己做出来了 ,包括写保护 ,需要源代码的可以跟我要

出0入0汤圆

发表于 2011-10-8 02:02:37 | 显示全部楼层
你这个不需要CRC校验码?我正在做2502的,看到CRC校验的时候头晕。

出0入0汤圆

发表于 2011-10-21 16:49:21 | 显示全部楼层
回复【5楼】zhanji007
-----------------------------------------------------------------------

小弟最近也再做DS2431的产品看了些资料,完成的了基本程序,当最终还是不能通讯,不知为何。能否加大虾的QQ请教下。

出0入0汤圆

发表于 2011-12-7 11:34:06 | 显示全部楼层
lz,我正在做这个,可否发我个源程序!邮箱为wuss2012@126.com 不胜感激!

出0入0汤圆

发表于 2011-12-8 14:58:40 | 显示全部楼层
lz,什么时候来啊?

出25入84汤圆

 楼主| 发表于 2011-12-13 20:16:56 | 显示全部楼层
楼主来了

出25入84汤圆

 楼主| 发表于 2011-12-13 20:23:26 | 显示全部楼层
我的邮箱chun307@126.com

出25入84汤圆

 楼主| 发表于 2012-6-19 09:31:22 | 显示全部楼层
对于 我上面说的usleep不准, ds2431对时序要求是很严格的,延时也需要精确 但usleep在微秒延时时很不准 下面是测试程序
    usleep(1) =  12.5 us;
  usleep(5) =  16.5 us;
  usleep(10) = 21.5 us;
  usleep(20) = 31.5 us;
  usleep(50) = 61.0 us;
  usleep(100) = 110.6 us;
  usleep(200) = 210.0 us;
  usleep(500) = 507.0 us;
  usleep(1000) = 1 ms;
  usleep(5000) = 4.96 ms;
  usleep(10 000) = 9.92 ms;
所以提醒大家慎用

出0入442汤圆

发表于 2012-6-19 23:20:29 | 显示全部楼层
补充一下,倒不是ds2431对时序要求严格,而是1-Wire对时序要求严格,因为它一根线收发。正宗的1-Wire协议要求每个比特前必须拉低1us,而且每个比特2/3周期之后必须拉高(一般为10us左右检测)。因此像你那usleep(1) =  12.5 us;,实际芯片读的是0,因为它超过了1-Wire规定的检测时间(6-7us左右)。

出0入0汤圆

发表于 2012-7-6 22:53:34 | 显示全部楼层
最近好想试一下ds2431,样片几天后到手,也想要源代码
不知道方便与否
34496344@qq.com
另请教用什么方法连IC,

出0入0汤圆

发表于 2015-2-20 21:37:01 | 显示全部楼层
chun2495 发表于 2011-6-3 13:38
自己做出来了 ,包括写保护 ,需要源代码的可以跟我要

楼主,你说的写保护是指的什么,假设我要写数据到eeprom的话,是不是先把eeprom的写保护去掉啊?

出25入84汤圆

 楼主| 发表于 2015-3-2 09:08:52 | 显示全部楼层
dhw5qq 发表于 2015-2-20 21:37
楼主,你说的写保护是指的什么,假设我要写数据到eeprom的话,是不是先把eeprom的写保护去掉啊? ...

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

本版积分规则

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

GMT+8, 2024-7-24 02:21

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

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