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.

[参考译文] TMS320F28069M:使用 SCIb 的通信代码、以前与 CCS &amp 的早期版本配合使用;以前的编译器不再工作

Guru**** 2529140 points
Other Parts Discussed in Thread: C2000WARE, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1167496/tms320f28069m-communications-code-using-scib-that-used-to-work-with-a-previous-version-of-ccs-a-previous-compiler-no-longer-works

器件型号:TMS320F28069M
主题中讨论的其他器件:C2000WAREMOTORWARE

您好!

我设计了一个电机控制板(MCB)、它需要使用转差协议以115.2 kbaud 的速率与 LCD 板进行通信。 通常、LCD 会向 MCB 发送数据请求、或发送命令来更改此参数或该参数(速度、扭矩限制等)、然后发送要更改的值。 这会导致 MCB 必须接收和解释的消息长度发生变化。 因此、接收到的数据将逐字节检查、字符表示消息的开始和结束。 对于在作出和发送答复之前,必须由 MCB 接收的内容,有若干条件。

正在接收和评估数据。 它通常满足上述条件、通常情况下更是如此、并且一个应答被逐字节地放置在一起、因此由 SCIb 进行传输。 我可以通过调试器(通过在适当的位置放置断点)查看所有这种情况。 我可以使用示波器从物理角度查看接收到的消息。

但是、任何要作为应答传输的消息都不会从微控制器发出。 我可以查看 Tx 应该退出的引脚、没有任何内容。 奇怪的是、终端程序(Docklight、Putty、TeraTerm)在 Rx 或 Tx 线路上都没有执行任何操作。

遇到这种情况后、我运行了该程序的一些旧版本、并可以使用终端查看 Rx 和 Tx 上的活动。 但是、这些较旧版本在答复中没有正确的消息格式。 我对消息格式做了一些小的更改、并且突然遇到了一些错误、迫使我在 Properties 对话框中更改编译器和链接器标志(以及对编译器本身的引用)。 我将此属性指定为安装新版本的 CCS、并随附新的编译器版本。 我无法解释他们最初的工作原因、但现在我对该计划的所有版本都在同一条船上、如上所述。

我想不出有什么问题。 但这以前是有效的。 我对此非常满意。

无论如何、下面是我设置该内容的方法(此代码出现在主程序的开头附近):

//Uint16 i_index;


    //
    // Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to 
    // default state: This function is found in the F2806x_SysCtrl.c file.
    //
    InitSysCtrl();

    //
    // Step 2. Select GPIO for the device or for the specific application:
    // This function is found in the F2806x_Gpio.c file.
    //
    //InitSciGpio(); // @@@ This will change significantly when added to InstaSpin code.
    InitScibGpio();
    //
    // Step 3. Initialize PIE vector table:
    // The PIE vector table is initialized with pointers to shell Interrupt
    // Service Routines (ISR).  The shell routines are found in 
    // F2806x_DefaultIsr.c. Insert user specific ISR code in the appropriate 
    // shell ISR routine in the DSP28_DefaultIsr.c file.
    //
    
    // Disable and clear all CPU interrupts
    //
    DINT;
    //IER = 0x0000;
    //IFR = 0x0000;
    //
    // Initialize Pie Control Registers To Default State:
    // This function is found in the F2806x_PieCtrl.c file.
    //
    InitPieCtrl();  // Not needed right now. May resurrect.
    //
    // Initialize the PIE Vector Table To a Known State:
    // This function is found in F2806x_PieVect.c.
    // This function populates the PIE vector table with pointers
    // to the shell ISR functions found in F2806x_DefaultIsr.c.
    //

    InitPieVectTable();
    //
    // Enable CPU and PIE interrupts
    // This function is found in the F2806x_PieCtrl.c file.
    //

    EnableInterrupts();

    InitArrays(); // Set all array contents to zero.

    //
    // Step 4. Initialize all the Device Peripherals to a known state:
    // This function is found in F2806x_InitPeripherals.c
    //
    //InitPeripherals(); skip this for now...
    // Note: Autobaud lock is not required.
    //
    // Step 5. User specific functions, Reassign vectors (optional), 
    // Enable Interrupts:
    //
    LoopCount = 0;
    scib_fifo_init();	   // Initialize the SCI FIFO
    scib_loop_init();  // Initialize SCI for digital loop back

实际上、中断并不是用来提供一个标志、让我知道何时接收到数据。

下面是 SCIb 的设置(在 InitScibGpio 中):

// InitScibGpio - 
//
void
InitScibGpio()
{
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled disabled by the user.
    // This will enable the pullups for the specified pins.
    //
    
    GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; // Enable pull-up for GPIO23 (SCIRXDB)
    
    GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pull-up for GPIO22 (SCITXDB)
    
    //
    // Set qualification for selected pins to asynch only
    // Inputs are synchronized to SYSCLKOUT by default.
    // This will select asynch (no qualification) for the selected pins.
    //
    
    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;  // Asynch input GPIO23 (SCIRXDB)
   
    //
    // Configure SCI-B pins using GPIO regs
    // This specifies which of the possible GPIO pins will be SCI functional 
    // pins.
    // 
    
    // Configure GPIO23 for SCIRXDB operation
    //
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3;
    //

    // Configure GPIO22 for SCITXDB operation
    //
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;

    EDIS;
}

下面是 SCIb 的初始化:

void
scib_loop_init()
// *************************************************************************************************
// * Procedure Name: scib_loop_init
// * Purpose:   Initialize Serial Comm Interface B.
// *            Test 1,SCIB  DLB, 8-bit word, baud rate 0x0017 (115.2k), No loopback,
// *            default, 1 STOP bit, no parity
// *            Tx (GPIO22) is pin 98 on TMS320
// *            Rx (GPIO23) is pin 2 on TMS320
// * Date created: 10/01/2021
// * By: DDR
// *************************************************************************************************
{
    //
    // Note: Clocks were turned on to the SCIB peripheral
    // in the InitSysCtrl() function
    //
    // 1 stop bit, No loopback, No parity,8 char bits, async mode,
    // idle-line protocol
    ScibRegs.SCICCR.all =0x0007;
    //
    // enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    ScibRegs.SCICTL1.all =0x0003; // Enable SCITXD & SCIRXD. Disable every other feature, for now...
    ScibRegs.SCICTL2.all =0x0003; // Enable RXRDY/BRKDT & Enable TXRDY interrupts.
    ScibRegs.SCICTL2.bit.TXINTENA = 0; // Disable Transmit Interrupt, for now..
    ScibRegs.SCICTL2.bit.RXBKINTENA = 0; //Disable  Receiver-buffer break
    ScibRegs.SCIHBAUD    =0x0000;
    ScibRegs.SCILBAUD    =0x0017; // Set BAUD at 115.2k (was 0x0017, but not catching the STOP bit)
    ScibRegs.SCICCR.bit.LOOPBKENA = 0; // Disable loop back
    ScibRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
} // End scib_loop_init

下面是 FIFO 初始化:

void
scib_fifo_init()
// *************************************************************************************************
// * Procedure Name: scib_fifo_init
// * Purpose: Initialize FIFOs. See comments below for further explanation.
// * Date created: 10/01/2021
// * By: DDR
// *************************************************************************************************
{
    ScibRegs.SCIFFTX.all=0xE040; // Enable Tx FIFO with Enhancements. Empty FIFO. Clear Interrupt Flag.
    ScibRegs.SCIFFRX.all=0x2044; // Enable Rx FIFO. Clear FIFO Interrupt.
                                 // Rx Interrupt generated when # bytes >= 1.
    ScibRegs.SCIFFCT.all=0x0;    // AutoBAUD disabled. BAUD set manually at 115.2k in "scib_loop_init", above. Delay = 0.
} // End scib_fifo_init

希望您可以在上面提供的代码中找到一些内容。 如果您愿意、我可以向您发送整个项目。

谢谢、

Dave

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

    您好、Dave、

    您是否能够从 C2000Ware 中运行示例并在 RX/TX 引脚上获取输出? 我建议安装最新版本的 CCS 和 C2000Ware、以防止编译器或链接器出现任何问题。 这可能是调试中的第1步、以确保 sci 正常工作。  

    此致、

    Marlyn

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

    您好、Marlyn、

    我有 CCS 和 C2000Ware 的最新版本(除非在过去几天内更新过)、如我在上面所述。 这就是问题开始的时候。

    我可以运行程序的旧版本、SCI 正常工作。 加载时会出现一般错误消息。 当我查看"Problems"选项卡时、它显示:

    错误-->在路径中找不到程序"make"

    警告-->它列出了几个无效的项目路径:

               最后一条警告是: "此工程是使用当前未安装的编译器版本创建的- 20.2.1.LTS。 另一个版本           在构建过程中使用- 22.6.0.LTS。"

    它允许我加载它、并在出现错误/警告时运行它。 此程序起作用。 SCI 发送和接收。

     但是、在我尝试修复这些错误和警告后、SCI 会在上一帖子中显示我上面列出的症状。

    以下是这些尝试的情况:-

    在"Properties"对话框中、我将构建命令从"make"更改为"${CCS_UTILS_DIR}/BIN/gmake (不允许我选中"Use default build command"复选框)。

    它为我提供了相同的错误。 同样、当我搜索 gmake 的绝对位置并在编译命令文本框中输入它时。

    然后、消息为:"Program C:\ti\ccs1200\ccs\utils\bin.gmake 未在路径中找到。"

    因此、我更改了策略并将"属性/常规"中的编译器版本更新为 TI v22.6.0.LTS。

    然后出现加载程序错误(下面的屏幕截图):

    Scia 不是我正在使用的通信接口(我尝试使用 Scib)、因此我打开.cproject 文件并更改了所有对 Scib 的引用。

    所做的就是将.out 文件的文件名更改为"...Scib...out"。 相同的错误、相同的弹出消息、不同的文件。

    不过、此时、它允许我使用默认编译命令、并且"属性"页面的显示方式要多得多。

    我尝试更改编译器标志、在其中放置一些包含路径、认为编译器只是缺少一些支持文件的路径。

    对链接器标志执行了类似的操作。 错误现在是"无法打开源文件'all'。" 因此、在 Properties/Build/C2000 Compiler/Performance Advisor 下、我选择了"None"。

    上述操作清除了我看到的错误和警告、但现在 CLI 显示了我在原始帖子中讨论的相同问题。

    我所做的唯一改动是在这个职位上讨论的那些改动(11/23/22)。 我没有更改串行通信接口的设置或用法。 它在引用旧编译器的工程中工作。 当我显式调用新编译器时、它不起作用。

    我可以在"属性"对话框中为您提供编译器标志和链接器标志的前后屏幕截图。 如果您愿意、我可以附加整个项目或任何其他内容。

    谢谢、

    Dave Reagan

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

    Dave、

    除了 sci 代码之外、您的代码中还有其他功能吗? 由于导入旧工程会给您带来问题、您能否获取以前为您工作的代码并将其复制到 C2000Ware 示例中并运行它? 我想看看您是否可以手动更改项目属性。 另一个建议是使用与最新 C2000Ware 工程之一相同的编译器和链接器来设置工程。  

    此致、

    Marlyn

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

    您好、Marlyn、

    从某种意义上讲、这都是这个项目中的 sci 代码。 我计划在开始工作后将其与电机控制代码合并。 与转差协议以及我正在发送和接收的特定数据相关的许多功能都超出了 C2000Ware 示例的覆盖范围。 我想我可以将所有这些内容添加到示例项目中。 使用 C2000Ware SCI 示例时遇到的问题是、在我使用 SCIb 时、它们都设置为使用 SCIa。 专用于 SCIa 的微控制器上的引脚目前正在用于其他用途。 我花了一段时间将所有内容切换到 SCIb。 我不记得我要做的所有事情,我害怕去其他的兔子洞。 不过、我会尝试一下。

    在答复的第二部分中、您是否建议我打开相关的 C2000Ware 工程之一、删除所有代码并将代码粘贴到其中? 我问这个问题、因为如果建议是以面对面的价值提出的、我认为这是我已经做过的事情。 我使用的是最新编译器和 CCS 的最新版本。 不过、我不确定这是否意味着使用最新的链接器。

    谢谢、

    Dave

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

    您好、Marlyn、

    好的-我使用 了 scia_loopback 的副本、从 C2000Ware 的新安装开始、将所有内容整合到 SCIb、连接 Tx 和 Rx、它的工作方式与预期的一样;不管我发送了什么、我都会回来。

    然后、我复制了主程序的每一行、并将其粘贴到 scia_loopback 的现有副本上、该副本附带了几个头文件、对其进行了编译、没有错误。 有几个警告:

    无法解析归档文件-无论这意味着什么


    变量"rx_crc_array"是-我已经运行了无数次了。 不完整的"警告"比无用更糟糕。


    变量"temp_length"为  

    因此、它会编译、加载和运行。

    它执行与以前相同的操作。 我可以在代码中看到消息正在传入、但没有任何消息传出、也不能使用终端程序查看任何消息(再说一次、奇怪的是终端程序既没有看到 Tx 也没有看到 Rx)。

    然而,如果我把旧的程序引入,没有掺假,没有试图把它放在这个新的框架内,它就可以运行。

    谢谢、

    Dave

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

    您好、Dave、

    [引用 userid="294039" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1167496/tms320f28069m-communications-code-using-scib-that-used-to-work-with-a-previous-version-of-ccs-a-previous-compiler-no-longer-works/4395078 #4395078"]好的-我使用 了 scia_loopback 的副本、从 C2000Ware 的新安装开始、将所有内容切换至 SCIb、连接了 Tx 和 Rx、并且工作正常;无论我发送了什么、我都会返回。

    只是为了澄清-以上内容按 预期工作

    [引用 userid="294039" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1167496/tms320f28069m-communications-code-using-scib-that-used-to-work-with-a-previous-version-of-ccs-a-previous-compiler-no-longer-works/4395078 #4395078">然后我复制了主程序的每一行内容、并将其粘贴到 scia_loopback 的现有副本上、并附带了几个头文件、对其进行了编译、没有错误。 有几个警告:

    而这不是。

    是这样吗?

     上述工作场景和非工作场景是否都是使用相同版本的 CCS 和编译器构建的?

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

    您好 Ki、

    您的评估是正确的-第一个有效、第二个无效。

    是的-它们都是使用 CCS 12.1.0.00007和编译器版本22.6.0.LTS 构建的

    谢谢、

    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="294039" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1167496/tms320f28069m-communications-code-using-scib-that-used-to-work-with-a-previous-version-of-ccs-a-previous-compiler-no-longer-works/4396375 #4396375"]是-它们都是使用 CCS 12.1.0.00007和编译器版本22.6.0.LTS[/ quot]构建的

    感谢您的确认。 该问题显然不是特定于当时的工具版本。

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

    您好、Dave、

    [引用 userid="294039" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1167496/tms320f28069m-communications-code-using-scib-that-used-to-work-with-a-previous-version-of-ccs-a-previous-compiler-no-longer-works/4395078 #4395078"]然后我复制了主程序的每一行,并将其粘贴到 scia_loopback 的现有副本上,并附带了几个头文件,对其进行了编译,没有错误。

    当您复制主程序时、您是否一起完成了? 我建议一次添加部分、并检查问题可能是什么?  

    我不相信我们对软件做了任何会导致您的程序不再工作的更改。 我还会研究项目属性、并确保它们在旧的工作程序和新程序之间是相同的。  

    此致、

    Marlyn

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

    您好、Marlyn、

    我已决定为此使用本地 Motorware 通信子例程(我甚至不知道它们存在)。 因此、我暂时放弃了这条查询线。 不过、感谢您的帮助!

    此致、

    Dave