[应用相关] 非常奇怪的I2C地址问题,召唤达人!

[复制链接]
8147|36
香水城 发表于 2008-7-2 15:56 | 显示全部楼层

请问你配置的I2C频率是多少?

根据19楼的图表,当I2C频率低于100kHz时,要求高电平至少为3V,如果你的上拉不够,则可能达不到3V,请用示波器看看,万用表实测不出来的!

再根据19楼的图表,当I2C频率低于350kHz时,要求高电平至少为0.7VDD,如果你的供电电压为最小的8V,则高电平至少应该是5.6V,这个电平是STM32所达不到的。

结论:你必须降低I2C的频率(<100kHz),使用很好的上拉,最好上拉到5V,5V是STM32能承受的最高电压。这样才能保证好的通讯。不管怎样,请用示波器调试以确保正常电平。
香水城 发表于 2008-7-2 16:10 | 显示全部楼层

不好意思,不是0xA2,是0xC2

不好意思,不是0xA2,是0xC2
 楼主| mzscg 发表于 2008-7-2 16:17 | 显示全部楼层

召唤香水城

麻烦解答下问题撒。
香水城 发表于 2008-7-2 16:19 | 显示全部楼层

21、22楼的回答不满意吗?

 楼主| mzscg 发表于 2008-7-2 17:22 | 显示全部楼层

路过的大侠们,I2C问题啊,头烧的

兄弟们,伸出援助之手啊,
不回答的也来顶顶啊,偶搞了好久了。
 楼主| mzscg 发表于 2008-7-2 17:23 | 显示全部楼层

我怎么无法回贴了。

如题,怎么是0xC2啊香水。
 楼主| mzscg 发表于 2008-7-2 17:25 | 显示全部楼层

不好意思,我没有看到第2页。

我照相机着你的方法试一下吧。
xwj 发表于 2008-7-2 17:32 | 显示全部楼层

注意:IIC的地址是7位,但是高7位,bit0是读写选择

所以合并后还是8位
 楼主| mzscg 发表于 2008-7-2 17:34 | 显示全部楼层

香水,用示波器测了,

空载的时候SDA与SCL的电压都在2.9-3.0之间。
这个电压确实有点低,
你说VDD可以提到5V,可datasheet是2V<=VDD<=3.6;如图:
 楼主| mzscg 发表于 2008-7-2 17:37 | 显示全部楼层

回复xwj:我知道啊,可是firmlib

 firmlib里的函数我直接调用了:
I2C_Send7bitAddress(I2C2, MOTOR_WRITE_ADDRESS7, I2C_Direction_Transmitter);

I2C_Direction_Transmitter已经表明是读是写了,
那么从设备地址MOTOR_WRITE_ADDRESS7应该是怎么算呢?我都搞糊涂了。
香水城 发表于 2008-7-2 17:46 | 显示全部楼层

I2C使用的是开漏输出驱动电路,可以使用外部上拉

STM32的非ADC I/O管脚是5V容忍,所以可以上拉到5V。
香水城 发表于 2008-7-2 17:50 | 显示全部楼层

29楼注意:我没有说VDD可以使用5V,我是说I2C的信号可以上拉

请再仔细看我在21楼的帖子。
 楼主| mzscg 发表于 2008-7-2 18:12 | 显示全部楼层

香水,如果我上拉到5V

假设我的芯片可以被驱动了。
那么stm32上的I2C它认为的高低电平的值又是多少呢??
我找datasheet找不到stm32关于I2C的说明啊,
麻烦下你贴一下,今天非常感谢你啊
香水城 发表于 2008-7-2 18:32 | 显示全部楼层

请看STM32的数据手册

在第5.3.12节I/O port characteristics

高电平识别:最低2V,最高5.5V。
相关链接:http://www.st.com/stonline/products/literature/ds/13587.pdf
nomoneyiv 发表于 2008-7-3 08:40 | 显示全部楼层

顶一下,关注!

顶一下,关注!
 楼主| mzscg 发表于 2008-7-3 11:07 | 显示全部楼层

楼上的,香水,我的代码肯定没错吧。

以下为我的代码:
I2C_GenerateSTART(I2C2, ENABLE);
  /* Test on I2C2 EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); 
  /* Send I2C slave Address for write */
  I2C_Send7bitAddress(I2C2, MOTOR_WRITE_ADDRESS7, I2C_Direction_Transmitter);
   
  /* Test on I2C2 EV6 and clear it */
程序一直死在这里,等待不到ACK:  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  I2C_SendData(I2C2,Cmd_Byte);
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2,ENABLE);

香水城 发表于 2008-7-3 11:31 | 显示全部楼层

你把STM32的管脚烧坏了,程序如何能正确运行?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部