/*- Definitions -------------------------------------------------------------*/
HAL_GPIO_PIN(SDA, A, 8);
HAL_GPIO_PIN(SCL, A, 9);
#define I2C_SERCOM SERCOM0
#define I2C_SERCOM_PMUX PORT_PMUX_PMUXE_C_Val
#define I2C_SERCOM_GCLK_ID SERCOM0_GCLK_ID_CORE
#define I2C_SERCOM_CLK_GEN 0
#define I2C_SERCOM_APBCMASK PM_APBCMASK_SERCOM0
#define I2C_ADDRESS 0xa0
enum
{
I2C_TRANSFER_WRITE = 0,
I2C_TRANSFER_READ = 1,
};
/*- Implementations ---------------------------------------------------------*/
//-----------------------------------------------------------------------------
void i2c_init(void)
{
HAL_GPIO_SDA_out();
//HAL_GPIO_SDA_pullup();
HAL_GPIO_SDA_pmuxen(I2C_SERCOM_PMUX);
HAL_GPIO_SCL_out();
//HAL_GPIO_SDA_pullup();
HAL_GPIO_SCL_pmuxen(I2C_SERCOM_PMUX);
PM->APBCMASK.reg |= I2C_SERCOM_APBCMASK;
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(I2C_SERCOM_GCLK_ID) |
GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(I2C_SERCOM_CLK_GEN);
I2C_SERCOM->I2CM.CTRLB.reg = SERCOM_I2CM_CTRLB_SMEN;
while (I2C_SERCOM->I2CM.SYNCBUSY.reg);
I2C_SERCOM->I2CM.BAUD.reg = SERCOM_I2CM_BAUD_BAUD(48);
while (I2C_SERCOM->I2CM.SYNCBUSY.reg);
I2C_SERCOM->I2CM.CTRLA.reg = SERCOM_I2CM_CTRLA_ENABLE |
SERCOM_I2CM_CTRLA_MODE_I2C_MASTER |
SERCOM_I2CM_CTRLA_SDAHOLD(3);
while (I2C_SERCOM->I2CM.SYNCBUSY.reg);
I2C_SERCOM->I2CM.STATUS.reg |= SERCOM_I2CM_STATUS_BUSSTATE(1);
while (I2C_SERCOM->I2CM.SYNCBUSY.reg);
}
bool i2c_read(uint8_t *data, int size)
{
SERCOM0->I2CM.ADDR.reg = I2C_ADDRESS | I2C_TRANSFER_READ;
//while (0 == (SERCOM0->I2CM.INTFLAG.reg & SERCOM_I2CM_INTFLAG_SB));
if (SERCOM0->I2CM.STATUS.reg & SERCOM_I2CM_STATUS_RXNACK)
{
SERCOM0->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(3);
return false;
}
SERCOM0->I2CM.CTRLB.reg &= ~SERCOM_I2CM_CTRLB_ACKACT;
for (int i = 0; i < size-1; i++)
{
data[i] = SERCOM0->I2CM.DATA.reg;
//while (0 == (SERCOM0->I2CM.INTFLAG.reg & SERCOM_I2CM_INTFLAG_SB));
}
if (size)
{
SERCOM0->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_ACKACT;
SERCOM0->I2CM.CTRLB.reg |= SERCOM_I2CM_CTRLB_CMD(3);
data[size-1] = SERCOM0->I2CM.DATA.reg;
}
return true;
}
Main
sys_init();
i2c_init();
uint8_t buf[3];
i2c_read (&buf,3);
But why when I chang the voltage it's the same value