你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32用I2C控制数字电位器的问题

[复制链接]
侯希白 提问时间:2014-6-4 19:32 /
 
   我想用STM32F103VET6控制 I2C接口的数字电位器 X9119 。
不知道怎么控制,谁可以帮我下。
主要是时序我都知道,我也看了野火的I2C的E2PROM的DEMO,
我想用DEMO改下 来控制X9119 但是不得要领,谁知道麻烦告知下。
时序图我已经发上来了。
求哪位大神指点下
我用的是I2C 2接口  PB10.PB11,改的野火 I2C  E2PROM。DEMO
static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

        /* 使能与 I2C1 有关的时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);  

  /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10| GPIO_Pin_11;  就是改个接口其他没变
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*
* 函数名:I2C_Configuration
* 描述  :I2C 工作模式配置
* 输入  :无
* 输出  :无
* 调用  :内部调用
*/
static void I2C_Mode_Configu(void)
{
  I2C_InitTypeDef  I2C_InitStructure; 

  /* I2C 配置 */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7; //地址我已经改了
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

  /* 使能 I2C1 */
  I2C_Cmd(I2C2, ENABLE);

  /* I2C1 初始化 */
  I2C_Init(I2C2, &I2C_InitStructure);
}

改的是GPIO,不知道有没有问题。
重要就是下面
void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
{
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008

  /* Send START condition */
  I2C_GenerateSTART(I2C2, ENABLE);

  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); 

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  

  /* Send the EEPROM's internal address to write to */    
  I2C_SendData(I2C2, WriteAddr);  

  /* Test on EV8 and clear it */
  while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* While there is data to be written */
  while(NumByteToWrite--)  
  {
    /* Send the current byte */
    I2C_SendData(I2C2, *pBuffer); 

    /* Point to the next byte to be written */
    pBuffer++; 

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

  /* Send STOP condition */
  I2C_GenerateSTOP(I2C2, ENABLE);
}
上面的我就不知道怎么改了,
未标题-1 拷贝.jpg
这是X9119的时序图 和读写指令
未标题-3 拷贝.jpg
这是24C02的时序 图
希望大神告知样 ,不知道怎么改,求解答
未标题-2 拷贝.jpg
收藏 评论14 发布时间:2014-6-4 19:32

举报

14个回答
回答时间:2014-6-5 09:41:41

RE:STM32用I2C控制数字电位器的问题

用I2C总线的通讯过程,电位器的设置和EE不一样。数据通讯过程要按照电位器的手册写。
侯希白 回答时间:2014-6-5 21:01:47

回复:STM32用I2C控制数字电位器的问题

回复第 2 楼 于2014-06-05 09:41:41发表:
用I2C总线的通讯过程,电位器的设置和EE不一样。数据通讯过程要按照电位器的手册写。
 
 
我知道通讯过程不一样,就是不知道怎么改
 
侯希白 回答时间:2014-6-9 18:57:20

RE:STM32用I2C控制数字电位器的问题

查了一圈资料,都说STM32 硬件I2C 有问题
看了刘洋的视频  改为模拟的   结果还是不行
继续挂示波器看吧   哎
有缘于你 回答时间:2014-6-9 20:36:21

RE:STM32用I2C控制数字电位器的问题

一样的,就是发送的地址,数据,个数不一样, 修改下数据的个数NumByteToWrite就行了吧,每个ack一个8位数据
feiante-155820 回答时间:2014-6-10 10:07:48

RE:STM32用I2C控制数字电位器的问题

用模拟I2C的方式吧,先用示波器或逻辑分析仪检测波形,看看输出的时序波形对不对。
深秋独影 回答时间:2014-6-10 10:44:30

RE:STM32用I2C控制数字电位器的问题

先用模拟IIC, 好使了再用硬件IIC, 波形对了就好了
dzc2001 回答时间:2014-6-11 09:30:19

RE:STM32用I2C控制数字电位器的问题

买个24M逻辑分析仪,照着数据手册调出来,光看程序调试到哪年
回答时间:2014-6-11 11:09:41

RE:STM32用I2C控制数字电位器的问题

先发送硬件地址,再发送数据内容.I2C写入,不要用读取.
回答时间:2014-6-12 14:19:17

RE:STM32用I2C控制数字电位器的问题

用示波器看一下波形,对不对
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版