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

STM32F103ZE 硬件I2C怎么搞啊

[复制链接]
L勿忘心安 提问时间: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个回答
党国特派员 回答时间: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
最好用模拟的
数码小叶 回答时间:2015-6-1 16:56:35
没跑过硬件,帮顶
回答时间:2015-6-2 09:11:53
103用IO模拟。论坛有很多例程,你搜一下就好了。
12下一页

所属标签

相似问题

官网相关资源

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