|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#define __DS2431_C__
#include "config.h"
#include "ds2431.h"
#include "crc16.h"
/*******************************DS2431数据口定义*******************************/
#define IO_IN DDRF &= ~BIT(7) //IO输入数据
#define IO_OUT DDRF |= BIT(7) //IO输出数据
#define IO_SET PORTF |= BIT(7) //IO拉高
#define IO_CLR PORTF &= ~BIT(7) //IO拉低
#define IO_R PINF & BIT(7) //读IO
uchar DS2431err; //DS2431的错误标志
uchar DS2431_array[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/***********************************************************************
DS2431函数模块
***********************************************************************/
//------------------------------------------------------------
//基础类快速操作 复位器件并检测器件应答
//-----------------------------------------------------------
uchar ResetDS2431_Fast(void)
{
uchar Ack = 0;
IO_OUT;
IO_SET;
delay_us(2); //快速操作延时G 2.5us
IO_CLR;
delay_us(70); //快速操作延时H 70us
IO_SET;
IO_IN;
delay_us(8); //快速操作延时I 8.5us
if(IO_R && 1)
{
Ack = 1;
}
delay_us(40); //快速操作延时J 40us
return(Ack);
}
//------------------------------------------------------------
//基础类快速操作 写入1bit1
//-----------------------------------------------------------
void WriteBit1_Fast(void)
{
IO_OUT;
IO_CLR;
delay_us(1);
IO_SET;
delay_us(7);
}
//------------------------------------------------------------
//基础类快速操作 写入1bit0
//-----------------------------------------------------------
void WriteBit0_Fast(void)
{
IO_OUT;
IO_CLR;
delay_us(7);
IO_SET;
delay_us(2);
}
//------------------------------------------------------------
//基础类快速操作 写入1字节数据
//-----------------------------------------------------------
void WriteByte_Fast(uchar Num)
{
uchar i;
for (i=0; i<8; i++)
{
if (Num&0x01) // 检查写入的数据的最低位是否为“1”?
{
WriteBit1_Fast(); // 向1-Wire总线写入一位“1”
}
else
{
WriteBit0_Fast(); // 向1-Wire总线写入一位“0”
}
Num >>= 1 ; // 要写入的数据右移一位
}
}
//------------------------------------------------------------
//基础类快速操作 读取1bit数据
//-----------------------------------------------------------
uchar ReadBit_Fast(void)
{
uchar temp = 0;
IO_IN;
IO_CLR;
delay_us(1);
IO_SET;
delay_us(1);
if(IO_R)
{
temp = 1;
}
delay_us(14);
return(temp);
}
//------------------------------------------------------------
//基础类快速操作 读取1字节数据
//-----------------------------------------------------------
uchar ReadByte_Fast(void)
{
uchar mi;
uchar temp = 0;
for(mi=0;mi<8;mi++)
{
temp>>=1; // 读取到的结果数据右移一位
if(ReadBit_Fast()) // 检查从1-Wire总线读取一位是否为“0”
{
temp |= 0x80; // 读取到的结果数据MSB置“1
}
}
return(temp);
}
//-------------------------------------
//函数功能:快速读取DS2431的ROM码并进行CRC效验
// 返回值 :如果读取ROM码正确,返回2,效验错误返回1 ,无器件返回0
//参数说明:*buff指向存储ROM码的数组
//-------------------------------------
uchar ReadID_Fast(void)
{
unsigned char mi ;
unsigned char *mpi;
uchar *ID;
unsigned char num;
mpi = ID;
num = 0x08 ;
if(ResetDS2431_Fast())
{
WriteByte_Fast(0x3C); //想1-Wire总线写入“高速”命令
if(ResetDS2431_Fast())
{
WriteByte_Fast(0x33) ; // 向1-Wire总线写入“读取ROM码”命令
for (mi=0;mi<8;mi++) // 每个1-Wire器件都有唯一的64位注册码
{
*mpi = ReadByte_Fast();
mpi++;
}
if(CRC16_Check(ID,8))
{
return(2);
}
return(1);
}
return(9);
}
return(0);
//return mpi;
}
//---------------------------------------------------------------
//函数功能:读取Ds2431指定页中的的数据,并对读到的数据进行CRC效验
//返回值 :读取并效验成功返回1,否则返回0
//参数说明:Adder 需读取的地址
// *buff 读到的数据存放地址
//----------------------------------------------------------------
uchar ReadData(uchar Adder,uchar *Buff)
{
uchar mi;
if(!ResetDS2431_Fast()) //复位DS2431并检测器件应答
{
return(0);
}
WriteByte_Fast(0x3c); //跳过地址,设为快速
if(!ResetDS2431_Fast()) //快速复位DS2431并检测器件应答
{
return(0);
}
WriteByte_Fast(0xCC); //SKIP ROM命令
WriteByte_Fast(0xF0); //Read Memory命令
WriteByte_Fast(Adder); //TA1 起始偏移地址
WriteByte_Fast(0x0); //TA2 高位地址
for(mi=0;mi<8;mi++)
{
*Buff = ReadByte_Fast(); //接收数据
Buff++;
}
if(!ResetDS2431_Fast()) //快速复位DS2431并检测器件应答
{
return(0);
}
return(1);
}
//---------------------------------------------------------------
//函数功能:写入数据(8个字节)到Ds2431指定页,并对写入的数据进行CRC效验,
//返回值 :0: 无器件 ,标准复位无应答
// 1: 器件错误 .快速复位无应答
// 2:
// 3:
// 4:
//参数说明:PageNum 需写入的页号(0-3)
// *buff 写入的数据存放地址
//----------------------------------------------------------------
uchar WriteData(uchar PageStartAdd,uchar *Buff)
{
uchar i,j;
uchar CheckBuff[14];
uint crc16;
uchar *mpi;
CheckBuff[0] = 0x0f; //发送Write Scratchpad命令
CheckBuff[1] = PageStartAdd; //发送地址低字节
CheckBuff[2] = 0x00; //发送地址高字节(DS2431中恒为0)
mpi = Buff;
for(i=3;i<11;i++) //转存需要发送的数据到缓冲区,方便效验
{
CheckBuff = *mpi;
mpi++;
}
if(!ResetDS2431_Fast())
{
return(0);
}
WriteByte_Fast(0x3c); //跳过地址,设为快速
for(j=0;j<8;j++)
{
if(!ResetDS2431_Fast()) //快速复位DS2431并检测器件应答
{
return(1); //快速复位无应答
}
WriteByte_Fast(0xCC); //SKIP ROM并设为高速命令
for(i=0;i<11;i++) //发送命令与数据
{
WriteByte_Fast(CheckBuff);
}
CheckBuff[11] = ReadByte_Fast(); //接收2字节CRC效验码
CheckBuff[12] = ReadByte_Fast();
crc16 = 0x0000 ;
crc16 = CheckBuff[11] ;
crc16 = crc16 << 8 ;
crc16 = crc16 + CheckBuff[12] ;
crc16 = ~crc16 ; // 器件送回的CRC码为反码
if(CRC16_Check(CheckBuff, 11) == crc16)
{
break; //本步骤成功,跳出
}
else
{
if(j>4)
{
return(2); //5次不成功,返回错误标记
}
}
}
CheckBuff[0] = 0xAA ; // 置“读取暂存存储器中的数据”控制命令
for(j=0;j<8;j++)
{
if (!ResetDS2431_Fast()) // 快速复位DS2431并检测器件应答
{
return(3) ; // 如果没有器件在线,则返回错误值
}
WriteByte_Fast(0xCC); //SKIP ROM命令
WriteByte_Fast(0xAA); // 写入“读取暂存存储器中的数据”控制命令
for (i=1; i<14; i++)
{
CheckBuff = ReadByte_Fast(); // 从1-Wire总线读取1整页数据
}
crc16 = 0x0000 ;
crc16 = CheckBuff[12] ;
crc16 = crc16 << 8 ;
crc16 = crc16 + CheckBuff[13] ;
crc16 = ~crc16 ; // 器件送回的CRC码为反码
if(CRC16_Check(CheckBuff,12) == crc16)
{
break;
}
else
{
if(j>4)
{
return(4); //5次不成功,返回错误标记
}
}
}
for (i=4; i<12; i++) // 检查读取的数据与写入的数据是否相同?
{
if (CheckBuff != *Buff)
{
return(5) ; //效验错误,返回错误标记
}
Buff++;
}
for (i=0; i<3; i++)
{
if (!ResetDS2431_Fast()) // 快速复位DS2431并检测器件应答
{
return(6) ; // 如果没有器件在线,则返回错误值
}
WriteByte_Fast(0xCC); //SKIP ROM命令
WriteByte_Fast(0x55); // 写入“复制数据到EEPROM中”控制命令
WriteByte_Fast(PageStartAdd); // 写入要读取数据在器件中的地址低字节
WriteByte_Fast(0); // 写入要读取数据在器件中的地址高字节
WriteByte_Fast(0x07); // 写入传输状态寄存器的值
delay_ms(13); // 等待12.5毫秒,保证复制所需的操作时间
if(ReadByte_Fast() == 0xAA) // 从1-Wire总线读取复制状态
{
return(9) ; // 返回写入访问成功值
}
}
return(8); //写入错误,返回标记
} |
|