|
/*--------------------------------------------------------------------------------------
* 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, 杜汶泽)
|