8170|26

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

I2C问题请教"香主"及各位 [复制链接]

在南京万历电子的EK-STM32F开发板上调试程序,使用I2C1读写外部24C02芯片,DEMO程序使用了ST的库STM32F10xFWLibFWLibexamplesI2CExample5,愿为读写24C08的程序,发现I2C读写在下列情况下无法实现:

主频设置在40M以下时,I2C无法正确读写, 设置程序为:   
    /* PLLCLK = 8MHz * 5 = 40 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_5);
   设置到72MHz时I2C也无法正确读写:
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
程序无法读写24C02,但是其他功能正常,就是在I2C程序中无法推出,I2C状态判断无法通过;

如果设置成RCC_PLLMul_6,RCC_PLLMul_7,RCC_PLLMul_8,读写24C02正常。

I2C设置如下:
#define I2C_Speed             400000
#define I2C1_SLAVE_ADDRESS7    0xA0
#define I2C_PageSize           4


  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* I2C configuration */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress =  I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
  /* I2C Peripheral Enable */
  I2C_Cmd(I2C1, ENABLE);
  /* Apply I2C configuration after enabling it */
  I2C_Init(I2C1, &I2C_InitStructure);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;改用GPIO_Speed_10MHz和GPIO_Speed_2MHz都测试过了,现象相同。

此现象不知如何解释?请指教。如果是这样,那STM32F101系列只能到36MHz不是有问题了吗?
此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2008-3-18 14:53
点赞 关注
 

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

I2C模块的时钟频率为2MHz~50MHz,快速模式时为4MHz~50MHz

请看STM32技术参考手册的第15.4.1节、第15.4.2节和第15.7.2节中有关FREQ的说明。

当你增加PLL输出频率时,应相应减小APB1的频率,否则将超出允许范围。你没有给出相应部分,所以我不知道你的APB1的频率是多少。

另外,我看了你说的Example5,原始例子中是用的RCC_PLLMul_9: 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
估计你改过了程序,而又忘了改了哪些?你最好从新拷贝一下原始的例子。至于降低PLL输出频率为什么有问题,暂时看不出来,可能也是由于你的某种改动。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

感谢香主的解答

原例子的确是RCC_PLLMul_9,但是在RCC_PLLMul_9设置情况下,24C02读写失败,所以我修改了主频,发现主频修改成RCC_PLLMul_6,RCC_PLLMul_7,RCC_PLLMul_8以后是成功的,RCC的设置:
void RCC_Configuration(void)
{   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
/* Enable peripheral clocks --------------------------------------------------*/

  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA and GPIOB and GPIOC clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);  

  /* I2C1 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
}

????问题:
在72mHZz时(RCC_PLLMul_9),APB1设置 RCC_PCLK1Config(RCC_HCLK_Div4)中我分别测试了1,2,4,8,16几个分频,如果设置RCC_HCLK_Div1和RCC_HCLK_Div16,读写24C02是正常,但是如果选择RCC_HCLK_Div2,RCC_HCLK_Div4,RCC_HCLK_Div8,无法读写24C02,是不是很矛盾?如果按照范围来看,既然APB1不分频和最大分频都是可以读写的,为什么反而中间的几个分频反而不正常?
另外在你提到的几个章节中,我没有看到FREQ的说明,我看得是中文版,是不是要看英文版?
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 

低于40MHz时现象

继续测试低于40MHz时现象如下:
如果设置RCC_PLLMul_4(8*4=32MHz),无论设置RCC_HCLK_Div1到RCC_HCLK_Div16中的哪一个,都无法实现读写24C02;
如果设置RCC_PLLMul_3(8*3=24MHz),只有设置RCC_HCLK_Div1 可以读写24C02;
如果设置RCC_PLLMul_2(8*2=16MHz),只有设置RCC_HCLK_Div1 可以读写24C02;

这中间能看出什么规律吗?感觉有时候像是凑数一样,以前情说STR710的硬件I2C有问题,后来是使用模拟I2C的,是不是STM32F10X的硬件I2C也有问题啊?
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 

这个问题要测试一下才知道原因

但因为我们在搬家,所有设备都已经装箱打包了,估计过了年才能有人帮你测一下这个问题;看看还有没有其他人做过这个例子,提供些帮助。

如果你有示波器,也可以看看波形,自己找找原因。

FREQ的说明在中文版也有,是寄存器I2C_CR2的位[5:0]。

非常抱歉。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 

多谢香主

多谢香主的指点
我用示波器看了I2C的波形,SCL和SDA一直有信号,像是在I2C中有死循环,感觉是软件的问题,因为用的是例子中的程序,没有仔细分析,我再分析看看,请香主在年后抽出时间也帮忙分析一下。
再次感谢。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 

一个个人建议

说一个个人的看法,楼主可以试试看:
I2C的例子五原本是针对STM32评估版的,上面用的EEPROM是M24C08,和EKSTM32F版上的M24C02有点不同,他们的page size是不一样的,另外3个片选管脚连接方式也不一样,EKSTM32F版上的全接地了,建议可以试一试:

1  i2c_ee.h里选择#define EEPROM_Block0_ADDRESS 0xA0,把其他的注释掉,原始例子里是#define EEPROM_Block1_ADDRESS 0xA2,这在EKSTM32F版上不是正确的地址,

2  i2c_ee.c  #define I2C_PageSize  16,把16改成4。
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 

用EKSTM32软件修改

Ans Barboon:
感谢你的回答,我本来就是这样修改的,否则不可能在有的频率下读和写是正常的,地址修改为0xa0,pagesize 是4,应该不是这个原因
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 

I2C读写长期测试


除了前面提到的主频变化会影响I2C读写外,在I2C读写成功的情况下,进行可靠性测试,在主循环中读写I2C各一次,读写成功后同时用串口传出次数计数值,反复测试,发现I2C1的读写在一定次数后出现同样现象,死机,示波器测量SCL和SDA,发现均为低电平,次数最少一次只有170次,最多一次大概1200次。诸位大侠如果有兴趣的话不妨也测试一下利用ST提供的I2C库函数通讯问题。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 

9楼的I2C设备是什么?

                                 你是否能查一下是谁把总线拉低的。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 

香主请看

                                 I2C设备是EKSTM32F电路板上的24C02,具体操作请看一楼和三楼的内容,如果需要我可以把项目文件发给香主,请你测试一下
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 

香主:年前的问题,顶一下

年前快放假时提的问题,一个年后估计大家都没有印象了,自己顶以一下,也请香主关注一下
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 

I2C死机俺在其他MCU中遇到过,SCL/SDA被拉低

重新配置I2C模块后转为正常...

准备做个通用的I2C中断例程...可是每晚的"闯关东"5集联放实在耗时间呀~~~

倒塌了~~~
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 

楼主把项目文件发上来看看吧

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

15
 

I2C通讯项目文件,请使用EKSTM32的高手测试看看

                                 这个版本在主循环中读写I2C,用指示灯取反检测主程序运行情况,请高手测试看看
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 

文件无法上传,请指教,是不是超过300K就不允许上传?

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 

超过300K就不允许上传!请只上传源文件和项目文件

生成的文件不要上传。

请说明使用的开发软件的版本。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 

分开传吧

三个目录,拷贝到一个目录下面,然后解压缩就可以了
library,project,user-lib

软件EWARM4.42A,项目文件在projectEWARM
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20082/2008218152917968.rar
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

19
 

library,和原来一直,没有什么改变

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

20
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表