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.

TMS320F280025C: I2C没有时钟线且如何设置初始化?

Part Number: TMS320F280025C

您好: 

我们目前有一个项目用到F28025C的芯片的I2C模块,

我们采用开发板做主Master(I2CA模块作Master), 我们的项目板做从Slave(I2CB模块作Slave)。 采用贵公司提供的例程i2c_ex5_master_slave_interrupt进行实验,

我们采用的是Example2: I2CA as Master Receiver and I2CB working Slave Transmitter, 

运行起来后逻辑分析仪得到以下信号线:只有SDA信号线, 没有SCL信号线。 请问这是什么原因?

另外我们还有如下问题:

1. 管脚配置:在例程中SDA, SCL均配置成了输入且上拉, 为什么如此配置? 常规上这两个管脚不是应该配置成开漏输出吗?

2. I2C模块带有FIFO功能且FIFO也有中断, I2C本身也有TX与RX中断。 在例程中对二者均开启了中断, 如何区分?

3. 我们目前不打算用FIFO功能, 请问如何对Master与Slave进行初始化设置?最好有设置步骤供我们参考!

Serena

谢谢

  • 您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

  • 运行起来后逻辑分析仪得到以下信号线:只有SDA信号线, 没有SCL信号线。 请问这是什么原因?

    您好,示例将 GPIO26 / 27 用于 SDA/SCL 引脚。 请问下您为何要探测 GPIO43 ?

    #define DEVICE_GPIO_PIN_SDAA        26U  // GPIO number for I2C SDAA
    #define DEVICE_GPIO_PIN_SCLA        27U  // GPIO number for I2C SCLA

    1. 管脚配置:在例程中SDA, SCL均配置成了输入且上拉, 为什么如此配置? 常规上这两个管脚不是应该配置成开漏输出吗?

    I2C_GPIO_init 中的以下语句将其配置为 SDA/SCL 外设,并且使得输入引脚配置无效。 您无需启用 openDRAIN。 I2C_GPIO_INIT 函数中提供的配置显示了如何将 GPIO 配置为 I2C 引脚。

        GPIO_setPinConfig(DEVICE_GPIO_CFG_SDAA);
        GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLA);

    2. I2C模块带有FIFO功能且FIFO也有中断, I2C本身也有TX与RX中断。 在例程中对二者均开启了中断, 如何区分?

    WRITE_READ_TX_RX_FIFO 函数,在其中读取中断源寄存器用于确定中断源。

    3. 我们目前不打算用FIFO功能, 请问如何对Master与Slave进行初始化设置?最好有设置步骤供我们参考!

    如果您不打算使用 FIFO,该示例可能没用。 请问您是希望使用轮询 (或) 中断选项吗? 您是否想要逐字节进行事务处理?

  • Hello Cherry ,

    感谢您一直以来的回复。

    我们采用开发板做主Master(I2CA模块作Master SCL:GPIO27,SDA:GPIO26), 我们的项目板做从Slave(I2CB模块作Slave,SCL:GPIO3,SDA:GPIO2 )。 采用贵公司提供的例程i2c_ex5_master_slave_interrupt进行实验,管脚设置与I2C初始化均采购你们提供的函数。

    --------------------------------
    //! Signal | I2CA   | I2CB
    //! --------------------------------
    //! SCL | GPIO27 | GPIO3
    //! SDA | GPIO26 | GPIO2
    //! --------------------------------

    // Example2: I2CA as Master Receiver and I2CB working Slave Transmitter //

    // I2CA = Master Receiver
    // I2CB = Slave Transmitter
    // I2CA generates
    // 1) START condition
    // 2) I2CB address (Slave address) + Write mode
    // 3) Transmit start address of I2CB_TXdata
    // 4) I2CA generates repeated START condition + Read mode
    // 4) I2CB (slave) transmits contents of I2CB_TXdata
    // 5) I2CA received data is stored in I2CA_RXdata array
    // 6) Contents of I2CB_TXdata and I2CA_RXdata should match

    目前我们还是无法调通Example2: I2CA as Master Receiver and I2CB working Slave Transmitter例程程序。

    当烧录进程序进行初始化后,无法通讯的原因是SCL处于低电平(I2C线路忙状态)。可能是初始化设置有问题。

    请问:1)如何设置I2CA as Master Receiver的初始化(在开发板上I2CA模块作Master )

               2. 如何设置 I2CB working Slave Transmitter的初始化(项目板做从Slave(I2CB模块作Slave)

    另外,请帮忙解释以下四个函数主要实现的功能是什么,且它们各自适用的场合是什么?

    函数1. I2C_MasterReceiver(&I2CA); 

    函数2. I2C_MasterTransmitter(&I2CA);

    函数3. handleI2C_ErrorCondition(&I2CA);

    函数4. Write_Read_TX_RX_FIFO(&I2CA);

     

    谢谢

    Serena

  • 您好,之前您说无法探测 SCL 信号,现在可以了吗? 此外您有没有试过用轮询进行字节到字节的事务处理?

    :1)如何设置I2CA as Master Receiver的初始化(在开发板上I2CA模块作Master )

    I2C_MasterReceiver (&I2CA) 函数负责将 I2CA 配置为主接收器。

       2. 如何设置 I2CB working Slave Transmitter的初始化(项目板做从Slave(I2CB模块作Slave)

    当 I2C 主机 (i2CA) 发送 I2CB 从机地址时,由于 I2CB 被寻址为从机,因此会触发 i2cISR 中断。 HandleI2C_ErrorCondition 函数之后会检测中断源并检查 I2CA (主机) 是否需要读 / 写 (基于 SDIR 位) ,I2CB 之后在 handleI2C_ErrorCondition 函数内被配置为从发送器 / 接收器。

    函数1. I2C_MasterReceiver(&I2CA); 

    函数2. I2C_MasterTransmitter(&I2CA);

    函数3. handleI2C_ErrorCondition(&I2CA);

    这三个函数已经解释过了。

    函数4. Write_Read_TX_RX_FIFO(&I2CA);

    这个函数用于读取 TX / RX FIFO 的内容并根据上下文填充相应的缓冲器 (传输模式 / 接收器模式)。

  • Cherry您好:非常感谢您的回复. 

    您好,之前您说无法探测 SCL 信号,现在可以了吗? 此外您有没有试过用轮询进行字节到字节的事务处理?  

    -----Cherry,我们 现在可以探测到SCL信号了。不过只有一个字节:Start+SlaveID,然后就没有下文了,因为从机Slave的SCL总是处于低电平状态。此外我们没有试过轮询进行字节到字节的事物处理。

    :1)如何设置I2CA as Master Receiver的初始化(在开发板上I2CA模块作Master )

    I2C_MasterReceiver (&I2CA) 函数负责将 I2CA 配置为主接收器。

    ----- Cherry, 我们已明白I2C_MasterReceiver (&I2CA)作为将I2CA配置为主接收器这一点。但如何进行轮询? 比如说,我们想在Timer定时器中设置一个500mS的节钟,每500mS读一次Slave的数据,这要进行哪些设置及调用哪个函数?

       2. 如何设置 I2CB working Slave Transmitter的初始化(项目板做从Slave(I2CB模块作Slave)

    当 I2C 主机 (i2CA) 发送 I2CB 从机地址时,由于 I2CB 被寻址为从机,因此会触发 i2cISR 中断。 HandleI2C_ErrorCondition 函数之后会检测中断源并检查 I2CA (主机) 是否需要读 / 写 (基于 SDIR 位) ,I2CB 之后在 handleI2C_ErrorCondition 函数内被配置为从发送器 / 接收器。

    ----- Cherry,请告诉如何进行设置 I2CB 被寻址为从机的初始化,如果可以的话,请列出步骤。就我们目前采用的TI官方的初始化设置,SCL线总是处于低电平状态,因此无法传传输数据。

    ----- Cherry,你说的I2CB 被寻址为从机,因此会触发 i2cISR 中断。关于这个问题我们有以下疑问:

    1. 在TI例程中,有两种中断方式且均使能,请问这如何判定会触发 i2cISR 中断,还是触发i2cAFIFOISR?另外,TI用户手册上说这两种中断只可选一种。那为何Ti官方出的例程中,又同时使用两种中断呢?

    2. 如果触发中断成功,Slave从机又是从哪个函数中发送数据给Master主机的呢? 且主机收到数据到,要从哪个函数中去取从Slave从机来的数据?

    3. 关于I2C模块的使用,我们有太多的疑惑,以致工作迟迟无法向前推进,如果您有关于I2C更详细的资料,如果在使用中I2C是如何运转的或对官方代码更详细的解释,请发给我们一下,非常感谢!

    函数1. I2C_MasterReceiver(&I2CA); 

    函数2. I2C_MasterTransmitter(&I2CA);

    函数3. handleI2C_ErrorCondition(&I2CA);

    这三个函数已经解释过了。

    ----- Cherry,谢谢你对此三个函数的解释。

    函数4. Write_Read_TX_RX_FIFO(&I2CA);

    这个函数用于读取 TX / RX FIFO 的内容并根据上下文填充相应的缓冲器 (传输模式 / 接收器模式)。

    ----- Cherry,我们看到Write_Read_TX_RX_FIFO(&I2CA)这个函数用在i2cAFIFOISR中断函数中,请问此函数可以用在别的地方吗, 比如在Timer定时器中设置一个500mS的节钟中使用。

    是否可以主此函数再进一步进行说明呢?

    谢谢

    Serena

  • 好的收到哈,再帮您跟进给工程师这边问下,有答复尽快给到您。

  • 您好,有一点可能需要您再说明下,您是想要尝试获取 I2CA 和 I2CB 相互通信的示例?还是说尝试使用其中一个 I2C 与另一个从机通信? 如果正在与另一个从机 (非I2CB) 通信,您有没有从从机接收到过 ACK ? 您是尝试和哪种从设备通信?

  • 您好,我们未尝试过与别的从机通讯,目前我们的项目是要用F280025C作从机作用。贵司给的案例中只有这一个例子是有从机设置的。别的都没有。

    请尽快回复我们之前的问题,谢谢

  • 好的感谢您的反馈,帮您跟进给工程师问了哈,有答复会尽快给到您。

  • 您好,如果 F280025C I2C 是从机,请问下主机是? 在寻址时 F280025C I2C 是否正确发送 ACK 信号?

    此外,请问您想要实现的目标是什么? 需要发送或接收多少 I2C 字节? 想要从 F280025 I2C 读取什么 (在从机配置中?)?