求一个ZLG7290和STM32应用的代码程序参考,参考,模拟I2C,我自己模拟的有问题,好久读出的数都是FF

2019-10-16 00:41发布

我用的PB6.7,PB4是INT信号,7290读出的数据都是FF。这个总线上挂了一个PCF8563,读出的数据也是乱的,不知道是我代码问题还是什么,,求之低昂

#define SCL_H         GPIOB->BSRR = GPIO_Pin_6
#define SCL_L         GPIOB->BRR  = GPIO_Pin_6
   
#define SDA_H         GPIOB->BSRR = GPIO_Pin_7
#define SDA_L         GPIOB->BRR  = GPIO_Pin_7

#define SCL_read      GPIOB->IDR  & GPIO_Pin_6
#define SDA_read      GPIOB->IDR  & GPIO_Pin_7


u8 IRcvStr_7290(u8 suba)
{
   u8  s;

   I2C_Start();
   I2C_SendByte(0x70);
   I2C_WaitAck();       
   I2C_SendByte(suba); /*发送器件子地址*/
   I2C_WaitAck();
   I2C_Start(); 
   I2C_SendByte(0x71);
   I2C_WaitAck();
   s=I2C_ReceiveByte(); 
   I2C_NoAck();                  /*发送非应位*/
   I2C_Stop();                   /*结束总线 */ 
  return(s);
}
求大神指点
void I2C_GPIO_Config(void)

GPIO_InitTypeDef  GPIO_InitStructure; //GPIO结构体定义 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能I2C的IO口       
/* PB6-I2C1_SCL、PB7-I2C1_SDA*/  
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;        // 开漏输出  
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化结构体配置 

}


void I2C_delay(void)
{
   u8 i=150; //这里可以优化速度 ,经测试最低到5还能写入
   while(i) 
   { 
     i--; 
   } 
}

bool I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
return TRUE;
}

void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}

void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}

void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}

bool I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
      SCL_L;
      return FALSE;
}
SCL_L;
return TRUE;
}

void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else 
        SDA_L;   
        SendByte<<=1;
        I2C_delay();
SCL_H;
        I2C_delay();
    }
    SCL_L;
}

u8 I2C_ReceiveByte(void)  //数据从高位到低位//

    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
 SCL_H;
      I2C_delay();
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    return ReceiveByte;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
MonkeyD路飞
1楼-- · 2019-10-16 20:41
1206447373 发表于 2015-4-5 19:11
周立功的芯片在兼容性方面本来就很差,你要把IIC的频率调到最小,还有就是确定硬件没问题,我开始我是上升 ...

i2c的频率怎么调小,就是调GPIO口的速率么
1206447373
2楼-- · 2019-10-16 21:28
肯定不是撒。如果你是模拟的IIC你就把模拟操作之间的延时加大一点,如是硬件的有个地方是初始化IIC设置频率的,把他调大

一周热门 更多>