2025-09-13 6:58 AM
Hi, Im using my own I2C library but after i write the device adress when i receive SB interrupt the adress bit never seems to be set to 1. I have tried testing it with HAL and it seems to work fine. I would be happy if someone could help
void I2C_EventInterruptHandler(I2C_Com* i2c)
{
uint8_t temp;
//Check if event interrupt bit is set
if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_CR2, 9))
{
//Start condition
if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 0))
{
temp = i2c->i2cReg->I2C_SR1;
i2c->i2cReg->I2C_DR = i2c->deviceAddress;
}
//Check for address sent
if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 1))
{
//Check if its in read mode and if rxLegth is 1
if(i2c->deviceAddress & 1 && i2c->rxLength == 1)
{
//Disable ack
i2c->i2cReg->I2C_CR1 &= ~(1 << 10);
i2c->i2cReg->I2C_CR1 |= (1 << 9);
}
temp = i2c->i2cReg->I2C_SR1;
temp = i2c->i2cReg->I2C_SR2;
}
//Check for tx/rx interrupt bit
else if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_CR2, 10))
{
//tx interrupt
if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 7))
{
I2C_TxInterruptHandler(i2c);
}
//rx interrupt
if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 6))
{
I2C_RxInterruptHandler(i2c);
}
}
//Check for BFT bit
else if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 2))
{
I2C_BFTInterruptHandler(i2c);
}
//Check for Stop bit
else if(I2C_CheckBitStatus(&i2c->i2cReg->I2C_SR1, 4))
{
}
}
}