Skip to content

Commit 4aeaf11

Browse files
committed
Add variable I2C clock speed if user selects outside of 100kHz, 400kHz, or 1MHz.
1 parent f09f385 commit 4aeaf11

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_iom.c

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)