【项目15—任务20—小组18】DS3231——IIC的使用及源码实现

DS3231——IIC的使用及源码实现

一、IIC

IIC数据有效性:只有在SCL线为低时,SDA线才允许改变电平。

1、初始宏定义如下:

#define DS_SCL  BIT6       //DS_SCL = P1.6

#define DS_SDA  BIT5       //DS_SDA = P1.5

#define DS_SCL_IN           P1DIR &= ~DS_SCL

#define DS_SCL_OUT        P1DIR |= DS_SCL

#define DS_SCL_L             P1OUT &= ~DS_SCL

#define DS_SCL_H            P1OUT |= DS_SCL

#define DS_SDA_IN          P1DIR &= ~DS_SDA

#define DS_SDA_OUT       P1DIR |= DS_SDA

#define DS_SDA_L            P1OUT &= ~DS_SDA

#define DS_SDA_H           P1OUT |= DS_SDA

#define DS_SDA_BIT        P1IN & DS_SDA

#define DS_SDA_IN_H      P1REN |= DS_SDA 


二、IIC时序


IIC时序图

2.1 开始与结束



从时序图可以看出来,开始信号为SCL为高时,SDA由高变低;结束信号为SCL为低时,SDA由低变高。

函数名称:DS_Start

功    能:I2C起始数据

参    数:无

返回值  :无

voidDS_Start(void)

{

DS_SDA_OUT;          //设置IO口方向

DS_SCL_OUT;DS_SCL_H;            //SCL、SDA先拉高

Delay_us(5);         //delay应该有个最小时间要求

DS_SDA_H;

Delay_us(5);

DS_SDA_L;            //SDA拉低表明开始

Delay_us(5);

DS_SCL_L;            //SCL拉低,数据传输准备就绪

Delay_us(5);


函数名称:DS_Stop

功    能:I2C终止数据

参    数:无

返回值  :无

void DS_Stop(void)

{

DS_SDA_OUT;          //设置IO口方向

DS_SCL_OUT;

DS_SCL_L;            //先把SCL、SDA拉低,给结束信号做准备

Delay_us(5);

DS_SDA_L;

Delay_us(5);

DS_SCL_H;            //SCL拉高

Delay_us(5);

DS_SDA_H;            //当SCL为高,SDA由低变高为结束信号

Delay_us(1);

}


2.2 发送数据与读数据:


由图可知,开始信号后,应把SCL拉低,准备数据传输,SDA电平变化后,再拉高SCL,发送数据(最高位先发送),循环8次(一个字节)。

读取函数同理,只不过过程是反的,SDA是输入,主机做接收端。

函数名称:DS_Send_Byte

功    能:I2C发送数据

参    数:data

返回值  :data

void DS_Send_Byte(u8 data)

{

DS_SDA_OUT;           //设置IO口输出方向

DS_SCL_OUT;

DS_SCL_L;             //SCL为低时,允许SDA改变电平

unsigned char temp;

for(temp=0x80;temp!=0;temp>>=1) 

   { 

  if(temp&data==0)    //高位先发   

 {      DS_SDA_L;       }     

 else    {     DS_SDA_H;     }  

  Delay_us(5);    

  DS_SCL_H;     //SCL拉高发送数据 

  Delay_us(5);      

  DS_SCL_L;   

 }


函数名称:DS_Read

功    能:I2C接收数据

参    数:data

返回值  :data

unsigned char DS_Read(void)

{  

unsigned char temp;  

unsigned char data; 

 DS_SDA_IN;              //主机做接收,SDA线为输入  

DS_SDA_IN_H ;   

for(temp=0x80;temp!=0;temp>>=1)  

{   

DS_SCL_H;              //SCL拉高,保证接收数据时SDA不改变   

Delay_us(5);   

if(DS_SDA_BIT==1)    

 {    

data|=temp;           //高电平保留 

   }    

else    

{    

data&=~temp;   

}   

DS_SCL_L;              //SCL拉低,数据准备   

}   

return data;


2.3 主机应答信号与非应答信号:


主机接收完从机数据后,要发送应答或者非应答信号。

函数名称:DS_Ack

功    能:I2C发送应答信号

参    数:无

返回值  :无

void DS_Ack(void)

{

DS_SDA_OUT;    //主机为接收端   发送应答信号

DS_SCL_L;        //SCL拉低,允许SDA改变电平

DS_SDA_L;       //SDA低电平为应答

DS_SCL_H;

Delay_us(5);

DS_SCL_L;

}


函数名称:DS_NAck

功    能:I2C发送非应答信号

参    数:无

返回值  :无

void DS_NAck(void)

{

DS_SDA_OUT;   //此时,相当于主机在接收数据,是被动方

DS_SCL_L;     //SCL拉低,允许SDA改变电平

DS_SDA_H;     //SDA高电平为非应答

DS_SCL_H;

Delay_us(5);

DS_SCL_L;


2.4 主机接收从机应答信号:

从机在接收主机数据后,从机要发送一个应答信号,主机判断此应答信号为应答信号或者非应答信号,做下一步处理。

函数名称:DS_Get_Ack

功    能:I2C接收应答信号

参    数:无

返回值  :ack

uchar DS_Get_Ack(void)

{

   unsigned char ack;

   DS_SDA_IN;         //释放数据线,准备接收应答

   DS_SDA_IN_H ;      //SDA线输入上拉

   DS_SCL_H;          //SCL线拉高

   if(DS_SDA_BIT==1)

    {

    ack=0;//无应答信号

    }

   else

    {

    ack=1;//有应答信号

    }

   DS_SCL_L;

   Delay_us(5);

}


二、DS3231传输时序


由图可知,在发送开始信号后,DS3231接收的第一个字节的前7位是从机地址,即DS3231地址,第八位为读/写操作。



从DS3231的数据手册中可以看出来,DS3231的地址为1101000,所以主机操作的写地址为0XD1,读地址为0XD0。(不要写反)读寄存器指针的方式是开始信号-写器件地址-写寄存器地址-开始信号-接收数据-停止。

函数名称:DS3231_WriteByte

功    能:I2C总线给DS3231发送单字节

参    数:WriteAddrDataToWrite

返回值  :无

void DS3231_WriteByte(u8 WriteAddr,u8DataToWrite)

{

DS_Start();

DS_Send_Byte(0XD1);       //发送器件地址   

DS_Get_Ack();

DS_Send_Byte(WriteAddr);  //发送首地址

DS_Get_Ack();

DS_Send_Byte(DataToWrite);//发送数据

DS_Get_Ack();

DS_Stop();

Delay_ms(1);

}


函数名称:DS3231_ReadByte

功    能:I2C总线从DS3231接收单字节

参    数:ReadAddrDataToRead

返回值  :Data

uchar DS3231_ReadByte(u8 ReadAddr)

{

 uchar R_Data=0;

 DS_Start();

 DS_Send_Byte(0XD0);//读地址

 DS_Ack();

 DS_Send_Byte(ReadAddr);

 DS_Ack();

 DS_Start();

 DS_Send_Byte(0XD1);

 R_Data=DS_Read();

 Delay_us(5);

 DS_NAck();

 DS_Stop();

 return R_Data;

}


函数名称:Readtime

功    能:读取DS3231时间

参    数:R_tmpdate

返回值  :无

void Read_RTC()

{  unsigned char rtc_address[6]={0x00,0x01,0x02,0x04,0x05,0x06};

   unsigned char R_tmpdate[6];

   unsigned char i,*p;

    p=rtc_address;             //地址传递

   for(i=0;i<6;i++)            //分6次读取秒分时日月年

    {

     R_tmpdate[i]=DS3231_ReadByte(*p);

     p++;

    }

}



void ModifyTime(uchar yea,uchar mon,ucharda,uchar hou,uchar min,uchar sec)

{

 uchar temp=0;


 DS3231_WriteByte(0x06,temp);//修改年


 DS3231_WriteByte(0x05,temp);//修改月


 DS3231_WriteByte(0x04,temp);//修改日


 DS3231_WriteByte(0x02,temp);//修改时


 DS3231_WriteByte(0x01,temp);//修改分


 DS3231_WriteByte(0x00,temp);//修改秒

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容