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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版