发新帖我要提问
12
返回列表
打印
[应用相关]

非常奇怪的I2C地址问题,召唤达人!

[复制链接]
楼主: mzscg
手机看帖
扫描二维码
随时随地手机跟帖
21

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

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

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

结论:你必须降低I2C的频率(<100kHz),使用很好的上拉,最好上拉到5V,5V是STM32能承受的最高电压。这样才能保证好的通讯。不管怎样,请用示波器调试以确保正常电平。

使用特权

评论回复
22
香水城| | 2008-7-2 16:10 | 只看该作者

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

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

使用特权

评论回复
23
mzscg|  楼主 | 2008-7-2 16:17 | 只看该作者

召唤香水城

麻烦解答下问题撒。

使用特权

评论回复
24
香水城| | 2008-7-2 16:19 | 只看该作者

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

使用特权

评论回复
25
mzscg|  楼主 | 2008-7-2 17:22 | 只看该作者

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

兄弟们,伸出援助之手啊,
不回答的也来顶顶啊,偶搞了好久了。

使用特权

评论回复
26
mzscg|  楼主 | 2008-7-2 17:23 | 只看该作者

我怎么无法回贴了。

如题,怎么是0xC2啊香水。

使用特权

评论回复
27
mzscg|  楼主 | 2008-7-2 17:25 | 只看该作者

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

我照相机着你的方法试一下吧。

使用特权

评论回复
28
xwj| | 2008-7-2 17:32 | 只看该作者

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

所以合并后还是8位

使用特权

评论回复
29
mzscg|  楼主 | 2008-7-2 17:34 | 只看该作者

香水,用示波器测了,

空载的时候SDA与SCL的电压都在2.9-3.0之间。
这个电压确实有点低,
你说VDD可以提到5V,可datasheet是2V<=VDD<=3.6;如图:

使用特权

评论回复
30
mzscg|  楼主 | 2008-7-2 17:37 | 只看该作者

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

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

I2C_Direction_Transmitter已经表明是读是写了,
那么从设备地址MOTOR_WRITE_ADDRESS7应该是怎么算呢?我都搞糊涂了。

使用特权

评论回复
31
香水城| | 2008-7-2 17:46 | 只看该作者

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

STM32的非ADC I/O管脚是5V容忍,所以可以上拉到5V。

使用特权

评论回复
32
香水城| | 2008-7-2 17:50 | 只看该作者

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

请再仔细看我在21楼的帖子。

使用特权

评论回复
33
mzscg|  楼主 | 2008-7-2 18:12 | 只看该作者

香水,如果我上拉到5V

假设我的芯片可以被驱动了。
那么stm32上的I2C它认为的高低电平的值又是多少呢??
我找datasheet找不到stm32关于I2C的说明啊,
麻烦下你贴一下,今天非常感谢你啊

使用特权

评论回复
34
香水城| | 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

使用特权

评论回复
35
nomoneyiv| | 2008-7-3 08:40 | 只看该作者

顶一下,关注!

顶一下,关注!

使用特权

评论回复
36
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);

使用特权

评论回复
37
香水城| | 2008-7-3 11:31 | 只看该作者

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

使用特权

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

本版积分规则