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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版