Skip to main content
TARHAN SAMAH
Senior
January 22, 2018
Question

cannot send a message from a slave to a master i2c stm32f103!!

  • January 22, 2018
  • 4 replies
  • 1433 views
Posted on January 22, 2018 at 10:06

hello trying to send a message from an stm32 slave to another stm32 master no success i2c protocol ,

from master to slave no prblm i can do it very well ,

i cheked many times the repository interrupt exemples and did like them but no any changing, here what i did 

slave part :

if(HAL_GPIO_ReadPin(GPIOA, BUTTON_Pin)==1)//USER BUTTON PUSHED

{//BUTTON

printf('BUTTON');

while(HAL_GPIO_ReadPin(GPIOA, BUTTON_Pin)==1) //wait button to be released

if(HAL_I2C_Slave_Transmit(&hi2c2,data_master,1,50)==HAL_OK)//slaves answer to master

{

// printf('slave send to master succeed');

while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)

{

}

//

}

}//BUTTON

this function always fails, can you advice me plz

    This topic has been closed for replies.

    4 replies

    Andrew Neil
    Super User
    January 22, 2018
    Posted on January 22, 2018 at 11:46

    Slaves can't just send unsolicited messages to the Master - this is fundamental to the I2C protocol.

    I2C Protocol Specification: 

    https://www.nxp.com/docs/en/user-guide/UM10204.pdf

     

    https://en.wikipedia.org/wiki/I%C2%B2C

     

    https://learn.sparkfun.com/tutorials/i2c

     
    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    TARHAN SAMAH
    Senior
    January 22, 2018
    Posted on January 22, 2018 at 12:10

    i took a look to docs you send me thank you, so as i understood what suits my issue is to make multi master isnt it ?

    how can i do that

     HAL_I2C_Master_Transmit(&hi2c2,0,data_master,1,50)  on both  sides ???also it blokes both sides

    , which receiving interrupt is suitable for me on both sides :

    HAL_I2C_Master_Receive_IT(&hi2c2,0,(uint8_t *)aRxBuffer,1);//ENABLE RECEIVE IC2 INTERRUPT

    or 

    HAL_I2C_Slave_Receive_IT(&hi2c2,0,(uint8_t *)aRxBuffer,1);//ENABLE RECEIVE IC2 INTERRUPT 

    Andrew Neil
    Super User
    January 22, 2018
    Posted on January 22, 2018 at 12:21

    TARHAN SAMAH wrote:

    what suits my issue is to make multi master isnt it ?

    I would not recommend that - certainly not for a beginner!

    See: 

    https://community.st.com/0D50X00009XkXwGSAV

     

    And: 

    https://community.st.com/0D50X00009XkXwGSAV

     

    More conventional approaches would be, for example,

    1. The master polls the slave at suitable intervals;
    2. The slave has some sort of 'alert' signal to the Master - which tells it to read the Slave.

      (this is exactly what things like the well-known PCF8574 do)
    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    TARHAN SAMAH
    Senior
    January 22, 2018
    Posted on January 22, 2018 at 12:54

    thank you very much mister Andrew so the exemple in the repository I2C_TwoBoards_ComIT I2C Two Boards Communication IT Example, is eacty what i need . 

    for exemple i need to push a button each side and it should blink the other led of the other stm using interrupt at the reception from master to slave is ok but slave to master nthg happend??

    when i see this exemple repositry looks like its possible in stm32f103 series

    TARHAN SAMAH
    Senior
    January 22, 2018
    Posted on January 22, 2018 at 15:43

    now i make like you suggest me Mister 

    Andrew Neil

    2.The slave has some sort of 'alert' signal to the Master - which tells it to read the Slave.

    (this is exactly what things like the well-known PCF8574 do)

    even if the master gives to slave to right to send it cannot send anything 

    from the other side i tried both of them 

    HAL_I2C_Master_Transmit(&hi2c2,0,data_master,1,50);//master sends data to slave

    HAL_I2C_Slave_Transmit(&hi2c2,data_master,1,50);//master sends data to slave

    very strange !!!!

    datenschleuder
    Visitor II
    March 29, 2019

    Did you managed to find a solution for this strange behavior?

    I have exact the same problem and could not find a solution for this.

    Master sends data to slave via I2C fine, but the Slave sends only zeros back to the master via HAL_I2C_Slave_Transmit(&hi2c1, buffer, BUFFERSIZE, 5000); which returns with HAL_OK.

    The picture above shows sending two bytes from master to slave and 1 byte back from slave to master, but the data is always zero.

    0690X0000089DrXQAU.png