This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EK-TM4C129EXL: Using I2C Peripheral with the SMBus Protocol

Part Number: EK-TM4C129EXL

Hi,

I am working on a platform that will be using the TM4C129ENCPDT Arm chip. For development, I'm using the EK-TM4C129EXL and referencing the following TivaWare API. 

I've configured the I2C0 channel to act as a slave. However, I need to configure this channel to work under the SMBus I2C protocol, which the documentation says is possible. Though I don't quite see how do achieve this through the SW API. 

here is an image of write message.

I need the peripheral to ACK it's address, as per the SMBus design specs. 

Is there a way to do this?

Similarly, I will need to setup an SMBus channel on I2C1. Is there a SW API call or a register that can be configured in order to have the master expect the corresponding slave to ACK it's own address?

Thank you,

Zachary

  • Hi,

      Why do you say the slave does not ACK its address? From your scope, it looks to me the I2C returns the ACK. It is just that your logic analyzer does not say "Write (0x12) + ACK". If the slave does not respond with ACK, the master would not be able to continue with the next three writes as shown on your scope. Your below address cycle shows the address is 0x12 + W + ACK. 

    Please refer to this app note about compatibility between SMBus and I2C. 

    https://www.ti.com/lit/pdf/sloa132#:~:text=I2C%20has%20no%20similar%20specifications,(VIHMIN%20%2B%200.15V).

    Similarly, I will need to setup an SMBus channel on I2C1. Is there a SW API call or a register that can be configured in order to have the master expect the corresponding slave to ACK it's own address?

    I will suggest you refer to the below two examples in TivaWare library. 

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\i2c\slave_receive_int.c and 

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\i2c\master_slave_loopback.c. 

    These two examples make use of I2C0. To use I2C1 you just need to search and replace I2C0 with I2C1. You will also need to change the pinmuxing for I2C1. The examples are quite straight forward. 

  • You are absolutely right. I got tunnel vision on the UI and misunderstood. Thank you for the I2C and SMBus compatibility documentation as well. It is very helpful!