打印

I2C问题请教"香主"及各位

[复制链接]
6326|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
speed_2008|  楼主 | 2008-1-31 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, pi, IO, GPIO, gp
在南京万历电子的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不是有问题了吗?
沙发
香水城| | 2008-1-31 14:43 | 只看该作者

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输出频率为什么有问题,暂时看不出来,可能也是由于你的某种改动。

使用特权

评论回复
板凳
speed_2008|  楼主 | 2008-1-31 15:42 | 只看该作者

感谢香主的解答

原例子的确是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的说明,我看得是中文版,是不是要看英文版?

使用特权

评论回复
地板
speed_2008|  楼主 | 2008-1-31 16:28 | 只看该作者

低于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也有问题啊?

使用特权

评论回复
5
香水城| | 2008-1-31 16:31 | 只看该作者

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

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

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

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

非常抱歉。

使用特权

评论回复
6
speed_2008|  楼主 | 2008-1-31 17:05 | 只看该作者

多谢香主

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

使用特权

评论回复
7
barboon| | 2008-2-1 11:06 | 只看该作者

一个个人建议

说一个个人的看法,楼主可以试试看:
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。

使用特权

评论回复
8
speed_2008|  楼主 | 2008-2-1 11:26 | 只看该作者

用EKSTM32软件修改

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

使用特权

评论回复
9
speed_2008|  楼主 | 2008-2-2 10:43 | 只看该作者

I2C读写长期测试


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

使用特权

评论回复
10
香水城| | 2008-2-2 10:46 | 只看该作者

9楼的I2C设备是什么?

你是否能查一下是谁把总线拉低的。

使用特权

评论回复
11
speed_2008|  楼主 | 2008-2-4 09:08 | 只看该作者

香主请看

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

使用特权

评论回复
12
speed_2008|  楼主 | 2008-2-14 15:39 | 只看该作者

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

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

使用特权

评论回复
13
hotpower| | 2008-2-14 18:34 | 只看该作者

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

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

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

倒塌了~~~

使用特权

评论回复
14
lut1lut| | 2008-2-15 16:28 | 只看该作者

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

使用特权

评论回复
15
speed_2008|  楼主 | 2008-2-18 13:49 | 只看该作者

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

这个版本在主循环中读写I2C,用指示灯取反检测主程序运行情况,请高手测试看看

使用特权

评论回复
16
speed_2008|  楼主 | 2008-2-18 13:54 | 只看该作者

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

使用特权

评论回复
17
香水城| | 2008-2-18 13:57 | 只看该作者

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

生成的文件不要上传。

请说明使用的开发软件的版本。

使用特权

评论回复
18
speed_2008|  楼主 | 2008-2-18 15:32 | 只看该作者

分开传吧

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

软件EWARM4.42A,项目文件在projectEWARM
相关链接:https://bbs.21ic.com/upfiles/img/20082/2008218152917968.rar

使用特权

评论回复
19
speed_2008|  楼主 | 2008-2-18 15:34 | 只看该作者

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

使用特权

评论回复
20
speed_2008|  楼主 | 2008-2-18 15:34 | 只看该作者

project目录

使用特权

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

本版积分规则

12

主题

55

帖子

0

粉丝