We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
case ARM_I2C_BUS_SPEED: pclk = HAL_RCC_GetPCLK1Freq(); switch (arg) { case ARM_I2C_BUS_SPEED_STANDARD: /* Clock = 100kHz, Rise Time = 1000ns */ if (pclk > 50000000U) { return ARM_DRIVER_ERROR_UNSUPPORTED; } if (pclk < 2000000U) { return ARM_DRIVER_ERROR_UNSUPPORTED; } ccr = (pclk / 100000U) / 2U; trise = (pclk / 1000000U) + 1U; break; case ARM_I2C_BUS_SPEED_FAST: /* Clock = 400kHz, Rise Time = 300ns */ if (pclk > 50000000U) { return ARM_DRIVER_ERROR_UNSUPPORTED; } if (pclk < 4000000U) { return ARM_DRIVER_ERROR_UNSUPPORTED; } if ((pclk >= 10000000U) && ((pclk % 10000000U) == 0U)) { ccr = I2C_CCR_FS | I2C_CCR_DUTY | ((pclk / 400000U) / 25U); } else { ccr = I2C_CCR_FS | ((pclk / 400000U) / 3U); } trise = (pclk / 333333U) + 1U; break; default: return ARM_DRIVER_ERROR_UNSUPPORTED; } i2c->reg->CR1 &= ~I2C_CR1_PE; /* Disable I2C peripheral */ i2c->reg->CR2 &= ~I2C_CR2_FREQ; i2c->reg->CR2 |= pclk / 1000000U; i2c->reg->CCR = ccr; i2c->reg->TRISE = trise;
if pclk is 42MHz, trise is 127, but i2c->reg->TRISE is 6bits register.