找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1726|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)pcf8563程序 庫函數(shù)i2c

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:154876 發(fā)表于 2023-12-27 22:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  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操作函數(shù)         
  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時(shí)鐘
  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. //產(chǎn)生IIC起始信號(hào)
  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總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  32. }         
  33. //產(chǎn)生IIC停止信號(hào)
  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;//發(fā)送I2C總線結(jié)束信號(hào)
  42.         delay_us(4);                                                                  
  43. }
  44. //等待應(yīng)答信號(hào)到來
  45. //返回值:1,接收應(yīng)答失敗
  46. //        0,接收應(yīng)答成功
  47. u8 IIC_Wait_Ack(void)
  48. {
  49.         u8 ucErrTime=0;
  50.         SDA_IN();      //SDA設(shè)置為輸入  
  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;//時(shí)鐘輸出0            
  63.         return 0;  
  64. }
  65. //產(chǎn)生ACK應(yīng)答
  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. //不產(chǎn)生ACK應(yīng)答                    
  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發(fā)送一個(gè)字節(jié)
  88. //返回從機(jī)有無應(yīng)答
  89. //1,有應(yīng)答
  90. //0,無應(yīng)答                          
  91. void IIC_Send_Byte(u8 txd)
  92. {                        
  93.     u8 t;   
  94.         SDA_OUT();            
  95.     IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
  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);   //對(duì)TEA5767這三個(gè)延時(shí)都是必須的
  105.                 IIC_SCL=1;
  106.                 delay_us(2);
  107.                 IIC_SCL=0;        
  108.                 delay_us(2);
  109.     }         
  110. }            
  111. //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
  112. u8 IIC_Read_Byte(unsigned char ack)
  113. {
  114.         unsigned char i,receive=0;
  115.         SDA_IN();//SDA設(shè)置為輸入
  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();//發(fā)送nACK
  127.     else
  128.         IIC_Ack(); //發(fā)送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);//發(fā)送寫命令并檢查應(yīng)答位
  136.   while(IIC_Wait_Ack());
  137.         IIC_Send_Byte(REG_ADD);
  138.         IIC_Wait_Ack();
  139.         IIC_Send_Byte(dat);        //發(fā)送數(shù)據(jù)
  140.         IIC_Wait_Ack();
  141.         IIC_Stop();
  142.         
  143. }
  144. //讀取地?cái)?shù)據(jù)
  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);//發(fā)送寫命令并檢查應(yīng)答位        
  151.   while(IIC_Wait_Ack( ));        
  152.   IIC_Send_Byte(REG_ADD);        //確定要操作的寄存器
  153.         IIC_Wait_Ack();
  154.         IIC_Start();        //啟動(dòng)總線
  155.         IIC_Send_Byte(PCF8563_Read);        //發(fā)送讀取命令
  156.         IIC_Wait_Ack();
  157.         ReData = IIC_Read_Byte(0);                //讀取數(shù)據(jù),加發(fā)送非應(yīng)答
  158.         IIC_Stop();        
  159.         return ReData;
  160. }

  161. //函數(shù)名稱:void rtc_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
  162. //功    能:設(shè)置RTC芯片PCF8563的時(shí)間
  163. //輸    入:year month day hour min second:年月日時(shí)分秒
  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. //函數(shù)名稱:Datetime_Structure rtc_get_time(void)
  182. //功    能:讀取RTC芯片PCF8563的時(shí)間
  183. //輸    入:無
  184. //輸    出:Datetime_Structure結(jié)構(gòu)體變量
  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. }

復(fù)制代碼


原理圖: 無
仿真: 無
代碼: 庫函數(shù)i2c_pcf8563.7z (182.19 KB, 下載次數(shù): 28)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表