谁能帮我看一下我的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;
} 坐等恩人 真的就没人会吗 ?给点意见也成啊 终于找到问题了 原来是usleep惹的祸 自己做出来了 ,包括写保护 ,需要源代码的可以跟我要 你这个不需要CRC校验码?我正在做2502的,看到CRC校验的时候头晕。 回复【5楼】zhanji007
-----------------------------------------------------------------------
小弟最近也再做DS2431的产品看了些资料,完成的了基本程序,当最终还是不能通讯,不知为何。能否加大虾的QQ请教下。 lz,我正在做这个,可否发我个源程序!邮箱为wuss2012@126.com 不胜感激! lz,什么时候来啊? 楼主来了 我的邮箱chun307@126.com 对于 我上面说的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;
所以提醒大家慎用 补充一下,倒不是ds2431对时序要求严格,而是1-Wire对时序要求严格,因为它一根线收发。正宗的1-Wire协议要求每个比特前必须拉低1us,而且每个比特2/3周期之后必须拉高(一般为10us左右检测)。因此像你那usleep(1) =12.5 us;,实际芯片读的是0,因为它超过了1-Wire规定的检测时间(6-7us左右)。 最近好想试一下ds2431,样片几天后到手,也想要源代码
不知道方便与否
34496344@qq.com
另请教用什么方法连IC, chun2495 发表于 2011-6-3 13:38
自己做出来了 ,包括写保护 ,需要源代码的可以跟我要
楼主,你说的写保护是指的什么,假设我要写数据到eeprom的话,是不是先把eeprom的写保护去掉啊? dhw5qq 发表于 2015-2-20 21:37
楼主,你说的写保护是指的什么,假设我要写数据到eeprom的话,是不是先把eeprom的写保护去掉啊? ...
就是你说的
页:
[1]