OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5760|回复: 7

STM32F0 硬件IIC卡死

[复制链接]

21

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-6-8
在线时间
79 小时
发表于 2017-12-20 15:51:46 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 我叫做大熙熙 于 2017-12-20 15:53 编辑

芯片:STM32F071CB
管脚定义:PB13 - I2C_SCL
                PB14 - I2C_SDA

STM32F0 管脚复用说明

STM32F0 管脚复用说明

相关源码程序如下:
[mw_shl_code=c,true]void i2c_config()
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
   
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
   
    GPIO_Init(GPIOB,&(GPIO_InitTypeDef){
       .GPIO_Mode  = GPIO_Mode_AF,  
       .GPIO_OType = GPIO_OType_OD,
       .GPIO_PuPd  = GPIO_PuPd_UP,
       .GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14,
        .GPIO_Speed = GPIO_Speed_2MHz});

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
   
    I2C_Init(I2C2,&(I2C_InitTypeDef){
        .I2C_Mode                = I2C_Mode_SMBusHost,//I2C_Mode_I2C,
        .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
        .I2C_AnalogFilter        = I2C_AnalogFilter_Disable,
        .I2C_DigitalFilter       = 0x00,
        .I2C_OwnAddress1         = 0x00,
        .I2C_Ack                 = I2C_Ack_Enable,
        .I2C_Timing              = I2C_TIMING}); //I2C TIMING计算器计算
   
    I2C_Cmd(I2C2, ENABLE);
}

/* 写N字节数据 */
Error i2c_write_nBytes(uint8_t bytesNum,uint8_t *buffer)
{
    i2cTimeout = I2C_TIME_OUT;
    while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY) != RESET){
        if((i2cTimeout--) == 0){
            return ERROR_FLAG_BUSY;
        }
    }

   I2C_TransferHandling(I2C2,SDP_ADDRESS,1,I2C_Reload_Mode,I2C_Generate_Start_Write); 注释(1) //这句运行完后IIC_ISR状态如下                                                                       

   i2cTimeout = I2C_TIME_OUT;
    while(I2C_GetFlagStatus(I2C2,I2C_FLAG_TXIS) == RESET){ //问题出在这里,TXIS一直都是0(RESET)状态
        if((i2cTimeout--) == 0){
            return ERROR_FLAG_TXIS;
        }
    }

    I2C_SendData(I2C2,SDP_ADDRESS);

    i2cTimeout = I2C_TIME_OUT;
      while(I2C_GetFlagStatus(I2C2,I2C_FLAG_TCR) == RESET){
        if((i2cTimeout--) == 0){
          return ERROR_FLAG_TCR;
        }
      }

    I2C_TransferHandling(I2C2,SDP_ADDRESS,bytesNum,I2C_AutoEnd_Mode,I2C_No_StartStop);

  for(uint8_t i = 0; i < bytesNum; i++){
    i2cTimeout = I2C_TIME_OUT;
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_TXIS) == RESET){
      if((i2cTimeout--) == 0){
        return ERROR_FLAG_TXIS;
      }
    }
    I2C_SendData(I2C2, buffer[bytesNum]);
  }

  i2cTimeout = I2C_TIME_OUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF) == RESET){
    if((i2cTimeout--) == 0){
      return ERROR_FLAG_STOPF;
    }
  }

  return ERROR_NONE;
}
[/mw_shl_code]
注释(1):ISR状态

IIC_ISR寄存器状态

IIC_ISR寄存器状态


想问一下大家有什么解决问题的建议吗?先谢过了

最佳答案

查看完整内容[请看2#楼]

用模拟i2c用模拟i2c用模拟i2c! https://github.com/Prry/drivers-for-mcu
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-12-20 15:51:47 | 显示全部楼层
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2017-12-20 17:00:03 | 显示全部楼层
不用自带的硬件的,我是自己模拟的iic。自带的容易出问题,卡死
回复

使用道具 举报

21

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-6-8
在线时间
79 小时
 楼主| 发表于 2017-12-20 22:19:02 | 显示全部楼层
hgr211 发表于 2017-12-20 17:00
不用自带的硬件的,我是自己模拟的iic。自带的容易出问题,卡死

STM32F1的硬件IIC不太好 但是STM32(M0)的改进了很多 用硬件IIC+DMA,速度会快很多
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-12-20 23:34:17 | 显示全部楼层
我叫做大熙熙 发表于 2017-12-20 22:19
STM32F1的硬件IIC不太好 但是STM32(M0)的改进了很多 用硬件IIC+DMA,速度会快很多

+DMA只是释放cpu资源,速度并不会快,i2c最大400hz。
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-12-23 11:20:45 来自手机 | 显示全部楼层
Acuity 发表于 2017-12-20 23:34
+DMA只是释放cpu资源,速度并不会快,i2c最大400hz。

m0可以3m的速度
回复

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2015-11-30
在线时间
255 小时
发表于 2017-12-23 13:22:38 | 显示全部楼层
用模拟I2C
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2019-12-16
在线时间
34 小时
发表于 2020-3-24 15:58:13 | 显示全部楼层
楼主你的F0的硬件IIC工程还有吗?可以发给我一份吗?邮箱958344178@qq.com
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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