|
- #include <sys.h>
- #include <pcf8563.h>
- #include <delay.h>
- #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
- //IO操作函數(shù)
- #define IIC_SCL PBout(6) //SCL
- #define IIC_SDA PBout(7) //SDA
- #define READ_SDA PBin(7) //輸入SDA
- //初始化IIC
- void IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB時(shí)鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 輸出高
- }
- //產(chǎn)生IIC起始信號(hào)
- void IIC_Start(void)
- {
- SDA_OUT(); //sda線輸出
- IIC_SDA=1;
- IIC_SCL=1;
- delay_us(4);
- IIC_SDA=0;//START:when CLK is high,DATA change form high to low
- delay_us(4);
- IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- }
- //產(chǎn)生IIC停止信號(hào)
- void IIC_Stop(void)
- {
- SDA_OUT();//sda線輸出
- IIC_SCL=0;
- IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
- delay_us(4);
- IIC_SCL=1;
- IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào)
- delay_us(4);
- }
- //等待應(yīng)答信號(hào)到來
- //返回值:1,接收應(yīng)答失敗
- // 0,接收應(yīng)答成功
- u8 IIC_Wait_Ack(void)
- {
- u8 ucErrTime=0;
- SDA_IN(); //SDA設(shè)置為輸入
- IIC_SDA=1;delay_us(1);
- IIC_SCL=1;delay_us(1);
- while(READ_SDA)
- {
- ucErrTime++;
- if(ucErrTime>250)
- {
- IIC_Stop();
- return 1;
- }
- }
- IIC_SCL=0;//時(shí)鐘輸出0
- return 0;
- }
- //產(chǎn)生ACK應(yīng)答
- void IIC_Ack(void)
- {
- IIC_SCL=0;
- SDA_OUT();
- IIC_SDA=0;
- delay_us(2);
- IIC_SCL=1;
- delay_us(2);
- IIC_SCL=0;
- }
- //不產(chǎn)生ACK應(yīng)答
- void IIC_NAck(void)
- {
- IIC_SCL=0;
- SDA_OUT();
- IIC_SDA=1;
- delay_us(2);
- IIC_SCL=1;
- delay_us(2);
- IIC_SCL=0;
- }
- //IIC發(fā)送一個(gè)字節(jié)
- //返回從機(jī)有無應(yīng)答
- //1,有應(yīng)答
- //0,無應(yīng)答
- void IIC_Send_Byte(u8 txd)
- {
- u8 t;
- SDA_OUT();
- IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
- for(t=0;t<8;t++)
- {
-
- if((txd&0x80)>>7)
- IIC_SDA=1;
- else
- IIC_SDA=0;
- txd<<=1;
- delay_us(2); //對(duì)TEA5767這三個(gè)延時(shí)都是必須的
- IIC_SCL=1;
- delay_us(2);
- IIC_SCL=0;
- delay_us(2);
- }
- }
- //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
- u8 IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA_IN();//SDA設(shè)置為輸入
- for(i=0;i<8;i++ )
- {
- IIC_SCL=0;
- delay_us(2);
- IIC_SCL=1;
- receive<<=1;
- if(READ_SDA)receive++;
- delay_us(1);
- }
- if (!ack)
- IIC_NAck();//發(fā)送nACK
- else
- IIC_Ack(); //發(fā)送ACK
- return receive;
- }
- void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
- {
-
- IIC_Start();
- IIC_Send_Byte(PCF8563_Write);//發(fā)送寫命令并檢查應(yīng)答位
- while(IIC_Wait_Ack());
- IIC_Send_Byte(REG_ADD);
- IIC_Wait_Ack();
- IIC_Send_Byte(dat); //發(fā)送數(shù)據(jù)
- IIC_Wait_Ack();
- IIC_Stop();
-
- }
- //讀取地?cái)?shù)據(jù)
- // reg——add 要讀取的寄存器
- unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
- {
- u8 ReData;
- IIC_Start( );
- IIC_Send_Byte(PCF8563_Write);//發(fā)送寫命令并檢查應(yīng)答位
- while(IIC_Wait_Ack( ));
- IIC_Send_Byte(REG_ADD); //確定要操作的寄存器
- IIC_Wait_Ack();
- IIC_Start(); //啟動(dòng)總線
- IIC_Send_Byte(PCF8563_Read); //發(fā)送讀取命令
- IIC_Wait_Ack();
- ReData = IIC_Read_Byte(0); //讀取數(shù)據(jù),加發(fā)送非應(yīng)答
- IIC_Stop();
- return ReData;
- }
- //函數(shù)名稱:void rtc_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
- //功 能:設(shè)置RTC芯片PCF8563的時(shí)間
- //輸 入:year month day hour min second:年月日時(shí)分秒
- //輸 出:無
- void PCF8563_set_time(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 second)
- {
- PCF8563_Write_Byte(TIME_SECOND,second);
- delay_us(20);
- PCF8563_Write_Byte(TIME_MINUTE,min);
- delay_us(20);
- PCF8563_Write_Byte(TIME_HOUR,hour);
- delay_us(20);
- PCF8563_Write_Byte(TIME_DAY,day);
- delay_us(20);
- PCF8563_Write_Byte(TIME_MONTH,month);
- delay_us(20);
- PCF8563_Write_Byte(TIME_YEAR,year);
- delay_us(20);
-
- }
- //函數(shù)名稱:Datetime_Structure rtc_get_time(void)
- //功 能:讀取RTC芯片PCF8563的時(shí)間
- //輸 入:無
- //輸 出:Datetime_Structure結(jié)構(gòu)體變量
- Datetime_Structure rtc_get_time(void)
- {
- u32 m_unTempTime;
- Datetime_Structure getTime_Struct;
- /*get time---second****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_SECOND)&0x7f;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.second = m_unTempTime;
- /*get time---minute****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_MINUTE)&0x7f;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.min = m_unTempTime;
- /*get time---hour****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_HOUR)&0x3f;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.hour = m_unTempTime;
- /*get time---day****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_DAY)&0x3f;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.day = m_unTempTime;
- /*get time---month****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_MONTH)&0x1f;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.month = m_unTempTime;
- /*get time---year****************/
- m_unTempTime = PCF8563_Read_Byte(TIME_YEAR)&0xff;
- m_unTempTime = (m_unTempTime/16)*10+m_unTempTime%16;
- getTime_Struct.year = m_unTempTime;
- return getTime_Struct;
- }
復(fù)制代碼
原理圖: 無
仿真: 無
代碼:
庫函數(shù)i2c_pcf8563.7z
(182.19 KB, 下載次數(shù): 28)
2023-12-28 00:52 上傳
點(diǎn)擊文件名下載附件
50 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|