打印
[其他ST产品]

使用STR710 I2C软件库的问题,帮忙看看,谢谢!

[复制链接]
2156|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ARM白痴|  楼主 | 2007-5-29 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了这2个函数,当NbOfBytes大于或等于2时,没有问题。当NbOfBytes为1时,写入的数据能够读出来,但是EEPROM_Receive执行后,发现SDA没有变高,只能从新上电才恢复。

void EEPROM_Send(I2C_TypeDef *I2Cx, char *PtrToBuffer, u8 NbOfBytes, 
                u8 InternalAddress);
void EEPROM_Receive(I2C_TypeDef *I2Cx, char *PtrToBuffer,u8 NbOfBytes, u8 InternalAddress);
沙发
ST_ARM| | 2007-5-30 10:53 | 只看该作者

这只是个例程

客户可以根据自己的需要修改。

使用特权

评论回复
板凳
ARM白痴|  楼主 | 2007-5-30 11:59 | 只看该作者

不知道一个字节的怎么写。。。

在710 I2C的datasheet中有句:“当作为主接受器时,要在最后一次接受数据字节后产生非应答脉冲,必须在读入倒数第二个数据字节之前清楚ACK位。”
所以void EEPROM_Receive(I2C_TypeDef *I2Cx, char *PtrToBuffer,u8 NbOfBytes, u8 InternalAddress)是这样处理的:
while(NbOfBytes)
{
   /* Wait until the byte is received */
   while (I2C_FlagStatus (I2Cx, DIRECT, I2C_BTF )==RESET);

  if(NbOfBytes==2)
  { /* Disable the ACK generation */
    I2C_AcknowledgeConfig (I2Cx, DISABLE);
  }

  if (NbOfBytes==1)
    {
  /* Generate STOP condition to close the communication after the
     next byte reception */ 
      I2C_STOPGenerate (I2Cx, ENABLE);
    }

  *PtrToBuffer=I2C_ByteReceive (I2Cx);
   PtrToBuffer++;
   NbOfBytes--;
}

因为NbOfBytes为1,所以不能有“读入倒数第二个数据字节之前”
我改为

while(I2C_FlagStatus(I2Cx, DIRECT, I2C_BTF) == RESET);  
// Wait until the byte is received 

I2C_AcknowledgeConfig(I2Cx, DISABLE); // Disable the ACK eneration   
  
I2C_STOPGenerate(I2Cx, ENABLE);

*PtrToBuffer = I2C_ByteReceive(I2Cx);

I2C_AcknowledgeConfig(I2Cx, ENABLE);  // Enable the ACK generation

这样虽然能够读出正确的数据,但是IIC总线的SDA不能被释放。。。

使用特权

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

本版积分规则

32

主题

119

帖子

0

粉丝