你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IIC总线一直忙

[复制链接]
saefra 提问时间:2015-11-11 14:31 /
我用IIC写东西,仅仅是写,读都不要,初始化的时候直接写,却一开始就总线忙(风驰里面的IIC代码),具体如下:
<1>main    /*************/                    (大概就是这意思,工程太大,我把主要涉及的搬上来)
{INIT_TAS5756();}           
<2>   void INIT_TAS5756(void) //初始化从器件
{
        I2C_MASTERMODE_Init(STANDARDSPEED); //初始化IIC
        u8NumOfReg = sizeof(tas5756_LR_init)/sizeof(Struct_Tas5756);  
        for(i=0;i<u8NumOfReg;i++)
        {
                 I2c_Tx[0]=tas5756_LR_init.address;
                I2c_Tx[1]=tas5756_LR_init.data;
        I2C_EERROM_WriteOnePage(I2c_Tx, TAS5756_LR, 2);   //往从器件里面写
         }

}
<3>void I2C_MASTERMODE_Init(I2C_SpeedMode_TypeDef I2C_Speed) //IIC的初始化函数
{
        I2C_Init(I2C_Speed, I2C1_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2,\
                I2C_ACK_CURR, I2C_ADDMODE_7BIT, CLK_GetClockFreq()/1000000);       
        I2C_Cmd(ENABLE);
}
<4>void I2C_EERROM_WriteOnePage(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)   //IIC写的函数
{
    /* 等待空闲 */
    while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));     //什么都没干,这一句就卡住了

    /* 发起始位 */
    I2C_GenerateSTART(ENABLE);

    /* 测试EV5 ,检测从器件返回一个应答信号*/
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

    /* 设置I2C从器件地址,I2C主设备为写模式*/
    I2C_Send7bitAddress(WriteAddr, I2C_DIRECTION_TX);

  //I2C_Send7bitAddress(EEPROM_ADDRESS, I2C_DIRECTION_TX);
    /* 测试EV6 ,检测从器件返回一个应答信号*/
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


    //I2C_SendData((u8)(WriteAddr));
    /* 测试EV8 ,检测从器件返回一个应答信号*/
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING));  

    /* 不断往从设备写数据*/
    while(NumByteToWrite--)  
    {

      I2C_SendData(*pBuffer);

      /*指针指向下一个地址*/
      pBuffer++;

      /* 测试EV6 ,检测从器件返回一个应答信号*/
      while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
      I2C_AcknowledgeConfig(I2C_ACK_CURR);
    }

    /* 发结束位*/
    I2C_GenerateSTOP(ENABLE);
}

<5>FlagStatus I2C_GetFlagStatus(I2C_Flag_TypeDef I2C_Flag)  //总线忙的函数,就是卡在这
{
  uint8_t tempreg = 0;
  uint8_t regindex = 0;
  FlagStatus bitstatus = RESET;

  /* Check the parameters */
  assert_param(IS_I2C_FLAG_OK(I2C_Flag));

  /* Read flag register index */
  regindex = (uint8_t)((uint16_t)I2C_Flag >> 8);
  /* Check SRx index */
  switch (regindex)
  {
      /* Returns whether the status register to check is SR1 */
    case 0x01:
      tempreg = (uint8_t)I2C->SR1;
      break;

      /* Returns whether the status register to check is SR2 */
    case 0x02:
      tempreg = (uint8_t)I2C->SR2;
      break;

      /* Returns whether the status register to check is SR3 */
    case 0x03:
      tempreg = (uint8_t)I2C->SR3;
      break;

    default:
      break;
  }

  /* Check the status of the specified I2C flag */
if ((tempreg & (uint8_t)I2C_Flag ) != 0)
  {
    /* Flag is set */
    bitstatus = SET;    //只能跑到这了,
  }
  else
  {
    /* Flag is reset */
    bitstatus = RESET;   //一直到不了这个,iic一直忙
  }
  /* Return the flag status */
  return bitstatus;
}
收藏 1 评论5 发布时间:2015-11-11 14:31

举报

5个回答
saefra 回答时间:2015-11-11 17:08:04
什么情况~~~!!!这论坛这个社区一直不错的呀,都没人理???
回答时间:2015-11-12 09:16:22
I2C初始化过没有,初始化完成以后,寄存器状态是否正确?
saefra 回答时间:2015-11-12 10:44:16
安 发表于 2015-11-12 09:16
I2C初始化过没有,初始化完成以后,寄存器状态是否正确?

初始化过啦,上面有贴,IIC也配置了。
好的,我再看看初始化后寄存器的情况~~~
回答时间:2015-11-12 11:01:26
IO,时钟配置,都初始化了吗?
peter001 回答时间:2015-11-12 13:07:48
从设备时序错误会导致这问题,或者异常mcu复位也会导致

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版