I2C

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Anonymous
Not applicable

I'm trying to let one master board read one byte from a slave board and display the read result in master's LCD.The result doesn't correct. Unfortunately, I don't know how to correct it.  Could you please give me some suggestions? I really appreciate any help from you. You can read the programs and some explanations below. The project is also attached. 

   

In my project, one PSoC 5 board used as a master is supposed to read one byte from a slave PSoC 5 board.  Slave board's address is set to 8 in both topdesign and program.  I also use a LCD to display the value which is read by master.  

   

The program of master is here:

   

int main()

   

{

   

    uint8 temp1,temp2;

   

    uint8 buffer = 0x00;

   

 

   

    LCD_Char_Start();

   

    

   

    LCD_Char_PrintString("Start I2C");

   

    I2CM_Start();

   

    CyDelay(200u);

   

    LCD_Char_ClearDisplay();

   

    

   

    LCD_Char_PrintString("Enable Intrp");

   

    /* Enable global interrupts - required for I2C */

   

    CyGlobalIntEnable;

   

    CyDelay(200u/*ms*/);

   

    LCD_Char_ClearDisplay();

   

    

   

    LCD_Char_PrintString("Clr I2C status");

   

    I2CM_MasterClearStatus(); /* Clear any previous status */

   

    CyDelay(200u/*ms*/);

   

   

   

    while(1){

   

    

   

        LCD_Char_ClearDisplay(); LCD_Char_PrintString("Sending data");

   

 

   

        do{

   

            temp1=I2CM_MasterReadBuf(I2C_SLAVE_ADDRESS, (uint8 *)&buffer, MRD_BUFFER_SIZE, I2CM_MODE_COMPLETE_XFER);

   

        }while(temp1!=I2CM_MSTR_NO_ERROR);

   

            

   

        LCD_Char_ClearDisplay(); LCD_Char_PrintString("Waiting for completion"); CyDelay(200u/*ms*/);

   

 

   

        while(I2CM_MasterStatus() == I2CM_MSTAT_XFER_INP);

   

        

   

        if(I2CM_MasterStatus()!=I2CM_MSTAT_RD_CMPLT){    

   

         

   

         LCD_Char_ClearDisplay(); LCD_Char_PrintInt8(I2CM_MasterStatus());

   

//when I run the project, LCD shows return value of I2CM_MasterStatus() is A1. What does it mean? 

   

         CyDelay(200u/*ms*/);

   

 

   

        } 

   

        temp2=I2CM_MasterClearStatus();

   

 

   

        LCD_Char_ClearDisplay();  

   

        if(temp2==I2CM_MSTAT_ERR_XFER){

   

                LCD_Char_PrintString("I2C Error");

   

        }else{

   

                LCD_Char_PrintInt8(buffer);

   

        }

   

        /* Delay introduced for ease of reading LCD */

   

        CyDelay(800u/*ms*/); 

   

        LCD_Char_ClearDisplay();  

   

        LCD_Char_PrintString("I2C Loop");

   

        CyDelay(800u/*ms*/);    

   

 

   

    }      

   

} /* End main */

   

/* [] END OF FILE */

   

 

   

Here is the program of slave:

   

int main()

   

{

   

    

   

    uint8 buffer=0x01;

   

    

   

    I2CS_SlaveSetAddress(8);

   

    

   

    I2CS_SlaveInitReadBuf((uint8 *)&buffer, RD_BUFFER_SIZE);

   

    

   

    /*start I2C Slave operation*/

   

    I2CS_Start();

   

    /* Enable global interrupts - needed for I2C operation */

   

    CyGlobalIntEnable;

   

    

   

    while(1){

   

        while( I2CS_SlaveGetReadBufSize()< 1 );

   

        buffer++;

   

        I2CS_SlaveClearReadStatus();

   

        I2CS_SlaveClearReadBuf();

   

    }

   

    

   

    return 0;

   

} /* End of main */

   

 

   

From my understanding, if the project works well, master can read slave's buffer where 0x01 stores and the buffer in master will be changed to 0x01 from 0x00. So that I can see 01 in LCD.  However, when I run the project, I2CM_MasterStatus() return A1 and the buffer in master is still 0X00.  

   

It is interesting that why the return value of I2CM_MasterStatus() is A1. I guess A1 shows me I2C_MSTAT_RD_CMPLT, I2C_MSTAT_ERR_ADDR_NAK and I2C_MSTAT_ERR_XFER . But why there is something wrong with address. 

   

I'm so confused. I really appreciate any suggestions and help from you. Thank you so much!

0 Likes
1 Reply
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

Look into I2CM.h, search for "error".

   

Then you see the bit-codes for your returned error:

   

    #define I2CM_MSTAT_ERR_ADDR_NAK     (0x20u) /* Slave did not ACK */
    #define I2CM_MSTAT_ERR_XFER         (0x80u) /* Error during transfer */

    /* Master API returns */
    #define I2CM_MSTR_BUS_BUSY          (0x01u) /* Bus is busy, process not started */
 

   

since in the case of one error you re-try reading (which I would NOT do) there might be some codes mixed.

   

 

   

Bob

0 Likes