📄 ds1629.c
字号:
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 + -