@@ -154,7 +154,7 @@ int MXC_I2C_RevA_SetFrequency(mxc_i2c_reva_regs_t *i2c, unsigned int hz)
154
154
hsHiClks = ticksTotal / 3 - 1 ;
155
155
156
156
// For rounding errors, adjust by 1 clock tick
157
- if (ticksTotal % 1 ) {
157
+ if (ticksTotal % 2 ) {
158
158
hsHiClks ++ ;
159
159
}
160
160
@@ -182,7 +182,7 @@ int MXC_I2C_RevA_SetFrequency(mxc_i2c_reva_regs_t *i2c, unsigned int hz)
182
182
lowClks = (ticksTotal >> 1 ) - 1 ;
183
183
184
184
// Adjust for rounding errors
185
- if (ticksTotal % 1 ) {
185
+ if (ticksTotal % 2 ) {
186
186
hiClks ++ ;
187
187
}
188
188
@@ -200,10 +200,18 @@ int MXC_I2C_RevA_SetFrequency(mxc_i2c_reva_regs_t *i2c, unsigned int hz)
200
200
201
201
unsigned int MXC_I2C_RevA_GetFrequency (mxc_i2c_reva_regs_t * i2c )
202
202
{
203
- unsigned int sclCycles = 0 ;
203
+ unsigned int sclCycles = 2 ;
204
+ // sclCycles Initialized to 2 b/c formula is sclCycles = (lo_clks + 1) + (hi_clks + 1)
204
205
205
- // Calculate the speed based on what we've written into registers
206
- sclCycles = (i2c -> clklo & MXC_F_I2C_REVA_CLKLO_LO ) + (i2c -> clkhi & MXC_F_I2C_REVA_CLKHI_HI );
206
+ if (i2c -> ctrl & MXC_F_I2C_REVA_CTRL_HS_EN ) {
207
+ // HS-Mode enabled, calculate HS Frequency
208
+ sclCycles += (i2c -> hsclk & MXC_F_I2C_REVA_HSCLK_LO ) >> MXC_F_I2C_REVA_HSCLK_LO_POS ;
209
+ sclCycles += (i2c -> hsclk & MXC_F_I2C_REVA_HSCLK_HI ) >> MXC_F_I2C_REVA_HSCLK_HI_POS ;
210
+ } else {
211
+ // HS-Mode not enabled, calculate nominal frequency
212
+ sclCycles += (i2c -> clklo & MXC_F_I2C_REVA_CLKLO_LO );
213
+ sclCycles += (i2c -> clkhi & MXC_F_I2C_REVA_CLKHI_HI );
214
+ }
207
215
208
216
return PeripheralClock / sclCycles ;
209
217
}
0 commit comments