i2c: use speed setting from newer library version
This commit is contained in:
parent
5e1ba40641
commit
f34641e25b
2 changed files with 1 additions and 96 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit 3f65af8ccc09a2cff09c761924cb3776c69c2824
|
||||
Subproject commit f4a82997e3408135528c8736eddc79a29891b2e5
|
||||
|
|
@ -27,101 +27,6 @@ enum sht21_cmd_e {
|
|||
|
||||
// ------------------ section proposed to go up to libopencm3
|
||||
|
||||
/**
|
||||
* I2C speed modes.
|
||||
*/
|
||||
enum i2c_speeds {
|
||||
i2c_speed_sm_100k,
|
||||
i2c_speed_fm_400k,
|
||||
i2c_speed_fmp_1m,
|
||||
i2c_speed_unknown
|
||||
};
|
||||
|
||||
/* to go to i2c-v1 impl file, with common name.... */
|
||||
/**
|
||||
* Set the i2c communicaton speed.
|
||||
* @param p i2c peripheral, eg I2C1
|
||||
* @param speed one of the listed speed modes @ref i2c_speeds
|
||||
* @param clock_megahz i2c peripheral clock speed in MHz. Usually, rcc_apb1_frequency / 1e6
|
||||
*/
|
||||
static void i2c_set_speed_v1(uint32_t p, enum i2c_speeds speed, uint32_t clock_megahz)
|
||||
{
|
||||
i2c_set_clock_frequency(p, clock_megahz);
|
||||
switch(speed) {
|
||||
case i2c_speed_fm_400k:
|
||||
i2c_set_fast_mode(p);
|
||||
i2c_set_ccr(p, clock_megahz * 5 / 6);
|
||||
i2c_set_trise(p, clock_megahz + 1);
|
||||
break;
|
||||
default:
|
||||
/* fall back to standard mode */
|
||||
case i2c_speed_sm_100k:
|
||||
i2c_set_standard_mode(p);
|
||||
/* x Mhz / (100kHz * 2) */
|
||||
i2c_set_ccr(p, clock_megahz * 5);
|
||||
/* Sm mode, (100kHz) freqMhz + 1 */
|
||||
i2c_set_trise(p, clock_megahz + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* to go to i2c-v2 impl file, with common name.... */
|
||||
/**
|
||||
* Set the i2c communicaton speed.
|
||||
* NOTE: 1MHz mode not yet implemented!
|
||||
* Min clock speed: 8MHz for FM, 2Mhz for SM,
|
||||
* @param p i2c peripheral, eg I2C1
|
||||
* @param speed one of the listed speed modes @ref i2c_speeds
|
||||
* @param clock_megahz i2c peripheral clock speed in MHz. Usually, rcc_apb1_frequency / 1e6
|
||||
*/
|
||||
static void i2c_set_speed_v2(uint32_t p, enum i2c_speeds speed, uint32_t clock_megahz)
|
||||
{
|
||||
int prescaler;
|
||||
switch(speed) {
|
||||
case i2c_speed_fmp_1m:
|
||||
/* FIXME - add support for this mode! */
|
||||
break;
|
||||
case i2c_speed_fm_400k:
|
||||
/* target 8Mhz input, so tpresc = 125ns */
|
||||
prescaler = clock_megahz / 8 - 1;
|
||||
i2c_set_prescaler(p, prescaler);
|
||||
i2c_set_scl_low_period(p, 0x9); // 1250ns
|
||||
i2c_set_scl_high_period(p, 3); // 500ns
|
||||
i2c_set_data_hold_time(p, 2); // 250ns
|
||||
i2c_set_data_setup_time(p, 2); // 375ns
|
||||
break;
|
||||
default:
|
||||
/* fall back to standard mode */
|
||||
case i2c_speed_sm_100k:
|
||||
/* target 2Mhz input, so tpresc = 500ns */
|
||||
prescaler = clock_megahz / 4 - 1;
|
||||
i2c_set_prescaler(p, prescaler);
|
||||
i2c_set_scl_low_period(p, 0x13); // 5usecs
|
||||
i2c_set_scl_high_period(p, 0xf); // 4usecs
|
||||
i2c_set_data_hold_time(p, 2); // 0.5usecs
|
||||
i2c_set_data_setup_time(p, 4); // 1.25usecs
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* requires clock to be a multiple of 2 ! */
|
||||
/**
|
||||
* Set the i2c line speed as optimally as possible
|
||||
* @param p
|
||||
* @param speed
|
||||
* @param clock_megahz _normally_ provide: rcc_apb1_frequency / 1000000 here
|
||||
* TODO: clock must be a multiple of 2meg for -v2 at least, improve docs here!
|
||||
*/
|
||||
static void i2c_set_speed(uint32_t p, enum i2c_speeds speed, uint32_t clock_megahz)
|
||||
{
|
||||
#if defined I2C_SR2
|
||||
i2c_set_speed_v1(p, speed, clock_megahz);
|
||||
#else
|
||||
i2c_set_speed_v2(p, speed, clock_megahz);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void i2c_write7_v1(uint32_t i2c, int addr, uint8_t *data, size_t n)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue