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

STM32F103ZE 硬件I2C怎么搞啊

[复制链接]
MNS 提问时间:2015-5-31 20:25 /
搞了 三天了还没搞出来。。。求大神帮忙啊

#include"stm32f10x.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_gpio.h"
#include"stm32f10x_tim.h"
#include"delay.h"
#include"stm32f10x_i2c.h"
void time()
{

   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清中断标志位
   TIM_TimeBaseStructure.TIM_Period = 2000;//装初值
   TIM_TimeBaseStructure.TIM_Prescaler = 3599;//设置分频系数
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分频系数
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器计数模式
   TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

   TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE );//使能定时器2 中断
     /* Enables the TIM2 counter */
   TIM_Cmd(TIM2, ENABLE);//使能定时器外设

}
void GPIOf()
{
   GPIO_DeInit(GPIOF);
  /* Configure all the GPIOA in Input Floating mode */
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
  GPIO_Init(GPIOF, &GPIO_InitStructure);

  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);

}
void rcc()
{
  RCC_DeInit();
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//使能GPIOF的时钟
  /* Enable BKP and TIM2 clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能定时器2 的时钟
  //NVIC_enableIRQn();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

}

void i2c()
{
  I2C_InitTypeDef I2C_InitStructure;
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 =0x01;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress =I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 40000;
  I2C_Cmd(I2C1, ENABLE);
  I2C_Init(I2C1, &I2C_InitStructure);

}
void NVIC_c()
{
  NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级
  NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//设置中断优先级通道
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStruct);//初始化中断
}
void i2()
{
   uint16_t ReceivedData;
  /* 没有被复位 代表现在总线正忙  出现复位 总线空闲,执行下面的语句  */
   while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET);

       /* 产生一个起始信号  */
   I2C_GenerateSTART(I2C1, ENABLE);

  /* 检查主模式是否被选择 EV5是否被置位   */
   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));



  /* 发送从器件地址 */
   I2C_Send7bitAddress(I2C1, 0xa0,I2C_Direction_Transmitter);

  /* 判断从器件地址是否匹配  EV1是否被置位 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);

   I2C_SendData(I2C1, 0x00);
  /* 等待从应答 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

   I2C_SendData(I2C1, 0x5d);
  /* 等待从应答 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

   /* 发送停止信号 */
   I2C_GenerateSTOP(I2C1, ENABLE);


   I2C_GenerateSTART(I2C1, ENABLE);
  /* 检查主模式是否被选择 EV5是否被置位   */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
  /* 发送从器件地址 */
   I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);

  /* 判断从器件地址是否匹配  EV1是否被置位 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);

   I2C_SendData(I2C1, 0x00);
  /* 等待从应答 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

   I2C_SendData(I2C1, 0x5d);
  /* 等待从应答 */
   while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

   /* 发送停止信号 */
   I2C_GenerateSTOP(I2C1, ENABLE);

}
int main()
{

   rcc();
   time();
//  NVIC_c();
   GPIOf();
   i2c();
   GPIO_SetBits(GPIOF, GPIO_Pin_6);
   while(1)
  {
    delay(1000);
   i2();

  }
}
void TIM2_IRQHandler()
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  if(GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)==1)
  {
   GPIO_ResetBits(GPIOF, GPIO_Pin_6); //不能用两个 if 因为 当满足前一个if时  
  }
  else//输出寄存器的值已经被改变了
  {

    GPIO_SetBits(GPIOF, GPIO_Pin_6);//也就满足了后面if的条件,所以 电平被改变后的瞬间又被改变回来

  }//所以 表现出来 人眼看到的情况就是 没有改变电平

}


收藏 评论17 发布时间:2015-5-31 20:25

举报

17个回答
wdshuang09 回答时间:2016-11-16 12:24:41
mark0668 发表于 2015-5-31 22:10
都说103的I2C 有问题,用模拟的

真的吗?           
wdshuang09 回答时间:2016-11-16 20:09:52
mark0668 发表于 2016-11-16 12:49
现在用HAL 没有问题

HAL 不了解,
mark0668 回答时间:2016-11-16 12:49:27

现在用HAL 没有问题
党国特派员 回答时间:2015-5-31 20:35:04
貌似103大家都用软件模拟
laotui 回答时间:2015-5-31 21:52:32
没搞定硬件IIC用软件模拟的
风子 回答时间:2015-5-31 22:06:50
没写过F1的,之前写过一个F3的调试过
mark0668 回答时间:2015-5-31 22:10:29
都说103的I2C 有问题,用模拟的
lkl0305 回答时间:2015-5-31 22:54:27
帮顶
你好我好大家好! 回答时间:2015-6-1 08:26:42
没搞过,帮顶
为什么是EEFOCUS小白 回答时间:2015-6-1 09:12:07
最好用模拟的
wyxy163@126.com 回答时间:2015-6-1 16:56:35
提示: 作者被禁止或删除 内容自动屏蔽
废鱼 回答时间:2015-6-2 09:11:53
103用IO模拟。论坛有很多例程,你搜一下就好了。
cc-2032809 回答时间:2015-6-14 02:39:12
据说有bug,模拟吧
为什么是EEFOCUS小白 回答时间:2015-6-14 09:05:13
用模拟的
creep 回答时间:2015-6-14 10:45:36
看官方的一个例子,跑起来很稳定
12下一页

所属标签

相似问题

官网相关资源

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