|
你们好能帮我看看吗,用串行助手显示,收的都是FF,调了几天没通过,烦
void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
bool I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
bool I2C_TxHToL(unsigned char);
unsigned char I2C_RxByte(void);
void I2C_Read ( unsigned char *b8563_Store);
//void I2C_read_string(unsigned char address,unsigned char count,unsigned char *readbuf);
void I2C_Write( void);
//void Delay_ms(unsigned long nValue);
//static unsigned char c8563_Store[7]={0x18,0x59,0x23,0x25,0x12,0x25,0x06}; /*写入时间初值:2506年25月27日 09:59:00 BCD码*/
const unsigned char cucBit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
#define SDA BIT6
#define SCL BIT5
void DelayTime1(void)
{
_NOP();_NOP();_NOP();//_NOP();//_NOP();_NOP();_NOP();_NOP();
}
void I2C_Set_sda_high( void )
{
P5DIR &= ~(SDA);
}
void I2C_Set_sda_low ( void )
{
P5DIR |= SDA;
P5OUT &= ~(SDA);
}
void I2C_Set_sck_high( void )
{
P5DIR &= ~(SCL);
}
void I2C_Set_sck_low ( void )
{
P5DIR |= SCL;
P5OUT &= ~(SCL);
}
/******* msp425 <-- pcf8563******/
bool I2C_GetACK(void)
{
unsigned int ucErrTime=255;
//I2C_Set_sck_low();
I2C_Set_sda_high();
//DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
// P5DIR &= ~(SDA);
while((P5IN & SDA))
{
ucErrTime--;
if(ucErrTime==0)
{
I2C_STOP();
return 0;
}
}
I2C_Set_sck_low();
return 1;
}
/****** msp425 ---> pcf8563*******/
void I2C_SetACK(void)
{
//I2C_Set_sck_low();
I2C_Set_sda_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sck_low();
}
/********msp425 ---> pcf8563******/
void I2C_SetNAk(void)
{
// I2C_Set_sck_low();
I2C_Set_sda_high();
//DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sck_low();
}
void I2C_START(void)
{
I2C_Set_sck_high();
I2C_Set_sda_high();
// DelayTime1();
I2C_Set_sda_low();
//DelayTime1();
I2C_Set_sck_low();
}
void I2C_STOP(void)
{
I2C_Set_sck_low();
I2C_Set_sda_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sda_high();
}
/****** msp425 ----> pcf8563*****/
bool I2C_TxHToL(unsigned char nValue)//MSP425发送单字节数据 从高位到低位
{
unsigned int i;
for(i = 0;i < 8;i++)
{
//I2C_Set_sck_low();
// DelayTime1();
if(nValue & cucBit[i]!=0)
{
I2C_Set_sda_high();
}
else
{
I2C_Set_sda_low();
}
//DelayTime1();
I2C_Set_sck_high();
//DelayTime1();
}
I2C_Set_sck_low();
return 1;
}
/////////////////////////////////////////////
/**** msp425 <-- pcf8563 *****/
unsigned char I2C_RxByte(void) //MSP425接收单字节数据
{
unsigned char nTemp = 0x00;
unsigned int i;
I2C_Set_sda_high();
//将SDA管脚设置为输入方向
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
if(P5IN & SDA)
{
nTemp |=cucBit[i];
}
}
I2C_Set_sck_low();
return nTemp;
}
///////////////////////////////////////////
void I2C_Read ( unsigned char *b8563_Store) //MSP425读指定地址address寄存器中的内容
{
I2C_START(); // 启动数据总线
I2C_TxHToL(0xA2); // 发送读时间信息命令
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x02);
I2C_GetACK();
I2C_START();
I2C_TxHToL(0xA3);
I2C_GetACK();
b8563_Store[0] = (I2C_RxByte()&0x7f);
I2C_SetACK();
b8563_Store[1] =(I2C_RxByte()&0x7f);
I2C_SetACK();
b8563_Store[2] = (I2C_RxByte()&0x3f);
I2C_SetACK();
b8563_Store[3] = (I2C_RxByte()&0x3f);
I2C_SetACK();
b8563_Store[4] = (I2C_RxByte()&0x07);
I2C_SetACK();
b8563_Store[5] = (I2C_RxByte()&0x1f);
I2C_SetACK();
b8563_Store[6] = I2C_RxByte();
I2C_SetNAk();
I2C_STOP(); // 停止总线
}
void I2C_Write( void)
{
I2C_START(); // 启动数据总线
I2C_TxHToL(0xA2); // 发送写时间信息命令
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x02);
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x58);
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x49);
I2C_GetACK();
I2C_TxHToL(0x21);
I2C_GetACK();
I2C_TxHToL(0x05);
I2C_GetACK();
I2C_TxHToL(0x01);
I2C_GetACK();
I2C_TxHToL(0x11);
I2C_GetACK();
I2C_TxHToL(0x06);
I2C_GetACK();
I2C_STOP(); // 停止总线
}
void start_pcf8563_clock(void)
{
I2C_START(); // 启动数据总线
I2C_TxHToL(0xA2); // 发送写时间信息命令
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x00);
I2C_GetACK(); // 等待 ACK
I2C_TxHToL(0x00);
I2C_GetACK(); // 等待 ACK
I2C_STOP();
} |
|