本帖最后由 XIANSir 于 2011-4-23 21:22 编辑
部分代码:
/******************************************************************************************************************************************
* 函数名称: DS13GetX()
* 功能说明: 从DS1307地址addr开始获取size个字节的数据,获取的数据存储在全局变量Buff中,分别为addr->Buff[0] addr+1->Buff[1] ...
* 输 入: ui08 addr 获取数据从addr开始,即从DS1302的地址addr处获取第一个要获取的数据
* ui08 size 要获取的数据个数,不能等于0
* 输 出: ui08 RET_OK 成功从DS1307获取数据 RET_ERR 从DS1307获取数据过程中出现错误
* 注意事项: 1、获取的数据存储在全局变量Buff中,分别为addr->Buff[0] addr+1->Buff[1] ...
* 2、调用函数时给size赋值0会导致函数返回RET_ERR
******************************************************************************************************************************************/
ui08 DS13GetX(ui08 addr,ui08 size)
{
ui08 i = 0;
if(addr+size > 64) //要访问的所有数据的地址都不能大于63
{
return RET_ERR;
}
if((size > 8) || (size == 0)) //size不能超过Buff[]的容量,且size为0无意义
{
return RET_ERR;
}
/* 这里的写操作实际是一个伪写操作,作用是设置下面的读数据的起始地址 */
iic_genS(); //产生起始信号
iic_send(DS1307_ADDR|0); //发送DS1307芯片地址及读写位,0表示写
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
iic_send(addr); //发送读取数据的起始地址
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
iicgenSr(); //产生Repeated Start
iic_send(DS1307_ADDR|1); //发送DS1307芯片地址及读写位,1表示读
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
for(i=0;size>0;i++,size--) //从addr处读取size个字节的数据
{
Buff = iic_reci();
iicDoAck();
}
iic_reci(); //DS1307要求必须使用NOAck来结束数据读取
iicNoAck(); //DS1307要求必须使用NOAck来结束数据读取
iic_genP(); //产生停止信号
return RET_OK;
}
/******************************************************************************************************************************************
* 函数名称: DS13SetX()
* 功能说明: 向DS1307地址addr开始写入size个字节的数据,将要写入的数据存储在全局变量Buff中,分别为Buff[0]->addr Buff[1]->addr+1 ...
* 输 入: ui08 addr 数据被写入从addr开始的地址处,即向DS1302的地址addr处写入第一个要设置的数据
* ui08 size 要设置的数据个数,不能等于0
* 输 出: ui08 RET_OK 成功向DS1307设置数据 RET_ERR 向DS1307设置数据过程中出现错误
* 注意事项: 1、将要写入的数据存储在全局变量Buff中,分别为Buff[0]->addr Buff[1]->addr+1 ...
* 2、调用函数时给size赋值0会导致函数返回RET_ERR
******************************************************************************************************************************************/
ui08 DS13SetX(ui08 addr,ui08 size)
{
ui08 i = 0;
if(addr+size > 64) //要访问的所有数据的地址都不能大于63
{
return RET_ERR;
}
if((size > 8) || (size == 0)) //size不能超过Buff[]的容量,且size为0无意义
{
return RET_ERR;
}
iic_genS(); //产生起始信号
iic_send(DS1307_ADDR|0); //发送DS1307芯片地址及读写位,0表示写
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
iic_send(addr); //发送数据要写入的地址
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
for(i=0;size>0;i++,size--)
{
iic_send(Buff);
if(ACK_NO == iicIsAck()) //检测DS1307是否有响应
{
iic_genP(); //产生停止信号
return RET_ERR;
}
}
iic_genP(); //产生停止信号
return RET_OK;
}
|