|
|
|
@ -40,6 +40,10 @@
|
|
|
|
|
#define BUSSTATE_OWNER SERCOM_I2CM_STATUS_BUSSTATE(2) |
|
|
|
|
#define BUSSTATE_BUSY SERCOM_I2CM_STATUS_BUSSTATE(3) |
|
|
|
|
|
|
|
|
|
#if CPU_FAM_SAML21 |
|
|
|
|
#define SERCOM_I2CM_CTRLA_MODE_I2C_MASTER SERCOM_I2CM_CTRLA_MODE(5) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* static function definitions */ |
|
|
|
|
static void _i2c_poweron(SercomI2cm *sercom); |
|
|
|
|
static void _i2c_poweroff(SercomI2cm *sercom); |
|
|
|
@ -106,9 +110,23 @@ int i2c_init_master(i2c_t dev, i2c_speed_t speed)
|
|
|
|
|
while (I2CSercom->SYNCBUSY.reg & SERCOM_I2CM_SYNCBUSY_MASK) {} |
|
|
|
|
|
|
|
|
|
/* Turn on power manager for sercom */ |
|
|
|
|
#if CPU_FAM_SAML21 |
|
|
|
|
/* OK for SERCOM0-4 */ |
|
|
|
|
MCLK->APBCMASK.reg |= (MCLK_APBCMASK_SERCOM0 << (sercom_gclk_id - SERCOM0_GCLK_ID_CORE)); |
|
|
|
|
#else |
|
|
|
|
PM->APBCMASK.reg |= (PM_APBCMASK_SERCOM0 << (sercom_gclk_id - GCLK_CLKCTRL_ID_SERCOM0_CORE_Val)); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* I2C using CLK GEN 0 */ |
|
|
|
|
#if CPU_FAM_SAML21 |
|
|
|
|
GCLK->PCHCTRL[sercom_gclk_id].reg = (GCLK_PCHCTRL_CHEN | |
|
|
|
|
GCLK_PCHCTRL_GEN_GCLK0 ); |
|
|
|
|
while (GCLK->SYNCBUSY.bit.GENCTRL) {} |
|
|
|
|
|
|
|
|
|
GCLK->PCHCTRL[sercom_gclk_id_slow].reg = (GCLK_PCHCTRL_CHEN | |
|
|
|
|
GCLK_PCHCTRL_GEN_GCLK0 ); |
|
|
|
|
while (GCLK->SYNCBUSY.bit.GENCTRL) {} |
|
|
|
|
#else |
|
|
|
|
GCLK->CLKCTRL.reg = (GCLK_CLKCTRL_CLKEN | |
|
|
|
|
GCLK_CLKCTRL_GEN_GCLK0 | |
|
|
|
|
GCLK_CLKCTRL_ID(sercom_gclk_id)); |
|
|
|
@ -118,6 +136,7 @@ int i2c_init_master(i2c_t dev, i2c_speed_t speed)
|
|
|
|
|
GCLK_CLKCTRL_GEN_GCLK0 | |
|
|
|
|
GCLK_CLKCTRL_ID(sercom_gclk_id_slow)); |
|
|
|
|
while (GCLK->STATUS.bit.SYNCBUSY) {} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Check if module is enabled. */ |
|
|
|
|