@@ -2240,7 +2240,57 @@ am_hal_iom_configure(void *pHandle, am_hal_iom_config_t *psConfig)
22402240 _VAL2FLD (IOM0_MI2CCFG_ADDRSZ , IOM0_MI2CCFG_ADDRSZ_ADDRSZ7 );
22412241 break ;
22422242 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+ }
22442294 }
22452295
22462296 }
0 commit comments