zoukankan      html  css  js  c++  java
  • STM32 i2c通讯失败复位方法

    最近在调研STM32 F10X,准备把公司AVR的MCU项目迁移到STM32上。在调研STM32 i2c这一部分时,在与i2c slave硬件连接断开后,这时再去读/写 i2c slave需要STM32这边的i2c_read/write函数做一些处理。

    刚开始在i2c读写timeout后,添加了如下代码:

    I2C_AcknowledgeConfig(I2C1, DISABLE);        
    /*!< Send STOP Condition */
    I2C_GenerateSTOP(I2C1, ENABLE); 
    

     再把i2c slave连接起来,进行i2c read/write时,发现一直卡在下面两个位置:

    I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)
    

     或者

    I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)
    

     也就是说i2c slave再连接起来后,i2c总线会一直busy或者start信号发出后没有反应,此方案行不通。

    在浏览stm32f10x_i2c.c库时,看到了有void I2C_DeInit(I2C_TypeDef* I2Cx)函数,在i2c读写timeout后,添加:

    I2C_DeInit(I2C1);
    I2c_Configuration();
    

     问题就解决了。

    I2c_Configuration()函数如下:

    void I2c_Configuration(void)
    {
    	I2C_InitTypeDef  I2C_InitStructure;
    	
    	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    	I2C_InitStructure.I2C_ClockSpeed = 100000;
    	I2C_Init(I2C1, &I2C_InitStructure);
    	
    	I2C_Cmd(I2C1, ENABLE);	
    }
    
  • 相关阅读:
    JAXB
    Servlet编码和解码
    FileUpload
    DataSource
    20200821 二分搜索
    火狐账户如何在Android手机端与电脑端同步
    20200807 贪心;排队接水;[AHOI2018初中组]分组;国王的游戏
    20200802 高精度问题 阶乘之和
    20200803 牛客多校赛
    20200207
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/12714965.html
Copyright © 2011-2022 走看看