打印

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

[复制链接]
11504|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-4-23 21:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
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 | 只看该作者
:L

使用特权

评论回复
5
cgkdxx| | 2015-7-6 13:39 | 只看该作者
谢谢大哥   还没看明白,再看看

使用特权

评论回复
6
Vin2721| | 2016-10-11 17:39 | 只看该作者
大神

使用特权

评论回复
7
xfzl| | 2016-10-20 15:08 | 只看该作者
附件怎么无法下载呢?

使用特权

评论回复
8
416356084| | 2016-10-20 15:29 | 只看该作者

使用特权

评论回复
9
hu9jj| | 2019-9-10 21:10 | 只看该作者
谢谢楼主分享!

使用特权

评论回复
10
peng_liangfeng| | 2019-9-11 22:51 | 只看该作者
大神,感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

609

帖子

2

粉丝