智能车制作

 找回密码
 注册

扫一扫,访问微社区

STM32论坛
查看: 7945|回复: 2
打印 上一主题 下一主题

STM32的I2C问题

[复制链接]

5

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
威望
194
贡献
74
兑换币
0
注册时间
2011-5-4
在线时间
5 小时
跳转到指定楼层
1#
发表于 2011-5-23 08:46:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过I2C对C3088的寄存器进行配置,读设备地址为0xc0,写地址为0xc1,现在得不到我想要的结果,我想看看寄存器配置成功没有就写了个通过I2C读寄存器的函数,当我调用读寄存器的函数时就检测不到总线空闲的标志,一直处于忙的状态,不知道是怎么回事
代码如下:
void I2C_Configuration(void)
{
  I2C_InitTypeDef   I2C_InitStructure;
  I2C_Cmd(I2C1, ENABLE);
  /* I2C1 Init */
  //===========================
   I2C_DeInit(I2C1);
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //设置I2C为I2C模式
  //===========================
  //I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;                   //有应答的通信
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 100000;
  I2C_Init(I2C1, &I2C_InitStructure);
  
  //===============================
   /*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
  //===============================
}
void I2C_C3088_ConfReg_Write(u8 Reg_Addr,u8 RegValue)
{
  /*----- Transmission Phase -----*/

  while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET); //只有BUSY = 0 时, 可以发送开始位
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
   
  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {        
  }
  
  /* Send C3088 slave address for write */
  I2C_Send7bitAddress(I2C1, C3088_Addr, I2C_Direction_Transmitter);
  
  /* Test on I2C1 EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }
  /* Send the configuration register data pointer */
  I2C_SendData(I2C1, Reg_Addr);
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* Send I2C1 data */
  I2C_SendData(I2C1, RegValue);
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);     
}
u8 I2C_C3088_ConfReg_Read(u8 Reg_Addr)
{
  u8 RegValue = 0;

  /*----- Transmission Phase -----*/
  while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET); //只有BUSY = 0 时, 可以发送开始位
  //=================================
  /*允许1字节1应答模式*/
  I2C_AcknowledgeConfig(I2C1, ENABLE);
  //==============================
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  //===========================
  /* Send c3088 read address for write */
  I2C_Send7bitAddress(I2C1, C3088_Addr, I2C_Direction_Transmitter);
  //===========================
  /* Test on I2C1 EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

  /* Send the configuration register data pointer */
  I2C_SendData(I2C1, Reg_Addr);
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /*----- Reception Phase -----*/
  //while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET); //只有BUSY = 0 时, 可以发送开始位
  /* Send Re-STRAT condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* Send STLM75 slave address for read */
  I2C_Send7bitAddress(I2C1, C3088_Addr_read, I2C_Direction_Receiver);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  /* EV6 */
  {
  }

  /* Disable I2C1 acknowledgement */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
  
  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);

  /* Test on EV7 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* Store I2C1 received data */
  RegValue = I2C_ReceiveData(I2C1);
  //=================================
  I2C_AcknowledgeConfig(I2C1, ENABLE);
  //=================================   
  /* Return configuration register value */
  return (RegValue);   
}

5

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
威望
194
贡献
74
兑换币
0
注册时间
2011-5-4
在线时间
5 小时
2#
 楼主| 发表于 2011-5-24 09:45:09 | 只看该作者
为什么看不见别人的回复呢????气死了!
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
威望
194
贡献
74
兑换币
0
注册时间
2011-5-4
在线时间
5 小时
3#
 楼主| 发表于 2011-5-26 11:17:54 | 只看该作者
这个问题已经解决了,我的从设备其实是用的SCCB总线,它跟I2C是差不多的,有两个地方有点区别:
1.SCCB总线通信协议只支持100Kb/s或400Kb/s的传输速度
2.SCCB在读时,需要再增加一个总线停止条件
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-2 16:07 , Processed in 0.064402 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表