请大师帮忙看看这I2C读写PCF8563怎么不对?错误在那?这是stms单片机在stvd环境下进行编程?

2019-07-19 21:38发布

请大师帮忙看看这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 
//  C_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()
// Description    : 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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。