刚刚完成的DS1307的驱动程序,与大家分享!

[复制链接]
 楼主| XIANSir 发表于 2011-4-23 21:06 | 显示全部楼层 |阅读模式
本帖最后由 XIANSir 于 2011-4-23 21:07 编辑

没有硬件,所以只是仿真通过了,具体硬件能不能用大家还得自己试试啊!;

P




整个工程打包:

本帖子中包含更多资源

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

×
 楼主| XIANSir 发表于 2011-4-23 21:15 | 显示全部楼层
本帖最后由 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;
}
hippo821 发表于 2011-4-23 21:59 | 显示全部楼层
呃、:L
abin0415 发表于 2011-4-24 19:07 | 显示全部楼层
cgkdxx 发表于 2015-7-6 13:39 | 显示全部楼层
谢谢大哥   还没看明白,再看看
Vin2721 发表于 2016-10-11 17:39 | 显示全部楼层
大神
xfzl 发表于 2016-10-20 15:08 | 显示全部楼层
附件怎么无法下载呢?
416356084 发表于 2016-10-20 15:29 | 显示全部楼层
hu9jj 发表于 2019-9-10 21:10 | 显示全部楼层
谢谢楼主分享!
peng_liangfeng 发表于 2019-9-11 22:51 | 显示全部楼层
大神,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部