请问STM32F103ZE硬件I2C怎么弄?

2019-07-14 14:09发布

搞了 三天了还没搞出来。。。求大神帮忙啊

#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的条件,所以 电平被改变后的瞬间又被改变回来

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

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。