@@ -2240,7 +2240,57 @@ am_hal_iom_configure(void *pHandle, am_hal_iom_config_t *psConfig)
2240
2240
_VAL2FLD (IOM0_MI2CCFG_ADDRSZ , IOM0_MI2CCFG_ADDRSZ_ADDRSZ7 );
2241
2241
break ;
2242
2242
default :
2243
- return AM_HAL_STATUS_INVALID_ARG ;
2243
+ {
2244
+ //Calculate TOTPER and FSEL based on requested frequency
2245
+ uint32_t reqFreq = psConfig -> ui32ClockFreq ;
2246
+ uint32_t fsel = 2 ;
2247
+ uint32_t totper = 0 ;
2248
+ for ( ; fsel < 128 ; fsel = fsel * 2 )
2249
+ {
2250
+ //IOM and HFRC are not affected by burst mode
2251
+ totper = (48000000 / (2 * fsel ))/reqFreq - 1 ;
2252
+ if (totper < 256 ) break ;
2253
+ }
2254
+
2255
+ if (fsel == 128 )
2256
+ {
2257
+ //If fsel is too large, return with error
2258
+ return AM_HAL_STATUS_INVALID_ARG ;
2259
+ }
2260
+
2261
+ uint32_t fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV2 ;
2262
+
2263
+ if (fsel == 2 )
2264
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV2 ;
2265
+ else if (fsel == 4 )
2266
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV4 ;
2267
+ else if (fsel == 8 )
2268
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV8 ;
2269
+ else if (fsel == 16 )
2270
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV16 ;
2271
+ else if (fsel == 32 )
2272
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV32 ;
2273
+ else if (fsel == 64 )
2274
+ fsel_bitvalue = IOM0_CLKCFG_FSEL_HFRC_DIV64 ;
2275
+
2276
+ ui32ClkCfg = _VAL2FLD (IOM0_CLKCFG_TOTPER , totper ) |
2277
+ _VAL2FLD (IOM0_CLKCFG_LOWPER , totper /2 ) |
2278
+ _VAL2FLD (IOM0_CLKCFG_DIVEN , IOM0_CLKCFG_DIVEN_EN ) |
2279
+ _VAL2FLD (IOM0_CLKCFG_DIV3 , IOM0_CLKCFG_DIV3_DIS ) |
2280
+ _VAL2FLD (IOM0_CLKCFG_FSEL , fsel_bitvalue ) |
2281
+ _VAL2FLD (IOM0_CLKCFG_IOCLKEN , 1 );
2282
+ IOMn (ui32Module )-> MI2CCFG = _VAL2FLD (IOM0_MI2CCFG_STRDIS , 0 ) |
2283
+ _VAL2FLD (IOM0_MI2CCFG_SMPCNT , 0x21 ) |
2284
+ _VAL2FLD (IOM0_MI2CCFG_SDAENDLY , 3 ) |
2285
+ _VAL2FLD (IOM0_MI2CCFG_SCLENDLY , 0 ) |
2286
+ _VAL2FLD (IOM0_MI2CCFG_MI2CRST , 1 ) |
2287
+ _VAL2FLD (IOM0_MI2CCFG_SDADLY , 0 ) |
2288
+ _VAL2FLD (IOM0_MI2CCFG_ARBEN , IOM0_MI2CCFG_ARBEN_ARBDIS ) |
2289
+ _VAL2FLD (IOM0_MI2CCFG_I2CLSB , IOM0_MI2CCFG_I2CLSB_MSBFIRST ) |
2290
+ _VAL2FLD (IOM0_MI2CCFG_ADDRSZ , IOM0_MI2CCFG_ADDRSZ_ADDRSZ7 );
2291
+ break ;
2292
+
2293
+ }
2244
2294
}
2245
2295
2246
2296
}
0 commit comments