chun2495 发表于 2011-5-24 17:35:23

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

/*--------------------------------------------------------------------------------------
*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

charDS2431err;//DS2431的错误标志
unsigned int ch={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;
}

chun2495 发表于 2011-5-24 17:47:13

坐等恩人

chun2495 发表于 2011-5-27 16:16:21

真的就没人会吗 ?给点意见也成啊

chun2495 发表于 2011-6-1 09:59:11

终于找到问题了 原来是usleep惹的祸

chun2495 发表于 2011-6-3 13:38:17

自己做出来了 ,包括写保护 ,需要源代码的可以跟我要

zhanji007 发表于 2011-10-8 02:02:37

你这个不需要CRC校验码?我正在做2502的,看到CRC校验的时候头晕。

gfy200866 发表于 2011-10-21 16:49:21

回复【5楼】zhanji007
-----------------------------------------------------------------------

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

cosplay001 发表于 2011-12-7 11:34:06

lz,我正在做这个,可否发我个源程序!邮箱为wuss2012@126.com 不胜感激!

cosplay001 发表于 2011-12-8 14:58:40

lz,什么时候来啊?

chun2495 发表于 2011-12-13 20:16:56

楼主来了

chun2495 发表于 2011-12-13 20:23:26

我的邮箱chun307@126.com

chun2495 发表于 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;
所以提醒大家慎用

wye11083 发表于 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左右)。

kiwiwang 发表于 2012-7-6 22:53:34

最近好想试一下ds2431,样片几天后到手,也想要源代码
不知道方便与否
34496344@qq.com
另请教用什么方法连IC,

dhw5qq 发表于 2015-2-20 21:37:01

chun2495 发表于 2011-6-3 13:38
自己做出来了 ,包括写保护 ,需要源代码的可以跟我要

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

chun2495 发表于 2015-3-2 09:08:52

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

就是你说的
页: [1]
查看完整版本: 谁能帮我看一下我的DS2431芯片的驱动 1-wire 为什么读暂存器的地址都是ff啊?