打印

请教香主:STM32读外部RTC的IIC通讯无应答

[复制链接]
3952|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thinpadhoho|  楼主 | 2010-5-13 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 thinpadhoho 于 2010-5-13 16:11 编辑

我用STM32读外部RTC(8025),IIC通讯,主机发0x64后,然后开始读,通过示波器我发的数据是对的,0x64+读标志位=发的应该是0x65,但没有收到应答位,速度100K,第一次执行I2C_Send7bitAddress,发的是0x65,是8位,没有收到应答位,再单步执行I2C_Send7bitAddress的话,发的就是0x65 0x65 变成16位了,这是怎么回事?
程序如下:
  /* I2C1 configuration ------------------------------------------------------*/
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
  I2C_Init(I2C1, &I2C_InitStructure);
  
  I2C_GenerateSTART(I2C1, ENABLE);  
  
  while(1)
  {
  I2C_Send7bitAddress(I2C1, 0x64, I2C_Direction_Receiver);  
  }
  
  for(i=0; i<16; i++)
  {
    //if((I2C_CheckEvent(I2C1,
I2C_EVENT_MASTER_BYTE_RECEIVED)))  
   Buffer = I2C_ReceiveData(I2C1);
  }
沙发
hsbjb| | 2010-5-13 19:25 | 只看该作者
之前调I2C也是收不到应答位

使用特权

评论回复
板凳
sinadz| | 2010-5-13 19:34 | 只看该作者
LS怎么解决的呢

使用特权

评论回复
地板
thinpadhoho|  楼主 | 2010-5-18 11:14 | 只看该作者
没有搞定啊 最后用IO口模拟的

使用特权

评论回复
5
IJK| | 2010-5-18 12:16 | 只看该作者
用示波器看一下,IO口模拟和用I2C硬件有什么区别

使用特权

评论回复
6
ST_ARM| | 2010-5-18 15:10 | 只看该作者
首先,你写的代码不符合I2C的规范;
  I2C_GenerateSTART(I2C1, ENABLE);  
??? 发送起始条件后,你没有检测你发送起始条件是否成功,你需要读取状态位进行检测并清除该标志位。  
  while(1)
  {
  I2C_Send7bitAddress(I2C1, 0x64, I2C_Direction_Receiver);  
  }
??? 你循环发送地址是何用意?发送地址后,你说没有收到应答位,请问你在哪里检测应答了?
  for(i=0; i<16; i++)
  {
    //if((I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)))  
   Buffer = I2C_ReceiveData(I2C1);
  }
???此处接收数据,你也没有检测标志位,你怎么知道I2C的寄存器中的数据就是正确收到的数据?

请重新研读I2C规范和STM32的I2C外设章节。谢谢!

使用特权

评论回复
7
thinpadhoho|  楼主 | 2010-5-18 15:25 | 只看该作者
已经搞定了  6楼正解 谢谢 ST_ARM

使用特权

评论回复
8
yytdragon| | 2010-5-18 15:26 | 只看该作者
唉。。。这种情况一般都是自己的问题,要么是程序,要么是硬件=。=
动不动就什么垃圾之类的。。。。

使用特权

评论回复
9
香水城| | 2010-5-18 15:30 | 只看该作者
本帖最后由 香水城 于 2010-5-18 15:39 编辑

哈哈,有些人眼里只有垃圾。

使用特权

评论回复
10
thinpadhoho|  楼主 | 2010-5-18 15:33 | 只看该作者
刚开始我加了检测的 后来不行我才去掉的
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
  /* Send Header to I2C2 for write */
  
   /* Send I2C2 slave Address for write */
  I2C_Send7bitAddress(I2C1, 0x64,  I2C_Direction_Transmitter);
  /* Test on I2C2 EV1 and clear it */
  
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

ST的while检测函数不是很合理 如果IIC通讯过程出现问题或通讯失败程序会死循环等待 需要加看门狗 同时通讯前关所有中断 通讯后开中断

使用特权

评论回复
11
thinpadhoho|  楼主 | 2010-5-18 15:34 | 只看该作者
素质 注意素质

使用特权

评论回复
12
thinpadhoho|  楼主 | 2010-5-18 15:39 | 只看该作者
问题是 标题写的请教香主 发了n天了 您老人家好歹进来回句话呀  

9喽丢人

使用特权

评论回复
13
香水城| | 2010-5-18 16:10 | 只看该作者
不好意思啊,这里是公共论坛,为什么你一定要点名问问题呢?

再说这个外部RTC(8025)我也没有用过,无法回答你的问题呀,:$

使用特权

评论回复
14
thinpadhoho|  楼主 | 2010-5-18 16:27 | 只看该作者
本帖最后由 thinpadhoho 于 2010-5-18 16:30 编辑

因为仰慕您是版主啊 要不然怎么点名问呢 通讯的东西不一样 但机理相同
https://bbs.21ic.com/viewthread.p ... ight=STM32%2BI2C%2B
看这个 之前也有人 出现类似的问题
相似的问题应该总结下 避免后面的人犯同样的错误和提类似的问题

使用特权

评论回复
15
thinpadhoho|  楼主 | 2010-5-18 16:30 | 只看该作者
人家虚心向您请教问题 您老不理不睬 是不是有点不太好 您说是不?

使用特权

评论回复
16
香水城| | 2010-5-18 17:05 | 只看该作者
实在不好意思,我没有实际调试过程序,实在是回答不了你的问题,辜负了你的厚望,抱歉抱歉,:L

使用特权

评论回复
17
thinpadhoho|  楼主 | 2010-5-18 17:18 | 只看该作者
没关系

使用特权

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

本版积分规则

7

主题

38

帖子

0

粉丝