你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请大师帮忙看看这I2C读写PCF8563怎么不对?这是stms单片机...

[复制链接]
xu0801hua 提问时间:2015-5-25 13:20 /
请大师帮忙看看这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;
}

收藏 评论0 发布时间:2015-5-25 13:20

举报

0个回答

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版