发新帖我要提问
12
返回列表
打印

stm32 硬件 i2c 问题

[复制链接]
楼主: mochou
手机看帖
扫描二维码
随时随地手机跟帖
21
parallax| | 2013-1-11 14:11 | 只看该作者 回帖奖励 |倒序浏览
经过验证的正常运行的初始化程序
void  I2CMasterInit(void)
{
        
//   I2C_DeInit(I2C_MASTER);
   
    I2CMaster_RCC_Configuration();
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,  ENABLE);// enable GPIOB CLOCK
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
      /* Reset sEE_I2C IP */
    RCC_APB1PeriphResetCmd(I2C_MASTER_CLK, ENABLE);
  /* Release reset signal of sEE_I2C IP */
    RCC_APB1PeriphResetCmd(I2C_MASTER_CLK, DISABLE);
    I2CMaster_GPIO_Configuration();
           
        
   // I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;//;I2C_Mode_I2C, very importan ,or I2C can not be work
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//for fast model
    I2C_InitStructure.I2C_OwnAddress1 = 0x00;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = I2C_MSATER_SPEED;
   
    // I2CMaster_NVIC_Configuration();
    /*!< Enable SMBus EVT interrupt */

    I2C_Cmd(I2C_MASTER, ENABLE);
    I2C_Init(I2C_MASTER, &I2C_InitStructure);
    I2CMaster_NVIC_Configuration();
    I2C_ITConfig(I2C_MASTER, I2C_IT_EVT | I2C_IT_ERR| I2C_IT_BUF, ENABLE);//| I2C_IT_ERR very importan ,or I2C can not be work
}

void I2CMaster_RCC_Configuration(void)
{
    /* Enable peripheral clocks --------------------------------------------------*/
    RCC_APB1PeriphClockCmd(I2C_MASTER_CLK, ENABLE);   

}
void I2CMaster_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    // I2C I0口初始化.
    // Configure I2C1 pins: SCL and SDA ---------------------------------------
   
      GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);

   // GPIO_InitStructure.GPIO_Pin =  I2C_MASTER_SCL | I2C_MASTER_SDA;
   
//CONFIG scl
    GPIO_InitStructure.GPIO_Pin =  I2C_MASTER_SCL;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(I2C_MASTER_GPIO, &GPIO_InitStructure);
//CONFIG SDA

    GPIO_InitStructure.GPIO_Pin =  I2C_MASTER_SDA;
    //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
   //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   //GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
   //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(I2C_MASTER_GPIO, &GPIO_InitStructure);

}
void I2CMaster_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 1 bit for pre-emption priority, 3 bits for subpriority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    /* Configure and enable I2CMASTER interrupt --------------------------------*/
    NVIC_InitStructure.NVIC_IRQChannel = I2C_MASTER_EV_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVICPreemptionPriority_I2CMASTER; //same as mido
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVICSubPriorityPriority_I2CMASTER_EV;
    NVIC_Init(&NVIC_InitStructure);

    /* Configure and enable SI2CMASTER interrupt --------------------------------*/
    NVIC_InitStructure.NVIC_IRQChannel = I2C_MASTER_ER_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVICPreemptionPriority_I2CMASTER; //same as mido
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVICSubPriorityPriority_I2CMASTER_ER;
    NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
22
jomosiron| | 2013-1-11 18:38 | 只看该作者
stm32硬件I2C 我永远的噩梦。。。貌似stm32F051系列的硬件I2C好用多了

使用特权

评论回复
23
fugushatu| | 2013-1-12 09:02 | 只看该作者
不要用while死等,设标志位,加加,溢出后退出。。。

使用特权

评论回复
24
明月小厨| | 2013-1-12 13:59 | 只看该作者
7290我没用过它,你可以看看7290这些器件是否会产生应答信号;
1.不产生应答:则你的程序要调整,跳过判断是否应答这一环;
2.如果有应答,你检查你STM32部分;必要的时候先发送一个停止信号;再发启始信号再发数据;
我对系统初始状态不放心时就多发一个停止信号的;

停止信号相当于I2C的复位;对主控器件内部复位;从器件如果聪明也会明白这个意思的;

使用特权

评论回复
25
明月小厨| | 2013-1-12 14:00 | 只看该作者
ZLG72XX系列不便宜,通常不考虑它;

使用特权

评论回复
26
mochou|  楼主 | 2013-1-29 12:40 | 只看该作者
stm32的硬件IIC是可以调通的,就是程序里面有太多的while等待,是可以设置标志位,加加溢出后跳出的,但我调试的时候有一个事件不可以跳出的,不知道是什么原因。

使用特权

评论回复
27
lin34337151| | 2013-5-19 17:55 | 只看该作者
楼主,你好,我现在与遇到的问题是,我的IIC能读能写,但是我频繁的读 会出现卡死,死循环了,不知道停在哪里,各位是否遇到。我用我的开发STM32F103VCT6也会出现这个种情况

使用特权

评论回复
28
shiyang1212| | 2014-2-22 10:54 | 只看该作者
27楼的哥们,你的问题解决了没?是怎么解决的?
我最近用STM32F103也出现你这样的问题,跑一段时间就会出现跑死现象,我跟踪发现程序每次都是在关闭ACK 启动STOP,然后读取最后一个字节的时候读取不到,各位如有解决方法的指点下,谢谢!

使用特权

评论回复
29
shiyang1212| | 2014-2-22 13:07 | 只看该作者
发现将I2C速度降下来,测试还没发现跑死的现象

使用特权

评论回复
30
hxhaawt| | 2015-11-10 21:52 | 只看该作者
我也是遇到这个问题STM32F103RBT6 的芯片,硬件I2C1 主机发送时卡在 EV5  那里,换一块板也是一样
程序在103ZET6上可以写入24C02,硬件I2C真是蛋疼啊

使用特权

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

本版积分规则