打印
[STM8]

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

[复制链接]
2008|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xu0801hua|  楼主 | 2015-5-25 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大师帮忙看看这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()
// 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;
}
沙发
wyde518| | 2015-5-25 12:56 | 只看该作者
问问题的时候最好说一下基本问题,直接来个-不对,就贴上源程序,是不是有点小懒啊

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xu0801hua + 1 赞一个!
板凳
xu0801hua|  楼主 | 2015-5-25 13:01 | 只看该作者
wyde518 发表于 2015-5-25 12:56
问问题的时候最好说一下基本问题,直接来个-不对,就贴上源程序,是不是有点小懒啊 ...

问题是,读出的数据与我写进的参数不一致

使用特权

评论回复
地板
周董| | 2015-5-25 20:57 | 只看该作者
大叔不累就好,可怜看代码的人了。。。最好是少贴点代码吧。。

使用特权

评论回复
5
xu0801hua|  楼主 | 2015-5-26 16:32 | 只看该作者
周董 发表于 2015-5-25 20:57
大叔不累就好,可怜看代码的人了。。。最好是少贴点代码吧。。

问题解决了,谢谢

使用特权

评论回复
6
philix| | 2015-12-17 16:35 | 只看该作者
xu0801hua 发表于 2015-5-26 16:32
问题解决了,谢谢

是什么问题,方便后来人。

使用特权

评论回复
7
0号小布| | 2018-9-25 19:49 | 只看该作者
你好,楼主,你的问题是怎样解决的?我也碰到了类似的问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

81

帖子

1

粉丝