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.

[参考译文] TMS320F2800157:将主器件切换到从器件

Guru**** 2538930 points
Other Parts Discussed in Thread: TMS320F2800157

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370267/tms320f2800157-switching-master-to-slave

器件型号:TMS320F2800157

工具与软件:

大家好、团队成员:

我将使用通过 I2C 连接的两个板(TMS320F2800157)、我将尝试使用 FIFO 来发送和接收数据。

我能够将数据从第1个板 TX 缓冲器发送到第2个板 RX 缓冲器、并在第2个板本身中提升中断。

在缓冲区内、我能够获取 Data。 在同一个 ISR 内、我清除了所有中断、然后尝试输出数据、以便我可以通过发出的 ISR 调用在第1个板 RX 缓冲区中接收。

我在第二块电路板中看到、在发送时、总线处于繁忙状态、MST 或主模式位变为0、同时将仲裁丢失位设置为高电平。

我猜测第一个板是主板、不会释放对其他板发送数据的控制。

如果我的上述猜测是写入、那么我如何在第一次完成事务后立即释放第一块电路板上的主控?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是配置

    第1块和第2块电路板运行相同的代码库。

    两者都配置为 Controller_Send_Mode、仅针对1字节接收发出 FIFO 中断、两个器件都将具有自己的地址。

    从第一个板开始、调用用于 FIFO 的 ISR 一次、并由第二个板上的相同 ISR 函数接收、然后在用于发回数据的相同 ISR 代码中写入、这应该提高第一个板中的 ISR 以进行接收。

    运行的 ISR 的伪代码

    FIFO_ISR (){

    //如果在 RXFF 缓冲区中接收到某些数据、则仅在第二个电路板中调用用于接收数据的代码。 在第1个电路板中、由于此 ISR 是手动调用的、因此此 if 子句将不会运行。

    如果((I2C_getInterruptStatus (I2C_base)& I2C_INT_RXFF)!= 0){
           RDATA =
                           I2C_getData (I2C_BASE);
       }

    //用于发送将在第一个板中手动调用此 ISR 函数后运行的数据的代码、在第二个板中调用此 ISR 函数时由于接收数据而引发此 ISR (RXFF)
       I2C_putData (
                           I2C_BASE、
                           sData;
       I2C_sendStartCondition (I2C_base);
       SYSCTL_DELAY (50);
       I2C_sendStopCondition (I2C_base);
       
       I2C_clearInterruptStatus (I2C_base、I2C_INT_RXFF | I2C_INT_TXFF);
       interrupt_clearACKGroup (interrupt_ACK_group8);

    }

    在第1个电路板中、我没有收到因从第2个电路板接收到数据而引发的 ISR。

    但是、从1到2的数据传输是正常的。

    两个器件 pseducode 的配置已完成

    I2C_disableModule (I2C_BASE);
       I2C_initController (I2C_BASE、DEVICE_SYSCLK_FREQ、400000、
                          I2C_DUTYCYCLE_50);
       I2C_setConfig (I2C_base、I2C_CONTROLLER_SEND_MODE);
       I2C_setDataCount (I2C_BASE、1);
       I2C_setBitCount (I2C_BASE、I2C_BITCOUNT_8);
       开关(某个值)
       {
       有所值:
           I2C_setOwnAddress (I2C_base、第一个地址);
           I2C_setTargetAddress (I2C_BASE、第二地址);
           休息;
       有所值:
           I2C_setOwnAddress (I2C_base、2nd address);
           I2C_setTargetAddress (I2C_BASE、第一个地址);
           休息;
       }
       I2C_setEmulationMode (I2C_BASE、I2C_EMULATION_STOP_SCL_LOW);
       I2C_enableFIFO (I2C_BASE);
       I2C_setFIFOInterruptLevel (I2C_base、I2C_FIFO_TX1、I2C_FIFO_RX1);
       I2C_enableInterrupt (I2C_base、I2C_INT_RXFF | I2C_INT_STOP_Condition);
       I2C_clearInterruptStatus (I2C_base、I2C_INT_TXFF | I2C_INT_RXFF);
       I2C_disableLoopback (I2C_BASE);
       I2C_enableModule (I2C_BASE);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kaustuv:

    正确识别后、一个板需要释放对控制器的控制、以便另一个板用作控制器。 换句话说、即使可以有多个目标、I2C 系统中也只能有一个控制器。 但是、 I2C 模块可以作为控制器启动并在某些情况下(尤其是在本例中的中断处理程序)成为目标、反之亦然。 请参阅 I2C 部分完整内容、特别是 表19-2 I2C 模块的工作模式。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aishwarya:

    我将尝试使用上述代码中所述的相同方法、

    您能建议我对现有代码进行更改以便更好地理解吗?

    此致、

    Kaustuv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 ISR 本身内部进行操作、然后才能切换到另一种接收模式。 是否应该使用控制器或目标接收器。 在切换之前还需要做什么? 请使用上面的示例代码进行说明!

    此致、

    Kaustuv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kaustuv

    您是否查看过我之前提到的表( 此处链接)? 正如我之前提到的、系统中不能有两个控制器。 必须有一个控制器和一个目标。 根据你的代码、你有两个发送数据的控制器。 也使用 i2c_ex3_external_loopback 示例作为参考。

    此致、

    Aishwarya.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aishwarya

    感谢上面的文件,早些时候我跟踪了一些其他文件,这是不够的。

    从新的文档中我了解到、如果两个 TMS320F2800157与 SDA、SCLK 相连接、并且如果他们想用 FIFO 寄存器作为主从器件进行通信、那么:-

    第1电路板-控制器发送模式

    第2个电路板-目标接收器模式

    在运行时切换配置

    第1个电路板-控制器接收模式

    第2个电路板-目标发送模式

    请注意、此系统不使用任何 EEPROM。

    如果我的理解在考虑上述配置的情况下是正确的、那么您能为我提供一个合适的示例、其中1字节的数据从控制器传输到目标、反之亦然。 C2000随附的示例不够详尽或不清楚、而且一些示例会造成很多混淆。

    与上述场景和配置相关、您能提供另一个示例、说明如何仅将1字节数据从发送器(TMS320)传输到控制器(TMS320)板、其中控制器在控制器接收模式和目标发送模式下启动。 不会将任何数据从控制器传输到目标器件、但控制器将始终要求目标器件发送数据。

    此致

    Kaustuv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kaustuv

    [报价 userid="602529" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370267/tms320f2800157-switching-master-to-slave/5237781 #5237781"]

    如果我的理解在考虑上述配置的情况下是正确的、那么您能为我提供一个合适的示例、其中1字节的数据从控制器传输到目标、反之亦然。 C2000随附的示例不够详尽或不清楚、而且一些示例会造成很多混淆。

    与上述场景和配置相关、您能提供另一个示例、说明如何仅将1字节数据从发送器(TMS320)传输到控制器(TMS320)板、其中控制器在控制器接收模式和目标发送模式下启动。 不会将任何数据从控制器传输到目标器件、但控制器将始终要求目标器件发送数据。

    [报价]

    理解是正确的。 除 TRM 文档外、还请 以 i2c_ex3_external_loopback.c 和 i2c_ex5_controller_target_interrupt 为基础、了解如何配置这些要求。 目前、我们没有完全符合您在此所述要求的示例。 我已经记录了您的请求和反馈、并将与团队讨论。 如果您对示例或测试用例有任何具体问题、请告诉我。

    此致、

    Aishwarya.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Aishwarya,

    是否可以从初始阶段启动控制器作为接收器和目标作为发送器、而不切换到控制器作为发送器和目标作为接收器。 从共享文档中给出的流程图中、我了解到可以将板直接初始化为接收器、将目标初始化为发送器。

    我的理解是否正确、那么我需要执行哪些步骤来传输数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kaustuv

    是的、您的理解是正确的。 如您已确定、您可以按照流程图进行操作。  

    此致、

    Aishwarya.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aishwarya:

    我们之前讨论过的完全没问题。 现在、对于模块开发的最后一步、我们需要您的建议。

    已完成:

    1.使用 FIFO 将主机配置为控制器接收模式

    2.使用 FIFO 将从器件配置为目标发送模式。

    3.在从器件 TX FIFO 寄存器中提供了一些数据(putData())。

    3.通过主程序初始化提取数据。

    4.在主控 RX FIFO 中从控 TX FIFO 中接收到的数据。

    我们需要完成的最后一步:

    1.由于主设备异步运行,因此它启动非定期传输数据的调用。

    2.在从机模式下、需要一些中断机制来缓冲从机的 TX FIFO 寄存器数据已经传输到主机、而新数据应当写入相同的 TX FIFO 寄存器、以便下一次或周期主机获得更新后的新数据。

    注意:我们不会在两个连续的启动调用之间使用 setConfig()更改任何主设备的配置以传输数据。  

    我们将等待您的建议!

    谢谢

    此致、

    Kaustuv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kaustuv

    很高兴听到这个消息。 我相信大家都知道、我们没有针对这个特定用例的代码、下面是我的想法。 "I2C TRM"一章 /I2C 寄存器说明讨论了 I2C 硬件如何在发送/接收到特定数量的数据(TX/RX FIFO 中断)后触发中断。 在这些中断中、您可以执行所需的任何操作。 这应该对问题2有所帮助。 因为我不能准确建议该怎么做、所以最好的做法是参考其他 E2E 线程、并 在程序达到所需操作前对其进行调试   

    此致、

    Aishwarya.