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

还是坑爹的I2C问题

[复制链接]
ww_升 提问时间:2015-8-14 16:13 /
STM8S003F3P6单片机
使用硬件I2C,程序经常死机,偶尔才正常,一直死在I2C_CheckEvent 函数里面,
弄得好心累,求大神解救
程序如下:
#define I2C_Speed              100000
#define I2C1_SLAVE_ADDRESS7    0xA0
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_OD_HIZ_FAST);//PB4 I2C_SCL 功能引脚,总线的时钟脚,设为高速开漏高阻输出。
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_OD_HIZ_FAST);//PB5 I2C_SDA 功能引脚,总线的数据脚,设为高速开漏高阻输出

/*********************************************
I2C总线写一个字节
**********************************************/
void I2C_Write(unsigned char ADDR,unsigned char Wdata)
{
          ITStatus it_status;
                FlagStatus flag_status;
               
                I2C_GenerateSTART(ENABLE);                                                //I2C启动  /* Send STRAT condition */
                /* Test on EV5 and clear it */
                //while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT ));
          
          I2C_Send7bitAddress(ADDR, I2C_DIRECTION_TX);   //写I2C从器件地址和写方式
                /* Test on EV6 and clear it */
    //while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
                while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
          
          I2C_SendData(Wdata);                                 //写数据到器件相应寄存器
                /* Test on EV8 and clear it */
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING));
               
          /* Send STOP condition */
    I2C_GenerateSTOP(ENABLE);
}

/*********************************************
I2C总线读一个字节
返回:16位数值
**********************************************/
unsigned int I2C_Read(unsigned char ADDR)
{
   unsigned int temp;
                unsigned char tmp1,tmp2;
                  /* While the bus is busy */
                while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
       
                I2C_GenerateSTART(ENABLE);                                                //I2C启动        /* Generate start & wait event detection */
          /* Test on EV5 and clear it */
                //while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

                I2C_Send7bitAddress(ADDR, I2C_DIRECTION_RX);   //写I2C从器件地址和写方式
                /* Test on EV6 and clear it */
    //while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
                while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
                //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
                /* 2 variables are used to avoid any compiler optimization */
      /* Read the SR1 register */
      tmp1 = I2C->SR1;
      /* Read the SR3 register */
      tmp2 = I2C->SR3;
               
                while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
          temp = I2C_ReceiveData();//启动主I2C读方式
                             //读取I2C接收数据 第一字节
                /* Disable Acknowledgement */
                I2C_AcknowledgeConfig(I2C_ACK_NONE);
               
          
                while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
          temp = (temp<<8)+I2C_ReceiveData();        //读第二字节 合成16位数值
                I2C_GenerateSTOP(ENABLE);                      //I2C停止
                I2C_AcknowledgeConfig(I2C_ACK_CURR);                                    //启动主I2C读方式,结果应答NO_ACK
               
          return temp;
}



收藏 1 评论2 发布时间:2015-8-14 16:13

举报

2个回答
你好我好大家好! 回答时间:2015-8-14 19:09:00
:):):)
ww_升 回答时间:2015-9-29 08:34:43
解决了,及时清除标志位,然后加个超时保护就可以很稳定了。

所属标签

相似问题

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