⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1629.c

📁 此程序是DSP 2407与时钟芯片DS1629之间的通信
💻 C
📖 第 1 页 / 共 2 页
字号:
	  Nop1();
	  return(retc);
}


/********************************************************************
                     应答子函数
原型:  void Ack_Ds1629(unsigned int a);
 
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_Ds1629(unsigned int a)
{
	 PFDATDIR = PFDATDIR | 0x0100;    //IOPF5为输出,SDA
	  if(a==0) { L_SDA1;}     /*在此发出应答或非应答信号 */
	        else {H_SDA1;}
	  Nop1();
	  Nop1();
	  Nop1();      
	  H_SCL1;
	  Nop1();
	  Nop1();              /*时钟低电平周期大于4μs*/
	  Nop1();
	  Nop1();
	  Nop1();  
	  L_SCL1;                /*清时钟线,钳住I2C总线以便继续接收*/
	  Nop1();
	  Nop1();    
}

/*******************************************************************
                    向有子地址器件发送多字节数据函数               
函数原型: unsigned int  Write_E2rom_Str(unsigned int sla,unsigned int suba,ucahr *s,unsigned int no);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
unsigned int Write_DS1629_Str(unsigned int sla,unsigned int addr,unsigned int *s,unsigned int no)
{
	 unsigned int i;
	 unsigned int h_addr,l_addr;
	 PCDATDIR = PCDATDIR & 0xFFC9;    	// WP1,WP2,WP3,WP4全允许写
/*  1111,1111,1100,1001 =0xFFC9
	1~~~ ~~~~ ~~~~ ~~~~ [C7DIR]  0:input; 		1:output
	~1~~ ~~~~ ~~~~ ~~~~ [C6DIR]  0:input; 		1:output
	~~1~ ~~~~ ~~~~ ~~~~ [C5DIR]  0:input; 		1:output
	~~~1 ~~~~ ~~~~ ~~~~ [C4DIR]  0:input; 		1:output
	~~~~ 1~~~ ~~~~ ~~~~ [C3DIR]  0:input; 		1:output
	~~~~ ~1~~ ~~~~ ~~~~ [C2DIR]  0:input; 		1:output
	~~~~ ~~1~ ~~~~ ~~~~ [C1DIR]  0:input; 		1:output
	~~~~ ~~~1 ~~~~ ~~~~ [C0DIR]  0:input; 		1:output
	~~~~ ~~~~ 1~~~ ~~~~ [IOPC7]  0:low; 		1:high
	~~~~ ~~~~ ~1~~ ~~~~ [IOPC6]  0:low; 		1:high
	~~~~ ~~~~ ~~0~ ~~~~ [IOPC5]  0:low; 		1:high
	~~~~ ~~~~ ~~~0 ~~~~ [IOPC4]  0:low; 		1:high
	~~~~ ~~~~ ~~~~ 1~~~ [IOPC3]  0:low; 		1:high
	~~~~ ~~~~ ~~~~ ~0~~ [IOPC2]  0:low; 		1:high
	~~~~ ~~~~ ~~~~ ~~0~ [IOPC1]  0:low; 		1:high
	~~~~ ~~~~ ~~~~ ~~~1 [IOPC0]  0:low; 		1:high
*/	
       h_addr=addr/256;
       l_addr=addr%256;
	   Start_I2c_Ds1629();               /*启动总线*/
	   Write_Ds1629_Byte(sla);            /*发送器件地址*/
	   if(ack_Ds1629==0) return(0);
	   Write_Ds1629_Byte(h_addr);            /*发送器件高子地址*/
	   if(ack_Ds1629==0) return(0);  
	   Write_Ds1629_Byte(l_addr);            /*发送器件低子地址*/
	   if(ack_Ds1629==0) return(0);	     	     	     	
	   for(i=0;i<no;i++)
	    {   
	      Write_Ds1629_Byte(*s);               /*发送数据*/
	      if(ack_Ds1629==0) return(0);
	      s++;
	    } 
	   Stop_I2c_Ds1629();                 /*结束总线*/ 
       Delay_Ds1629();
	  return(1);
}

/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: unsigned int  Write_E2rom_Str(unsigned int sla,unsigned int suba,ucahr *s,unsigned int no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
unsigned int Read_DS1629_Str(unsigned int sla,unsigned int addr,unsigned int *s,unsigned int no)
{
	   unsigned int i;
	   unsigned int h_addr,l_addr;
	   Start_I2c_Ds1629();               /*启动总线*/
	   Write_Ds1629_Byte(sla);            /*发送器件地址*/
	     if(ack_Ds1629==0)
	       { 
	        return(0);
           }
      
	   //Write_Ds1629_Byte(h_addr);            /*发送器件高子地址*/
	   /*  if(ack_Ds1629==0) 
	       { 
	        return(0);
            }
       */
	   Write_Ds1629_Byte(addr);            /*发送器件低子地址*/
	     if(ack_Ds1629==0) 
	       { 
	        return(0);
            }
	
	   Start_I2c_Ds1629();
	   Write_Ds1629_Byte(sla+1);
	      if(ack_Ds1629==0)
	       { 
	        return(0);
           }
	
	   for(i=0;i<no-1;i++)
	    {   
	     *s=Read_Ds1629_Byte();               /*发送数据*/
	      Ack_Ds1629(0);                /*发送就答位*/  
	     s++;
	    } 
	   *s=Read_Ds1629_Byte();
	    Ack_I2c_24lc245(1);                 /*发送非应位*/
	   Stop_I2c_Ds1629();                    /*结束总线*/ 
	  return(1);
}

/*******************************************************************
                              
函数原型: Write_Time(unsigned int hour,unsigned int min,unsigned int year,unsigned int sec)
功能:  
********************************************************************/
unsigned int Write_Time(unsigned int sla,unsigned int addr,unsigned int *s,unsigned int no)
{

  	   unsigned int i;
	   Start_I2c_Ds1629();               /*启动总线*/
	   Write_Ds1629_Byte(sla);            /*发送器件地址*/
	     if(ack_Ds1629==0)
	       { 
	        return(0);
           }
        Write_Ds1629_Byte(0xc0);          //发送存取时钟命令
        if(ack_Ds1629==0) return(0);      //检查应答位
	    
	    Write_Ds1629_Byte(addr);          /*发送器件地址*/
	     if(ack_Ds1629==0) 
	       { 
	        return(0);
            }
	
	   for(i=0;i<no;i++)
	    {   
	      Write_Ds1629_Byte(*s);               /*发送数据*/
	      if(ack_Ds1629==0) return(0);
	      s++;
	    } 
	   Stop_I2c_Ds1629();                 /*结束总线*/ 
       Delay_Ds1629();
	  return(1);

}

/*******************************************************************
                              
函数原型: Read_Time;
功能:  
********************************************************************/
unsigned int Read_Time(unsigned int sla,unsigned int addr,unsigned int *s,unsigned int no)
{
	   unsigned int i;

	   Start_I2c_Ds1629();               /*启动总线*/
	   Write_Ds1629_Byte(sla);            /*发送器件地址*/
	     if(ack_Ds1629==0)
	       { 
	        return(0);
           }
      Write_Ds1629_Byte(0xc0);          //发送存取时钟命令
	  	     if(ack_Ds1629==0)
	       { 
	        return(0);
           }
	  Write_Ds1629_Byte(addr);          /*发送器件地址*/
	     if(ack_Ds1629==0) 
	       { 
	        return(0);
            }
	
	   Start_I2c_Ds1629();
	   Write_Ds1629_Byte(sla+1);
	      if(ack_Ds1629==0)
	       { 
	        return(0);
           }
	
	   for(i=0;i<no-1;i++)
	    {   
	     *s=Read_Ds1629_Byte();               /*发送数据*/
	      Ack_Ds1629(0);                /*发送就答位*/  
	     s++;
	    } 
	   *s=Read_Ds1629_Byte();
	   Ack_Ds1629(1);                  /*发送非应位*/
	   Stop_I2c_Ds1629();                    /*结束总线*/ 
	   return(1); 
}

/*******************************************************************
                              
函数原型: Read_Tem;
功能:  
********************************************************************/
unsigned int Read_Tem()
{
      unsigned int i;
      Start_I2c_Ds1629();               //发送开始信号
	  Write_Ds1629_Byte(0x9e);          //发送写控制字
	  if(ack_Ds1629==0)
	  return(0); 
	  Write_Ds1629_Byte(0xac);      /*发送访问内部命令寄存器指令*/
	     if(ack_Ds1629==0)
	       { 
	        return(0);
           } 	  
	  Write_Ds1629_Byte(0x05);         //工作模式
	  if(ack_Ds1629==0)
	  return (0);
	  Stop_I2c_Ds1629();               /*结束总线*/
	  	  
	  Start_I2c_Ds1629();   
	  Write_Ds1629_Byte(0x9e);          //发送写控制字
	  if(ack_Ds1629==0)
	  return(0);
	  Write_Ds1629_Byte(0xee);          //开始温度转换
	  if(ack_Ds1629==0)
	  return(0);
/////////////////////////////////////////以上为温度转换

     for(i=0;i<20;i++)
         {
	       Delay_Ds1629();             //大约延时500ms
	       //Delay_Ds1629();
	     }

////////////读温度程序//////////////////////////	  
	  Start_I2c_Ds1629();   
	  Write_Ds1629_Byte(0x9e);          //发送读控制字
	  if(ack_Ds1629==0)
	  return(0);
	  Write_Ds1629_Byte(0xaa);          //读温度指令
	  if(ack_Ds1629==0)
	  return(0);
	  
	  Start_I2c_Ds1629(); 
	  Write_Ds1629_Byte(0x9f);          //发送读控制字
	  if(ack_Ds1629==0)
	  return(0);
	  tem_h=Read_Ds1629_Byte(); 
	  Ack_Ds1629(0);                  /*发送非应位*/
	  tem_l=Read_Ds1629_Byte(); 
	  Ack_Ds1629(1); 
	  Stop_I2c_Ds1629();               /*结束总线*/
	  return (1); 
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -