|
发表于 2013-1-12 11:13:01
|
显示全部楼层
本帖最后由 yuzhi2222 于 2013-1-12 11:15 编辑
用I2C模块不可靠,用模拟的好
/**************************************/
void startPCF(void) //SCL为高时,SDA由高变低
{
PCFSDA_H;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSDA_L;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
void stopPCF(void) //SCL为高时,SDA由低变高
{
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSDA_H;
delay_s(10);
}
/**************************************/
void ackPCF(void)
{
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
void nackPCF(void)
{
PCFSDA_H;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
uint32 testackPCF(void)
{
uint32 ackbit=0;
PCFSDA_H;
PCFSCL_H;
delay_s(10);
PCFSDA_in;
delay_s(10);
if(GPIOB->IDR&SDA_pin)ackbit=1;
delay_s(10);
PCFSCL_L;
PCFSDA_out;
GPIOB->ODR =((GPIOB->ODR&0xfffe)|key_pin);
delay_s(10);
return(!ackbit);
}
/**************************************/
void sendPCF(uint8 send_byte)
{
uint32 i;
for(i=0;i<8;i++)
{
if((send_byte&0x80)==0x80)PCFSDA_H;
else
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
send_byte<<=1;
delay_s(10);
}
}
/**************************************/
uint8 receivePCF(void)
{
uint8 rcv_byte=0;
uint32 i;
PCFSDA_H;
delay_s(10);
PCFSDA_in;
for(i=0;i<8;i++)
{
delay_s(10);
PCFSCL_H;
delay_s(10);
rcv_byte<<=1;
if(GPIOB->IDR&SDA_pin)rcv_byte|=0x01;
PCFSCL_L;
}
PCFSDA_out;
GPIOB->ODR =((GPIOB->ODR&0xfffe)|key_pin);
delay_s(10);
return(rcv_byte);
}
/**********************连续写******************/
void burstwritePCF(void)
{
uint32 i;
startPCF();
sendPCF(0xa2);
while(testackPCF()==0);
sendPCF(0x02);
while(testackPCF()==0);
for(i=0;i<7;i++)
{
sendPCF(snd_buff);
while(testackPCF()==0);
}
stopPCF();
}
/**********************连续读******************/
void burst_readPCF(void)
{
uint32 i;
startPCF();
sendPCF(0xa2);
while(testackPCF()==0);
sendPCF(0x02);
while(testackPCF()==0);
startPCF();
sendPCF(0xa3);
while(testackPCF()==0);
for(i=0;i<6;i++)
{
rtc_buff=receivePCF();
ackPCF();
}
rtc_buff[6]=receivePCF();
nackPCF();
stopPCF();
}
STM32F103C8 + PCF8563T ,已运行一年半,稳定 |
|