10498|25

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

版主主STM32I2C的波形图上来了 [复制链接]

                                  
此帖出自stm32/stm8论坛

最新回复

                                 从2楼示波器抓到的波形,可以很明显地说明你对I2C硬件没有足够的关注:R27和R28太大了! 10Kohm的电阻一般是100K速度时的选择,你可以改为2K左右试试。  详情 回复 发表于 2011-3-10 14:13
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

继续

EK-stm32的实验板,问题依旧是EEPROM例程无法通过
原实验板的波形
此帖出自stm32/stm8论坛
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

继续2

                                  将上拉电阻改为4.7k后的波形
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 

晕,I2C折腾这么久,把我调试好的程序给你

#define ADDR_24CXX        0xA0

void I2C_24CXX_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  I2C_InitTypeDef   I2C_InitStructure;

  /* GPIOB Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
  /* I2C1 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  /* Configure I2C1 pins: SCL and SDA */
  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_DeInit(I2C1);

  /* I2C1 Init */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 200000;
  I2C_Init(I2C1, &I2C_InitStructure);

  /* I2C1 Init */
  I2C_Cmd(I2C1, ENABLE);
}

//void I2C_24C512_Write(u8 RegName, u16 RegValue)
void I2C_24CXX_Write(u16 nAddr, u8* pDat, u16 nLen)
{
  u16 i = 0;
  /* Enable I2C1 acknowledgement if it is already disabled by other function */
  I2C_AcknowledgeConfig(I2C1, ENABLE);

  /*----- Transmission Phase -----*/
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);

  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }

  /* Send slave address for write */
  I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);

  /* Test on I2C1 EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

  /* Send the high part of memory address */
/*  I2C_SendData(I2C1, (u8)(nAddr>>8));

  // Test on I2C1 EV8 and clear it
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) // EV8
  {
  }
*/

  /* Send the low part of memory address */
  I2C_SendData(I2C1, (u8)nAddr);

  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  for(i=0;i<nLen;i++)
  {
    /* Send I2C1 data */
    I2C_SendData(I2C1, pDat);

    /* Test on I2C1 EV8 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
    {
    }
  }
  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);
}

void I2C_24CXX_Read(u16 nAddr, u8* pDat, u16 nLen)
{
  u16 i = 0;
  /* Enable I2C1 acknowledgement if it is already disabled by other function */
  I2C_AcknowledgeConfig(I2C1, ENABLE);

  /*----- Transmission Phase -----*/
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);

  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }

  /* Send 24CXX slave address for write */
  I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Transmitter);

  /* Test on I2C1 EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) /* EV6 */
  {
  }

/*  // Send the high part of memory address 
  I2C_SendData(I2C1, (u8)(nAddr>>8));

  // Test on I2C1 EV8 and clear it
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) // EV8
  {
  }
*/
  /* Send the low part of memory address */
  I2C_SendData(I2C1, (u8)nAddr);

  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }

  /*----- Reception Phase -----*/
  /* Send Re-STRAT condition */
  I2C_GenerateSTART(I2C1, ENABLE);

  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }

  /* Send 24CXX slave address for read */
  I2C_Send7bitAddress(I2C1, ADDR_24CXX, I2C_Direction_Receiver);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  /* EV6 */
  {
  }

  for(i=0;i<nLen;i++)
  {
    if((i+1)>=nLen)
    {
      /* Disable I2C1 acknowledgement */
      I2C_AcknowledgeConfig(I2C1, DISABLE);

      /* Send I2C1 STOP Condition */
      I2C_GenerateSTOP(I2C1, ENABLE);
    }

    /* Test on EV7 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
    {
    }

    /* Store I2C1 received data */
    pDat = I2C_ReceiveData(I2C1);
  }
}
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 

得,把测试程序也给你

    for(tmp=0;tmp<0x100;tmp++)
    {
        pBuffer1[tmp] = tmp;
        pBuffer2[tmp] = 0;
    }

    I2C_24CXX_Init();
    I2C_24CXX_Write(0x00, pBuffer1+0x00, 8);
    DelayI2C();
    I2C_24CXX_Write(0x08, pBuffer1+0x08, 8);
    DelayI2C();
    I2C_24CXX_Write(0x10, pBuffer1+0x10, 8);
    DelayI2C();
    I2C_24CXX_Write(0x18, pBuffer1+0x18, 8);
    DelayI2C();
    I2C_24CXX_Write(0x20, pBuffer1+0x20, 8);
    DelayI2C();
    I2C_24CXX_Write(0x28, pBuffer1+0x28, 8);
    DelayI2C();

    I2C_24CXX_Read(0, pBuffer2, 0x40);
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 

原来是24C512的程序,后来改成24C02的

所以地址那里有注释掉一个字节地址发送
DelayI2C();的作用,自己想去。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 

好!顶楼上!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 

谢谢楼上的楼上

  看来不是硬件的事情了????
  先试试看  谢谢了 
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 

弱弱的一个问题

   stm32 的固件库里 都是 while() 语句
 若i2c总线 错误出现岂不一直等着while循环  直到复位?
 
此帖出自stm32/stm8论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

10
 

回9楼:是的,这是一个很不好的设计习惯

                                 我们已经要求这部分的原作者改进,将在下一版本更改。
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 

我们的系统最害怕的就是复位

  好多参数的累积,如果用的话不知道怎样才能够解决
 难道不用库文件? 还是等待下一个版本出现? 大约多久
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 

目前,还没有用中断方式收发数据的!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 

Write分页处理

                                 McuPlayer,你给出的_Write程序没有处理 分页的情况, 且没有处理写完一业后的等待, 作为驱动库来说是不完善的!
此帖出自stm32/stm8论坛
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

14
 

楼上厉害,一眼就看出了我程序的软肋

屏蔽page操作的函数封装更好,因为不同size的芯片,其page大小还不同。
Page的对齐都交给上层处理是个糟糕的主意,我已经再遭受这个打击了,哈哈。
而写函数把page操作屏蔽后,移植的时候就容易多了。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 

就一个I2C驱动,至于么……

                                 做研发不要怕底层,不要什么都指望厂家更新驱动库……
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

16
 

...

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

17
 
                                 正在寻找中.....
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 4楼的真是太好了,呵呵,我也借鉴下
此帖出自stm32/stm8论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 Great! 试验成功,本来看到网上说STM32的I2c不好用,本打算模拟的,看到了Mcuplayer的代码,就试了一下,读写OK!谢了先!
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 收藏
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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