diff --git a/cpu/samd21/periph/i2c.c b/cpu/samd21/periph/i2c.c index ab81aa6c2eff36311a7e008aebd5cc5d4cbd3aa9..86a9ce3c8f6983f743613a12b838c0ca22a45012 100644 --- a/cpu/samd21/periph/i2c.c +++ b/cpu/samd21/periph/i2c.c @@ -35,6 +35,11 @@ #define SAMD21_I2C_TIMEOUT (65535) +#define BUSSTATE_UNKNOWN SERCOM_I2CM_STATUS_BUSSTATE(0) +#define BUSSTATE_IDLE SERCOM_I2CM_STATUS_BUSSTATE(1) +#define BUSSTATE_OWNER SERCOM_I2CM_STATUS_BUSSTATE(2) +#define BUSSTATE_BUSY SERCOM_I2CM_STATUS_BUSSTATE(3) + /* static function definitions */ static void _i2c_poweron(SercomI2cm *sercom); static void _i2c_poweroff(SercomI2cm *sercom); @@ -197,10 +202,10 @@ int i2c_init_master(i2c_t dev, i2c_speed_t speed) i2c_poweron(dev); /* Start timeout if bus state is unknown. */ - while (!(I2CSercom->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(1))) { + while ((I2CSercom->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE_Msk) == BUSSTATE_UNKNOWN) { if(timeout_counter++ >= SAMD21_I2C_TIMEOUT) { /* Timeout, force bus state to idle. */ - I2CSercom->STATUS.reg = SERCOM_I2CM_STATUS_BUSSTATE(1); + I2CSercom->STATUS.reg = BUSSTATE_IDLE; } } return 0; @@ -435,7 +440,7 @@ static inline int _write(SercomI2cm *dev, char *data, int length) DEBUG("Looping through bytes\n"); while (tmp_data_length--) { /* Check that bus ownership is not lost. */ - if (!(dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(2))) { + if ((dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE_Msk) != BUSSTATE_OWNER) { DEBUG("STATUS_ERR_PACKET_COLLISION\n"); return -2; } @@ -476,7 +481,7 @@ static inline int _read(SercomI2cm *dev, char *data, int length) /* Read data buffer. */ while (count != length) { /* Check that bus ownership is not lost. */ - if (!(dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(2))) { + if ((dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE_Msk) != BUSSTATE_OWNER) { DEBUG("STATUS_ERR_PACKET_COLLISION\n"); return -2; } @@ -509,7 +514,7 @@ static inline void _stop(SercomI2cm *dev) /* Stop command */ dev->CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(3); /* Wait for bus to be idle again */ - while(dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(1)) {} + while((dev->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE_Msk) != BUSSTATE_IDLE) {} DEBUG("Stop sent\n"); }