我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 660|回复: 1

ds2431驱动代码(AVR128)

[复制链接]

该用户从未签到

3

主题

2

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2020-4-29 09:10:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#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);            //写入错误,返回标记
}
回复

使用道具 举报

该用户从未签到

5552

主题

2547

回帖

1万

积分

PADS-180606高级班

积分
13595

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖金点子奖

QQ
发表于 2020-4-29 09:20:55 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表