微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助一个I2C问题

求助一个I2C问题

时间:10-02 整理:3721RD 点击:
我写了一个I2C读取的函数,用最简单的查询,首先我已经证明该函数是可以正常运行,然后给他改了一下,添加了一个变量I2C_TypeDef* I2Cx,想让他可以被任何I2C口读取。然后我把I2Cx赋值为I2C1(PS:此函数在I2C1下已经可以可以使用),就无法运行,好像I2Cx根本没有被替换成I2C1,求大神指教,代码如下

  1. void I2C_Query_Read(I2C_TypeDef* I2Cx,u8 IMU_Address,u8 Address,u8 *IMU_Data,u8 NumByteToRead)
  2. {
  3.         /*I2C_TypeDef* I2Cx;
  4.         #if USED_I2C1
  5.         I2Cx = I2C1;
  6.         #endif */
  7. /********if I2C BUS busy,wait*********/
  8.         Time_Out = Time_limit;
  9.         while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))
  10.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  11. /**********start I2C*********/       
  12.         I2C_GenerateSTART(I2Cx, ENABLE);
  13.         /***********check the EV5********/       
  14.         Time_Out = Time_limit;
  15.         while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT ))
  16.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  17. /************send Address to I2C*******/
  18.         I2C_Send7bitAddress(I2Cx,IMU_Address, I2C_Direction_Transmitter);
  19. /***********check EV6***********/       
  20.         Time_Out = Time_limit;
  21.         while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  22.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  23.        
  24.         I2C_Cmd(I2Cx, ENABLE);
  25. /**********send IMU's register Address************/
  26.         I2C_SendData(I2Cx, Address);
  27. /************clean EV8*****************************/       
  28.         Time_Out = Time_limit;
  29.         while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ))
  30.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  31. /***********Start I2C again*********/       
  32.         I2C_GenerateSTART(I2Cx, ENABLE);

  33.         Time_Out = Time_limit;
  34.         while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT ))
  35.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  36.        
  37.         I2C_Send7bitAddress(I2Cx,IMU_Address, I2C_Direction_Receiver);

  38.         Time_Out = Time_limit;       
  39.         while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  40.                 (Time_Out--)?delay_ms(1):I2C_TimeOut(I2Cx);
  41. /* While there is data to be read */
  42.    while(NumByteToRead)

  43.   {
  44.     if(NumByteToRead == 1)
  45.     {
  46.      /* Disable Acknowledgement */
  47.       I2C_AcknowledgeConfig(I2Cx, DISABLE);

  48.       /* Send STOP Condition */
  49.       I2C_GenerateSTOP(I2Cx, ENABLE);
  50.                 }

  51.     /* Test on EV7 and clear it */
  52.     if(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))
  53.     {
  54.       /* Read a byte from the MPU */
  55.       *IMU_Data = I2C_ReceiveData(I2Cx);

  56.       /* Point to the next location where the byte read will be saved */
  57.       IMU_Data++;

  58.      /* Decrement the read bytes counter */
  59.       NumByteToRead--;
  60.     }
  61.         }


  62.   /* Enable Acknowledgement to be ready for another reception */
  63.   I2C_AcknowledgeConfig(I2Cx, ENABLE);
  64.        
  65.        
  66. }

复制代码


那要看看你的I2C_TypeDef这个里面是怎么写的

是不是USED_I2C1这个没定义啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top