找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 492|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机pcf8563程序 库函数i2c

[复制链接]
跳转到指定楼层
楼主
ID:154876 发表于 2023-12-27 22:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <sys.h>
  2. #include <pcf8563.h>
  3. #include <delay.h>

  4. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
  5. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

  6. //IO操作函数         
  7. #define IIC_SCL    PBout(6) //SCL
  8. #define IIC_SDA    PBout(7) //SDA         
  9. #define READ_SDA   PBin(7)  //输入SDA

  10. //初始化IIC
  11. void IIC_Init(void)
  12. {                                             
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
  15.            
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
  21. }

  22. //产生IIC起始信号
  23. void IIC_Start(void)
  24. {
  25.         SDA_OUT();     //sda线输出
  26.         IIC_SDA=1;                    
  27.         IIC_SCL=1;
  28.         delay_us(4);
  29.          IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  30.         delay_us(4);
  31.         IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  32. }         
  33. //产生IIC停止信号
  34. void IIC_Stop(void)
  35. {
  36.         SDA_OUT();//sda线输出
  37.         IIC_SCL=0;
  38.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  39.          delay_us(4);
  40.         IIC_SCL=1;
  41.         IIC_SDA=1;//发送I2C总线结束信号
  42.         delay_us(4);                                                                  
  43. }
  44. //等待应答信号到来
  45. //返回值:1,接收应答失败
  46. //        0,接收应答成功
  47. u8 IIC_Wait_Ack(void)
  48. {
  49.         u8 ucErrTime=0;
  50.         SDA_IN();      //SDA设置为输入  
  51.         IIC_SDA=1;delay_us(1);           
  52.         IIC_SCL=1;delay_us(1);         
  53.         while(READ_SDA)
  54.         {
  55.                 ucErrTime++;
  56.                 if(ucErrTime>250)
  57.                 {
  58.                         IIC_Stop();
  59.                         return 1;
  60.                 }
  61.         }
  62.         IIC_SCL=0;//时钟输出0            
  63.         return 0;  
  64. }
  65. //产生ACK应答
  66. void IIC_Ack(void)
  67. {
  68.         IIC_SCL=0;
  69.         SDA_OUT();
  70.         IIC_SDA=0;
  71.         delay_us(2);
  72.         IIC_SCL=1;
  73.         delay_us(2);
  74.         IIC_SCL=0;
  75. }
  76. //不产生ACK应答                    
  77. void IIC_NAck(void)
  78. {
  79.         IIC_SCL=0;
  80.         SDA_OUT();
  81.         IIC_SDA=1;
  82.         delay_us(2);
  83.         IIC_SCL=1;
  84.         delay_us(2);
  85.         IIC_SCL=0;
  86. }                                                                              
  87. //IIC发送一个字节
  88. //返回从机有无应答
  89. //1,有应答
  90. //0,无应答                          
  91. void IIC_Send_Byte(u8 txd)
  92. {                        
  93.     u8 t;   
  94.         SDA_OUT();            
  95.     IIC_SCL=0;//拉低时钟开始数据传输
  96.     for(t=0;t<8;t++)
  97.     {              
  98.       
  99.                 if((txd&0x80)>>7)
  100.                         IIC_SDA=1;
  101.                 else
  102.                         IIC_SDA=0;
  103.                 txd<<=1;           
  104.                 delay_us(2);   //对TEA5767这三个延时都是必须的
  105.                 IIC_SCL=1;
  106.                 delay_us(2);
  107.                 IIC_SCL=0;        
  108.                 delay_us(2);
  109.     }         
  110. }            
  111. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  112. u8 IIC_Read_Byte(unsigned char ack)
  113. {
  114.         unsigned char i,receive=0;
  115.         SDA_IN();//SDA设置为输入
  116.     for(i=0;i<8;i++ )
  117.         {
  118.         IIC_SCL=0;
  119.         delay_us(2);
  120.                     IIC_SCL=1;
  121.         receive<<=1;
  122.    if(READ_SDA)receive++;   
  123.                 delay_us(1);
  124.    }                                         
  125.     if (!ack)
  126.         IIC_NAck();//发送nACK
  127.     else
  128.         IIC_Ack(); //发送ACK   
  129.     return receive;
  130. }

  131. void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
  132. {
  133.         
  134.   IIC_Start();
  135.         IIC_Send_Byte(PCF8563_Write);//发送写命令并检查应答位
  136.   while(IIC_Wait_Ack());
  137.         IIC_Send_Byte(REG_ADD);
  138.         IIC_Wait_Ack();
  139.         IIC_Send_Byte(dat);        //发送数据
  140.         IIC_Wait_Ack();
  141.         IIC_Stop();
  142.         
  143. }
  144. //读取地数据
  145. // reg——add  要读取的寄存器
  146. unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
  147. {        
  148.         u8 ReData;

  149.         IIC_Start( );        
  150.         IIC_Send_Byte(PCF8563_Write);//发送写命令并检查应答位        
  151.   while(IIC_Wait_Ack( ));        
  152.   IIC_Send_Byte(REG_ADD);        //确定要操作的寄存器
  153.         IIC_Wait_Ack();
  154.         IIC_Start();        //启动总线
  155.         IIC_Send_Byte(PCF8563_Read);        //发送读取命令
  156.         IIC_Wait_Ack();
  157.         ReData = IIC_Read_Byte(0);                //读取数据,加发送非应答
  158.         IIC_Stop();        
  159.         return ReData;
  160. }

  161. //函数名称:void rtc_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  162. //功    能:设置RTC芯片PCF8563的时间
  163. //输    入:year month day hour min second:年月日时分秒
  164. //输    出:无
  165. void PCF8563_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  166. {
  167.     PCF8563_Write_Byte(TIME_SECOND,second);
  168.           delay_us(20);
  169.     PCF8563_Write_Byte(TIME_MINUTE,min);
  170.                 delay_us(20);
  171.     PCF8563_Write_Byte(TIME_HOUR,hour);
  172.                 delay_us(20);
  173.     PCF8563_Write_Byte(TIME_DAY,day);
  174.                 delay_us(20);
  175.     PCF8563_Write_Byte(TIME_MONTH,month);
  176.                 delay_us(20);
  177.     PCF8563_Write_Byte(TIME_YEAR,year);
  178.                 delay_us(20);
  179.         
  180. }

  181. //函数名称:Datetime_Structure rtc_get_time(void)
  182. //功    能:读取RTC芯片PCF8563的时间
  183. //输    入:无
  184. //输    出:Datetime_Structure结构体变量
  185.   Datetime_Structure rtc_get_time(void)
  186. {
  187.     u32 m_unTempTime;
  188.     Datetime_Structure getTime_Struct;

  189.     /*get time---second****************/
  190.     m_unTempTime = PCF8563_Read_Byte(TIME_SECOND)&0x7f;
  191.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  192.     getTime_Struct.second = m_unTempTime;

  193.     /*get time---minute****************/
  194.     m_unTempTime = PCF8563_Read_Byte(TIME_MINUTE)&0x7f;
  195.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  196.     getTime_Struct.min = m_unTempTime;

  197.     /*get time---hour****************/
  198.     m_unTempTime = PCF8563_Read_Byte(TIME_HOUR)&0x3f;
  199.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  200.     getTime_Struct.hour = m_unTempTime;

  201.     /*get time---day****************/
  202.     m_unTempTime = PCF8563_Read_Byte(TIME_DAY)&0x3f;
  203.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  204.     getTime_Struct.day = m_unTempTime;        

  205.     /*get time---month****************/
  206.     m_unTempTime = PCF8563_Read_Byte(TIME_MONTH)&0x1f;
  207.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  208.     getTime_Struct.month = m_unTempTime;               

  209.     /*get time---year****************/
  210.     m_unTempTime = PCF8563_Read_Byte(TIME_YEAR)&0xff;
  211.     m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
  212.     getTime_Struct.year = m_unTempTime;               

  213.     return getTime_Struct;
  214. }

复制代码


原理图: 无
仿真: 无
代码: 库函数i2c_pcf8563.7z (182.19 KB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表