请大师帮忙看看这I2C读写PCF8563怎么不对?这是stms
单片机在stvd环境下进行编程?
_Bool I2C_SDA @PC_ODR:1;//SDA管脚定义定义
_Bool I2C_SDAM @PC_IDR:1;//SDA管脚定义定义
_Bool I2C_SCL @PC_ODR:2;//SCL管脚定义
#define SET_SCL_OUT() {PC_DDR|=0X04; PE_CR1 |= 0X04;}
#define SET_SDA_OUT() {PC_DDR|=0X02; PE_CR1 |= 0X02;}
#define SET_SDA_IN() {PC_DDR =0XFD; PE_CR1 |= 0X02;}
//US带参数延时函数
void delayus(unsigned int us)
{
while(us--);//for(;;){;}//
}
void Delay_5us(void)
{
unsigned int i;
for(i=10;i>0;i--);
}
/* void Delay_5us(void)
{
uchar i; //fcpu 8MHz 时
for (i=30; i>0; i--);
}*/
//ms延时函数
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=880;j>0;j--);
}
//串口定义
/*void USAT_k(voiv)
{
UART2_DDR1=0x08;
UART2_DDR2=0x09;
UART2_DDR3=0xaa;
}*/
//I2C初始化
void I2C_Init(void)
{
// PC_DDR|=0x06;//0000 0110
// PC_IDR|=0X06;//0000 0110
SET_SDA_OUT();
SET_SCL_OUT();
I2C_SCL=HIGH;
// I2C_SDA=HIGH;//SDA高电平
Delay_5us();//delay();//delayus(4);//延时2us
I2C_SDA=HIGH;//SDA高电平
// I2C_SCL=HIGH;//SCL高电平
Delay_5us();//delay();//delayus(4);//延时2us
}
//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Descrip
tion : Start Singnal
//--------------------------------------------------------------
void I2C_Start(void)
{
// SDA 1->0 while SCL High
SET_SDA_OUT();
SET_SCL_OUT();
I2C_SDA=HIGH;
Delay_5us();
I2C_SCL=HIGH;
Delay_5us();
I2C_SDA=LOW;
Delay_5us();
}
//--------------------------------------------------------------
// Prototype : void I2C_Stop(void)
// Calls : Delay_5us()
// Description : Stop Singnal
//--------------------------------------------------------------
void I2C_Stop(void)
{
// SDA 0->1 while SCL High
SET_SDA_OUT();
SET_SCL_OUT();
I2C_SCL=LOW;
I2C_SDA=LOW;/*STOP:when CLK is high DATA change form low to high*/
Delay_5us();
I2C_SCL=HIGH;
// Delay_5us();
I2C_SDA=HIGH;
Delay_5us();
}
//--------------------------------------------------------------
// Prototype : void I2C_SendACK(uchar ack);
// Calls : Delay_5us()
// Parameters : bit ack:1-noack, 0-ack
// Description : Master device send ACK to slave device.
//--------------------------------------------------------------
void I2C_SendACK(uchar ack)
{
uchar i=0;
SET_SCL_OUT();
I2C_SCL=HIGH;
Delay_5us();
SET_SDA_IN();
while((I2C_SDAM==1) (i<255))
i++;
I2C_SCL=LOW;
Delay_5us();
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
uchar IIC_Wait_Ack(void)
{
uchar ucErrTime=0;
I2C_SDA=HIGH;Delay_5us();
I2C_SCL=HIGH;Delay_5us();
SET_SDA_IN();
while(I2C_SDAM)
{
ucErrTime++;
if(ucErrTime>250)
{
I2C_Stop();
return 1;
}
}
I2C_SCL=LOW;
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
I2C_SCL=LOW;
SET_SDA_OUT();
I2C_SDA=LOW;
Delay_5us();
I2C_SCL=HIGH;
Delay_5us();
I2C_SCL=LOW;
}
//不产生ACK应答
void IIC_NAck(void)
{
I2C_SCL=LOW;
SET_SDA_OUT();
I2C_SDA=HIGH;
Delay_5us();
I2C_SCL=HIGH;
Delay_5us();
I2C_SCL=LOW;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(unsigned char txd)
{
unsigned char t;
SET_SDA_OUT();
I2C_SCL=LOW;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
I2C_SDA=(txd 0x80)>>7;
txd<<1;
Delay_5us();
I2C_SCL=HIGH;
Delay_5us();
I2C_SCL=LOW;
Delay_5us();
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SET_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++)
{
I2C_SCL=LOW;
Delay_5us();
I2C_SCL=HIGH;
receive<<=1;
if(I2C_SDAM)receive++;
Delay_5us();
}
if(!ack)
IIC_NAck();//发送NACK
else
IIC_Ack();//发送ACK
return receive;
}
//PCF8563写函数
//address:地址
//dat:参数
void write_Data(unsigned char address,unsigned char dat)
{
I2C_Start();
IIC_Send_Byte(0xa2);
IIC_Wait_Ack();
IIC_Send_Byte(address);//发送地址
IIC_Wait_Ack();
IIC_Send_Byte(dat);//发送字节
IIC_Wait_Ack();
I2C_Stop();//产生一个停止条件
}
//PCF8563读函数
//有返回值
//带入参数
unsigned char receive_Data(unsigned char regadd)
{
unsigned char temp=0;
I2C_Start();
IIC_Send_Byte(0xa2);//发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(regadd);
IIC_Wait_Ack();
I2C_Start();
IIC_Send_Byte(0xa3);//进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
I2C_Stop();//产生一个停止条件
return temp;
}