Revision db6bd9f8 modules/NUCLEO-L476RG/module.h

View differences:

modules/NUCLEO-L476RG/module.h
64 64
 */
65 65
#define MODULE_HAL_RTC                          RTCD1
66 66

  
67
#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
68

  
69 67
/**
70
 * @brief   I2C driver to access multiplexer, proximity sensors 5 to 8, power monitors for VSYS4.2, VIO 5.0 and VDD, EEPROM, touch sensor, and fuel gauge (front battery).
68
 * @brief   Default I2C interface for the NUCLEO I/O.
71 69
 */
72
#define MODULE_HAL_I2C3                         I2CD3
70
#define MODULE_HAL_I2C                          I2CD1
73 71

  
74 72
/**
75
 * @brief   Configuration for the I2C driver #3.
73
 * @brief   Configuration for the I2C driver #1.
76 74
 */
77
extern I2CConfig moduleHalI2c3Config;
78

  
79
#endif /* (BOARD_MPU6050_CONNECTED == true) */
75
extern I2CConfig moduleHalI2cConfig;
80 76

  
81 77
/** @} */
82 78

  
......
151 147
#define MODULE_INIT_PERIPHERY_IF() {                                          \
152 148
  /* serial driver */                                                         \
153 149
  sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
154
  /* MPU6050 demo */                                                          \
155
  MODULE_INIT_PERIPHERY_IF_MPU6050();                                         \
150
  /* I2C */                                                                   \
151
  uint32_t i2c_freq = 1000000; /* maximum I2C frequency supported for this MCU */ \
152
  MODULE_INIT_PERIPHERY_IF_MPU6050(i2c_freq);                                 \
153
  if (i2c_freq == 100000) /* standard-mode @ 100 kHz */ {                     \
154
    moduleHalI2cConfig.timingr = 0x10909CEC; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
155
  } else if (i2c_freq == 400000) /* fast-mode @ 400 kHz */ {                  \
156
    moduleHalI2cConfig.timingr = 0x00702991; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
157
  } else if (i2c_freq == 1000000) /* fast-mode-plus @ 10000 kHz */ {          \
158
    moduleHalI2cConfig.timingr = 0x00300F33; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
159
  } else {                                                                    \
160
    aosDbgAssertMsg(false, "I2C frequency not supported");                    \
161
  }                                                                           \
162
  i2cStart(&MODULE_HAL_I2C, &moduleHalI2cConfig);                             \
156 163
}
157 164
#if (BOARD_MPU6050_CONNECTED == true)
158
  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {                                \
159
    /* maximum I2C frequency is 1MHz for this MCU */                          \
160
    uint32_t i2c3_freq = 1000000;                                             \
161
    /* find minimum amon all devices connected to this bus */                 \
162
    i2c3_freq = (MPU6050_LLD_I2C_MAXFREQUENCY < i2c3_freq) ? MPU6050_LLD_I2C_MAXFREQUENCY : i2c3_freq;  \
163
    /* calculate PRESC (prescaler):                                           \
164
     *   target is 1/(I2CXCLK * (PRESC + 1)) = 125ns                          \
165
     */                                                                       \
166
    moduleHalI2c3Config.timingr = ((uint8_t)((0.000000125f * STM32_I2C3CLK) - 1)) << I2C_TIMINGR_PRESC_Pos; \
167
    /* SCL shall be low half of the time. */                                  \
168
    moduleHalI2c3Config.timingr |= ((uint8_t)((1.f / i2c3_freq / 2 / 0.000000125f) - 1)) << I2C_TIMINGR_SCLL_Pos; \
169
    /* SCL shall be high half the time of low or slightly longer. */          \
170
    moduleHalI2c3Config.timingr |= (uint8_t)(ceilf(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) / 2.f)) << I2C_TIMINGR_SCLH_Pos;  \
171
    /* SDA shall be delayed 1/10 of SCL low, or shorter */                    \
172
    moduleHalI2c3Config.timingr |= (uint8_t)(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) * 0.1f) << I2C_TIMINGR_SDADEL_Pos;  \
173
    /* SCL shall be delyed twice as long as SDA, but longer than 0. */        \
174
    moduleHalI2c3Config.timingr |= ((((moduleHalI2c3Config.timingr & I2C_TIMINGR_SDADEL_Msk) >> I2C_TIMINGR_SDADEL_Pos) * 2) + 1) << I2C_TIMINGR_SCLDEL_Pos;  \
175
    /* now we can start the I2C driver */                                     \
176
    chSysLock();                                                              \
177
    palSetLineMode(LINE_ARD_A4, PAL_MODE_ALTERNATE(4));                       \
178
    palSetLineMode(LINE_ARD_A5, PAL_MODE_ALTERNATE(4));                       \
179
    chSysUnlock();                                                            \
180
    i2cStart(&MODULE_HAL_I2C3, &moduleHalI2c3Config);                         \
181
  }
182
#else /* (BOARD_MPU6050_CONNECTED == true) */
183
  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {}
184
#endif /* (BOARD_MPU6050_CONNECTED == true) */
165
  #define MODULE_INIT_PERIPHERY_IF_MPU6050(freq) {freq = (MPU6050_LLD_I2C_MAXFREQUENCY < freq) ? MPU6050_LLD_I2C_MAXFREQUENCY : freq;}
166
#else
167
  #define MODULE_INIT_PERIPHERY_IF_MPU6050(freq) {}
168
#endif
185 169

  
186 170
/**
187 171
 * @brief   Periphery communication interface deinitialization hook.
188 172
 */
189 173
#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
174
  /* I2C */                                                                   \
175
  i2cStop(&MODULE_HAL_I2C);                                                   \
190 176
  /* don't stop the serial driver so messages can still be printed */         \
191 177
}
192 178

  

Also available in: Unified diff