打印
[STM32F1]

血的经历告诉大家,慎用stm32的硬件iic

[复制链接]
楼主: 摩天轮1111
手机看帖
扫描二维码
随时随地手机跟帖
61
xuannin| | 2017-5-18 08:53 | 只看该作者 回帖奖励 |倒序浏览
I2C死了的时候,系统复位都不能活过来,除非你断电重启,你不要说你没碰到,爱用不用,个人所好,不必再无谓争执

使用特权

评论回复
62
l4157| | 2017-10-1 17:21 | 只看该作者
我也碰到了这个BUG,经过网上一个大神的提示,这样修改初始化后修复了...
/* USER CODE BEGIN I2C1_MspInit 0 */
//For STM32 IIC BUG
//    __HAL_AFIO_REMAP_I2C1_ENABLE();
               
    __HAL_RCC_I2C1_CLK_ENABLE();
               
                GPIO_InitStruct.Pin = SCL_Pin|SDA_Pin;
                GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
                HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
               
                HAL_GPIO_WritePin( GPIOB, SCL_Pin, GPIO_PIN_SET);
                HAL_GPIO_WritePin( GPIOB, SDA_Pin, GPIO_PIN_SET);
               
                hi2c->Instance->CR1 = I2C_CR1_SWRST_Msk;
                hi2c->Instance->CR1 = 0;
               
  /* USER CODE END I2C1_MspInit 0 */
    /**I2C1 GPIO Configuration   
    PB8     ------> I2C1_SCL
    PB9     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = SCL_Pin|SDA_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    __HAL_AFIO_REMAP_I2C1_ENABLE();

    /* Peripheral clock enable */
    __HAL_RCC_I2C1_CLK_ENABLE();

使用特权

评论回复
63
ljc16888888| | 2017-11-3 15:19 | 只看该作者
mark

使用特权

评论回复
64
teltium| | 2017-11-4 08:53 | 只看该作者
早就发现这个问题了,ST一直存在此问题,还有RTC问题 也不是一天两天了。
果断换GD的 分分钟解决问题

使用特权

评论回复
65
网络孤客| | 2018-1-22 21:05 | 只看该作者
我用STM32F10C8T6 连接IIC 接口的OLED。
STM32cubeMX进行初始化设置,以及修改了一下DMA发送函数,发现不能显示
接口驱动是没问题的,以前用3.5库(没使用DMA)是能正常显示的。
使用板上的LED灯检查卡在哪,发现卡在第二次发送上。
下面是精简后的程序,还请大神指导一下。

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  OLED_Init();
  while (1)
  {
  }
}
void I2C_Master_Transmit_DMA(uint16_t DevAddress, uint8_t *pData, uint16_t Size)
{
  while (HAL_I2C_Master_Transmit_DMA(&hi2c1,DevAddress,pData,Size)!= HAL_OK)
  {
    if (HAL_I2C_GetError(&hi2c1)!= HAL_I2C_ERROR_AF)
    {
      Error_Handler();
    }
  }
}
void OLED_WR_Byte(uint8_t Byte,uint8_t DC)
{
      uint8_t SendBuff[2];
      SendBuff[0] = DC;
      SendBuff[1] = Byte;
      I2C_Master_Transmit_DMA(OLED_ADDRESS,SendBuff,2);
}
void OLED_Init(void)
{  
  delay_ms(200);              //
OLED_WR_Byte(0xAE,OLED_CMD);//--display off关闭显示
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address 设置开始低列地址为SEG0
   /*************目的测试卡在哪*********************/
        HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address设置高列地址为0000b
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  设置开始行地址
OLED_WR_Byte(0xB0,OLED_CMD);//--set page address        设置开始页地址PAGE0
OLED_WR_Byte(0x81,OLED_CMD); // contrast control对比度控制,双字节命令
OLED_WR_Byte(0xFF,OLED_CMD);//--对比度为256
OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap SEG0列地址为127
OLED_WR_Byte(0xA6,OLED_CMD);//--设置为正常显示(正常 / 反相显示)
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)设置驱动路数
OLED_WR_Byte(0x3F,OLED_CMD);//--驱动路数为1/32 duty占空比
OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction: Scan from COM[N-1] to COM0
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte(0x00,OLED_CMD);//
OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
OLED_WR_Byte(0x80,OLED_CMD);//
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
OLED_WR_Byte(0x05,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
OLED_WR_Byte(0xF1,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
OLED_WR_Byte(0x12,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh设置电压
OLED_WR_Byte(0x30,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable设置电荷泵
OLED_WR_Byte(0x14,OLED_CMD);//开电荷泵
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel,开始显示
}

使用特权

评论回复
66
eefas| | 2018-1-23 15:12 | 只看该作者
移植都是模拟iic

使用特权

评论回复
67
dingbo95| | 2018-1-23 18:49 | 只看该作者
作为学生,该学还是得学的。

使用特权

评论回复
68
一路向北lm| | 2018-1-23 19:51 | 只看该作者
模拟和硬件IIC都得会,等ST改进吧

使用特权

评论回复
69
mintspring| | 2018-1-26 16:18 | 只看该作者
谢谢提醒

使用特权

评论回复
70
sf116| | 2018-8-7 11:14 | 只看该作者
刚遇到F103 硬件I2C被UART3中断打断死机问题,在读数据时关全局中断解决问题;关全局中断要慎重!!!

使用特权

评论回复
71
bear1| | 2020-10-9 15:43 | 只看该作者
摩天轮1111 发表于 2016-2-26 15:09
f3和f0系列的我之前有认真看过手册,iic模块是完全重新设计的了,没有了这种麻烦事应该是很正常的 ...

那f7呢?iic重新设计过吗?

使用特权

评论回复
72
zsljs| | 2022-1-23 23:11 | 只看该作者
我之前用PIC的芯片硬件I2C非常顺利,改用ST就麻烦一大堆,见识了学习了

使用特权

评论回复
73
moticsoft| | 2022-1-24 08:34 | 只看该作者
好吧,再次强化了这一点,还是模拟IIC靠谱。

使用特权

评论回复
74
51xlf| | 2022-12-3 12:06 | 只看该作者
这个问题什么时候能解决呢              

使用特权

评论回复
75
sdCAD| | 2022-12-3 12:35 | 只看该作者
自己加判断语句,要是检测不到器件就重新初始化!

使用特权

评论回复
76
adolphcocker| | 2022-12-3 14:41 | 只看该作者
stm32的iic很**肋这是真的吗  

使用特权

评论回复
77
pmp| | 2022-12-5 21:47 | 只看该作者
stm32内部iic读写eeprom有问题吗

使用特权

评论回复
78
gygp| | 2022-12-10 20:15 | 只看该作者
函数中有一个BUG               

使用特权

评论回复
79
mattlincoln| | 2022-12-17 18:32 | 只看该作者
STM32 硬件I2C 到底是不是个坑

使用特权

评论回复
80
AloneKaven| | 2022-12-18 18:31 | 只看该作者
硬件自带的官方库的例程都会多少有点问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则