Skip to main content
Visitor II
February 5, 2023
Question

I2C. address is not transmitted after START condition

  • February 5, 2023
  • 3 replies
  • 1716 views

Hi, I'm trying to write i2c ISR by myself with LL. But after START condition address don't transfer(I see it in my oscilloscope), although I write to I2C1->DR address of slave and read reference manual with attention for proper handling.

I generate initialization code with CubeMX, so there should not be errors in this part.

Here's my code of freertos task:

oid i2cLCD(void *arg) { // just FreeRTOS task
 while (1) {
 // wait for button to be pressed
 xEventGroupWaitBits(btnE, BUTTON_TASK_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
 //enable i2c event interrupt
 LL_I2C_EnableIT_EVT(I2C1);
 // generate start condition
 LL_I2C_GenerateStartCondition(I2C1);
 //wait for transfer to complete
 xEventGroupWaitBits(btnE, I2C_TASK_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
 i2c_data = i2c_data ^ 0xff;
 }
}

Here's code of ISR:

void I2C1_EV_IRQHandler(void)
{
 static BaseType_t wake = pdFALSE;
 
 if (I2C1->SR1 & I2C_SR1_SB) {
 I2C1->DR = 0x4e; //address of pcf8574
 return;
 }
 if (LL_I2C_IsActiveFlag_ADDR(I2C1)) {
 LL_I2C_TransmitData8(I2C1, 0xff);
 LL_I2C_ClearFlag_ADDR(I2C1);
 return;
 }
 if (LL_I2C_IsActiveFlag_BTF(I2C1)) {
 LL_I2C_GenerateStopCondition(I2C1);
 xEventGroupSetBitsFromISR(btnE, I2C_TASK_BIT, &wake);
 return;
 }
}

As I said, on SCL line I see falling edge and no pulses. On SDA nothing occurs - high level remains. I tried debugging - interrupt really occurs and condition on 5th line of code passes and 6th line executes. After that interrupt don't want to fire anymore and address just doesn't get transmitted. Maybe somebody encountered this kind of error? I'm trying to follow reference manual precisely, but can't get result. Thank you in advance!

    This topic has been closed for replies.

    3 replies

    Visitor II
    February 5, 2023

    For safety, before generating a START bit, check that both SDA and SCL are high level.

    If they don't, put a NOP breakpoint to catch this bus anomaly.

    FSky.1Author
    Visitor II
    February 5, 2023

    This pins are pulled up. How they can go low before start condition?

    Super User
    February 5, 2023

    > As I said, on SCL line I see falling edge and no pulses. On SDA nothing

    thats totally wrong. or exchange scl-sda ...

    first is : falling edge sda = start . then...pulse scl ...

    0693W00000YA10NQAT.png

    FSky.1Author
    Visitor II
    February 5, 2023

    Ye, you're alright. Start condition don't wanna generate due to unknown reason. Gonna figure it out.

    FSky.1Author
    Visitor II
    February 6, 2023

    Guys, you are not gonna believe! I've just set i2c address of my device and now it just works. It seems like stm's i2c controller dont bother it runs as master. It craves address of slave anyway lol. Is this bug in stm32 microcontrollers? It said nowhere about it0693W00000YA5EZQA1.png