zoukankan      html  css  js  c++  java
  • novoton-I2C使用

    I2C协议

    I2C硬件驱动(分中断模式和非中断模式)

    使能外设时钟,时钟源默认值:

     CLK_EnableModuleClock(I2C1_MODULE);

    配置外设引脚:

    /* I2C1: GPE0=SDA, GPC4=SCL*/
    SYS->GPE_MFPL &= ~SYS_GPE_MFPL_PE0MFP_Msk;
    SYS->GPE_MFPL |= SYS_GPE_MFPL_PE0MFP_I2C1_SDA;
    SYS->GPC_MFPL &= ~SYS_GPC_MFPL_PC4MFP_Msk;
    SYS->GPC_MFPL |= SYS_GPC_MFPL_PC4MFP_I2C1_SCL;

    初始化外设:

    /* Init I2C1 to 50Khz for MPU6050 */
    I2C_Open(I2C1, 50000);

    使用外设1:

    void Init_MPU6050(void)
    {
      I2C_SetSlaveAddr(MPU6050_I2C_PORT, 0, MPU6050_SlaveAddr, I2C_GCMODE_DISABLE);
      I2C_SingleWrite(MPU6050_PWR_MGMT_1, 0x00); // CLL_SEL=0: internal 8MHz, TEMP_DIS=0, SLEEP=0
      I2C_SingleWrite(MPU6050_SMPLRT_DIV, 0x07); // Gyro output sample rate = Gyro Output Rate/(1+SMPLRT_DIV)
      I2C_SingleWrite(MPU6050_CONFIG, 0x06); // set TEMP_OUT_L, DLPF=2 (Fs=1KHz)
      I2C_SingleWrite(MPU6050_GYRO_CONFIG, 0x18); // bit[4:3] 0=+-250d/s,1=+-500d/s,2=+-1000d/s,3=+-2000d/s
      I2C_SingleWrite(MPU6050_ACCEL_CONFIG, 0x01);// bit[4:3] 0=+-2g,1=+-4g,2=+-8g,3=+-16g, ACC_HPF=On (5Hz)
    }

    使用外设2:

    uint16_t Read_MPU6050_AccX(void)
    {
      uint8_t LoByte, HiByte;

      LoByte = I2C_SingleRead(MPU6050_ACCEL_XOUT_L); // read Accelerometer X_Low value
      HiByte = I2C_SingleRead(MPU6050_ACCEL_XOUT_H); // read Accelerometer X_High value

      return ((HiByte<<8) | LoByte);
    }

    用户函数:

     1 void I2C_SingleWrite(uint8_t index, uint8_t data)
     2 {
     3     I2C_START(MPU6050_I2C_PORT);
     4     I2C_WAIT_READY(MPU6050_I2C_PORT);
     5 
     6     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x08);
     7 
     8     I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr);
     9     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    10     I2C_WAIT_READY(MPU6050_I2C_PORT);
    11     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x18);
    12 
    13     I2C_SET_DATA(MPU6050_I2C_PORT, index);
    14     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    15     I2C_WAIT_READY(MPU6050_I2C_PORT);
    16     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28);
    17 
    18     I2C_SET_DATA(MPU6050_I2C_PORT, data);
    19     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    20     I2C_WAIT_READY(MPU6050_I2C_PORT);
    21     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28);
    22     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI|I2C_CTL_STO);      
    23 }
    24 
    25 uint8_t I2C_SingleRead(uint8_t index)
    26 {
    27     uint8_t tmp;
    28     I2C_START(MPU6050_I2C_PORT);
    29     I2C_WAIT_READY(MPU6050_I2C_PORT);
    30     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x08);
    31 
    32     I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr);
    33     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    34     I2C_WAIT_READY(MPU6050_I2C_PORT);
    35     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x18);
    36 
    37     I2C_SET_DATA(MPU6050_I2C_PORT, index);
    38     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    39     I2C_WAIT_READY(MPU6050_I2C_PORT);
    40     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x28);
    41 
    42     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_STA | I2C_CTL_SI);
    43     I2C_WAIT_READY(MPU6050_I2C_PORT);
    44     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x10);
    45 
    46     I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_SlaveAddr+1);
    47     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI);
    48     I2C_WAIT_READY(MPU6050_I2C_PORT);
    49     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x40);
    50 
    51     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT,I2C_CTL_SI);
    52     I2C_WAIT_READY(MPU6050_I2C_PORT);
    53     while(I2C_GET_STATUS(MPU6050_I2C_PORT) != 0x58);
    54 
    55     tmp = I2C_GET_DATA(MPU6050_I2C_PORT);
    56 
    58     I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_CTL_SI|I2C_CTL_STO);
    59 
    60     return tmp;
    61 }

     相关库函数:

    void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode);

    * @param[in] i2c Specify I2C port
    * @param[in] u8SlaveNo Set the number of I2C address register (0~3)
    * @param[in] u8SlaveAddr 7-bit slave address
    * @param[in] u8GCMode Enable/Disable GC mode (I2C_GCMODE_ENABLE / I2C_GCMODE_DISABLE)

  • 相关阅读:
    poj 1684 Lazy Math Instructor(字符串)
    STL内存配置器
    迭代器(iterators)
    类型萃取(type traits)
    hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包+dp)
    hdoj 1114 Piggy-Bank(完全背包+dp)
    hdoj 2546 饭卡(0-1背包)
    hdoj 2620 Bone Collector(0-1背包)
    U3d开发个人总结
    Android软键盘的用法总结
  • 原文地址:https://www.cnblogs.com/llw2017/p/9071333.html
Copyright © 2011-2022 走看看