打印

帮忙看下 笙泉 MA82G5B32AD32 ,硬件I2C读取24C64为什么不能连读

[复制链接]
1785|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uint32_t Eeprom_Read(uint16_t reg_addr)
{
  uint8_t xdata data_num = 4;  //送4次数据
  uint32_t xdata reg_data = 0;
  reg_addr = reg_addr * 4;


  SICON |= STA;  //起始信号
  SICON &= ~SI;
  while((SICON & SI) != SI);
  SICON &= ~STA;

  SIDAT = dev_addr; //设备地址(写)
  SICON &= ~SI;
  while((SICON & SI) != SI);

  SIDAT = (uint8_t)(reg_addr >> 8); //数据地址(高位)
  SICON &= ~SI;
  while((SICON & SI) != SI);

  SIDAT = (uint8_t)reg_addr; //数据地址(低位)
  SICON &= ~SI;
  while((SICON & SI) != SI);

  SICON |= STA; //开始信号
  SICON &= ~SI;
  while((SICON & SI) != SI);
  SICON &= ~STA;

  SIDAT = dev_addr | 0x01;  //设备地址(读)
  SICON &= ~SI;
  while((SICON & SI) != SI);

  while(data_num--)
  {
    SICON &= ~SI;    //读数据
    while((SICON & SI) != SI);
    while(SDA != 1);
    reg_data <<= 8;
    reg_data += SIDAT;
  }

  SICON |= STO;    //停止信号
  SICON &= ~SI;
  while((SICON & STO) == STO);

  return reg_data;
}


X2~S3~XK0GY[BCQIQM{CG$Y.png (21.46 KB )

I2C

I2C
沙发
Dong~| | 2015-8-26 09:59 | 只看该作者
连续读数据要发送ACK!
        for(i=0;i<ucCnt;i++)
        {
                if(i!=ucCnt-1)
                {
                        SICON=SICON|AA;        //非最后一个数据, 发送ACK
                }
                else
                {
                        SICON=SICON&(~AA);          
                }
                SICON &=~SI;                       
                while((SICON&SI)!=SI);                // 等待接收完成
                ucBuf[i] = SIDAT;                         // 读取数据
        }

使用特权

评论回复
板凳
forget345| | 2015-8-26 17:51 | 只看该作者
读的ACK低电平 应该是接收者 MCU 发送的 。看看你的I2C初始化,SICON的AA位是否为高

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝