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.

[参考译文] 编译器/TMS320F28335:TMS320F28335

Guru**** 2589280 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/663214/compiler-tms320f28335-tms320f28335

器件型号:TMS320F28335

工具/软件:TI C/C++编译器

 我正在尝试使用 TMS320F 28335测试 CAN Tx 和 Rx 消息。

我面临以下代码的问题、并附上我的 main.c

为什么始终在以下模式中控制器

 操作
       {
           ECanaShady.canes.all = ECanaRegs.canes.all;
       } while (ECanaShading.canes.bit.CCE!= 1);      //等待 CCE 位被置位。

我签入了 CANES 寄存器值  


/*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
        头文件
==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
#include
#include "IQmathLib.h"        /* IQmath 库的 include 标头*
//#include "DSP2833x_Device.h"    // DSP2833x 头文件包含文件
//#include "DSP2833x_Device.h"    // DSP2833x 头文件包含文件
//#include "DSP2833x_examples.h"
#include "DSP2833x_Device.h"    // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"
//#include "pmci.h"
//#include "parameter.h"
//#include "build.h"
//#include "DSP2833x_GlobalPrototypes.h"//用于设置 SCI、SPI 和 XF

void mailbox_check (int32 T1、int32 T2、int32 T3);
void mailbox_read (int16 i);

//此示例的全局变量
uint32 错误计数;
uint32 MessageReceivedCount;

UINT32 TestMbox1 = 0;
UINT32 TestMbox2 = 0;
uint32 TestMbox3 = 0;


/*int main (空)

   //InitECana();
   Hwi_CAN_init();
  // CANtransmit ();
   //CAN_receive();
 返回0;

*


void main (void)

   uint16 i、j;

// eCAN 控制寄存器要求使用32位进行读/写访问。  因此、我们
//将为此示例创建一组影子寄存器。  阴影
//将使用寄存器来确保访问是32位而不是16位。
  struct eCAN-regs ECanaShadow;

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP281x_SYSCTRL.c 文件中。
  InitSysCtrl();

//步骤2. 初始化 GPIO:
//此示例函数位于 DSP281x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
 //InitGpio(); //针对此示例跳过

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
  Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP281x_PIECTRL.c 文件中。
//  InitPieCtrl();//已跳过此示例

//禁用 CPU 中断并清除所有 CPU 中断标志:
  IER = 0x0000;
  IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。  这对于调试很有用。
//可以在 DSP281x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP281x_PieVect.c 中找到
//  InitPieVectTable();   //针对此示例跳过

//步骤4. 初始化所有器件外设:
//此函数位于 DSP281x_InitPeripherals.c 中
// InitPeripherals ();//此示例不需要

//步骤5. 特定于用户的代码

   MessageReceivedCount = 0;
   错误计数= 0;

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1; //   启用系统时钟到 eCAN-A

   GpioCtrlRegs.GPAPUD.ALL = 0x0000;     //上拉使能 GPIO0-GPIO31

   InitECan();    //初始化 eCAN 模块

   //邮件可以一次写入16位或32位
   //写入发送邮箱 MBOX0 - 15的 MSGID 字段
   ECANaMboxs.MBOX0.MSGID.ALL = 0x9555AAA0;
   ECANaMboxs.MBOX1.MSGID.ALL = 0x9555AAA1;
   ECANaMboxs.MBOX2.MSGID.ALL = 0x9555AAA2;
   ECANaMboxs.MBOX3.MSGID.ALL = 0x9555AAA3;
   ECANaMboxs.MBOX4.MSGID.ALL = 0x9555AAA4;
   ECANaMboxs.MBOX5.MSGID.ALL = 0x9555AAA5;
   ECANaMboxs.MBOX6.MSGID.ALL = 0x9555AAA6;
   ECANaMboxs.MBOX7.MSGID.ALL = 0x9555AAA7;
   ECANaMboxs.MBOX8.MSGID.ALL = 0x9555AAA8;
   ECANaMboxs.MBOX9.MSGID.ALL = 0x9555AAA9;
   ECANaMboxs.MBOX10.MSGID.ALL = 0x9555AAAA;
   ECANaMboxs.MBOX11.MSGID.ALL = 0x9555AAAB;
   ECANaMboxs.MBOX12.MSGID.ALL = 0x9555AAAC;
   ECANaMboxs.MBOX13.MSGID.ALL = 0x9555AAAD;
   ECANaMboxs.MBOX14.MSGID.ALL = 0x9555AAAE;
   ECANaMboxs.MBOX15.MSGID.ALL = 0x9555AAAF;


   //写入接收邮箱 MBOX16 - 31的 MSGID 字段
   ECANaMboxs.MBOX16.MSGID.ALL = 0x9555BBB0;
   ECANaMboxs.MBOX17.MSGID.ALL = 0x9555BBB1;
   ECANaMboxs.MBOX18.MSGID.ALL = 0x9555BBB2;
   ECANaMboxs.MBOX19.MSGID.ALL = 0x9555BBB3;
   ECANaMboxs.MBOX20.MSGID.ALL = 0x9555BBB4;
   ECANaMboxs.MBOX21.MSGID.ALL = 0x9555AAA5;
   ECANaMboxs.MBOX22.MSGID.ALL = 0x9555AAA6;
   ECANaMboxs.MBOX23.MSGID.ALL = 0x9555AAA7;
   ECANaMboxs.MBOX24.MSGID.ALL = 0x9555AAA8;
   ECANaMboxs.MBOX25.MSGID.ALL = 0x9555AAA9;
   ECANaMboxs.MBOX26.MSGID.ALL = 0x9555AAAA;
   ECANaMboxs.MBOX27.MSGID.ALL = 0x9555AAAB;
   ECANaMboxs.MBOX28.MSGID.ALL = 0x9555AAAC;
   ECANaMboxs.MBOX29.MSGID.ALL = 0x9555AAAD;
   ECANaMboxs.MBOX30.MSGID.ALL = 0x9555AAAE;
   ECANaMboxs.MBOX31.MSGID.ALL = 0x9555AAAF;

   //将邮箱0-15配置为 Tx,将16-31配置为 Rx
   //因为该写入是对整个寄存器(而不是位)的
   //字段)不需要影子寄存器。
   ECANaRegs.CANMD.ALL = 0xFFFFFF0000;

   //启用所有邮箱*/
   //因为该写入是对整个寄存器(而不是位)的
   //字段)不需要影子寄存器。
   ECANaRegs.CANME.ALL = 0xFFFFFFFF;
   //ECanaRegs.CANME.ALL = 0x00010001;

   //指定将发送8位
   ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX1.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX2.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX3.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX4.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX5.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX6.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX7.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX8.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX9.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX10.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX11.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX12.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX13.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX14.MSGCTRL.bit.DLC = 8;
   ECANaMboxs.MBOX15.MSGCTRL.bit.DLC = 8;

   //写入 MBOX0 - 15的邮箱 RAM 字段
   //ECanaMboxs.MBOX0.MDL.all = 0x9555AAA0;
   //ECANaMboxs.MBOX0.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX0.MDL.ALL = 0x11223344;
   ECANaMboxs.MBOX0.MDH.ALL = 0x55667788;

   ECANaMboxs.MBOX1.MDL.ALL = 0x9555AAA1;
   ECANaMboxs.MBOX1.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX2.MDL.ALL = 0x9555AAA2;
   ECANaMboxs.MBOX2.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX3.MDL.ALL = 0x9555AAA3;
   ECANaMboxs.MBOX3.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX4.MDL.ALL = 0x9555AAA4;
   ECANaMboxs.MBOX4.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX5.MDL.ALL = 0x9555AAA5;
   ECANaMboxs.MBOX5.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX6.MDL.ALL = 0x9555AAA6;
   ECANaMboxs.MBOX6.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX7.MDL.ALL = 0x9555AAA7;
   ECANaMboxs.MBOX7.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX8.MDL.ALL = 0x9555AAA8;
   ECANaMboxs.MBOX8.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX9.MDL.ALL = 0x9555AAA9;
   ECANaMboxs.MBOX9.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX10.MDL.ALL = 0x9555AAAA;
   ECANaMboxs.MBOX10.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX11.MDL.ALL = 0x9555AAAB;
   ECANaMboxs.MBOX11.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX12.MDL.ALL = 0x9555AAAC;
   ECANaMboxs.MBOX12.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX13.MDL.ALL = 0x9555AAAD;
   ECANaMboxs.MBOX13.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX14.MDL.ALL = 0x9555AAAE;
   ECANaMboxs.MBOX14.MDH.ALL = 0x89ABCDEF;

   ECANaMboxs.MBOX15.MDL.ALL = 0x9555AAAF;
   ECANaMboxs.MBOX15.MDH.ALL = 0x89ABCDEF;

   //将 eCAN 配置为自检模式
   //启用 eCAN 的增强功能。

   ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
   ECANaShady.CANMC.bit.STM = 1;   //将 CAN 配置为自检模式
   ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;


   /*为 eCANA BaudRates 配置位时序参数*/
       ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
       ECanaShady.CANMC.bit.CCR = 1;           //设置 CCR = 1
       ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

       ECanaShady.canes.all = ECanaRegs.canes.all;

       操作
       {
           ECanaShady.canes.all = ECanaRegs.canes.all;
       } while (ECanaShading.canes.bit.CCE!= 1);      //等待 CCE 位被置位。

       ECanaShady.CANBTC.ALL = 0;

                             DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_150MHz)// CPU_FRQ_150MHz
           /*针对所有150MHz SYSCLKOUT (75MHz CAN 时钟)的以下模块-缺省值。 比特率= 1Mbps
              请参阅文件末尾的注释*/
               ECANaShady.CANBTC.bit.BRPREG = 9;//对于1Mbps 为4;对于500Kbps 为9;对于250kbps 为19;对于125Kbps 为39;对于100Kbps 为49
               ECANaShady.CANBTC.bit.TSEG2REG = 2;
               ECANaShady.CANBTC.bit.TSEG1REG = 10;
       #endif
                             DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_100MHz)// CPU_FRQ_100MHz
       /*以下块仅用于100MHz SYSCLKOUT (50MHz CAN 时钟)。 比特率= 1Mbps
          请参阅文件末尾的注释*/
           ECANaShady.CANBTC.bit.BRPREG = 4;//对于1Mbps 为4;对于500Kbps 为9;对于250kbps 为19;对于125Kbps 为39;对于100Kbps 为49
           ECANaShady.CANBTC.bit.TSEG2REG = 1;
           ECANaShady.CANBTC.bit.TSEG1REG = 6;
       #endif


       ECanaShading.CANBTC.bit.SAM = 1;
       ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;

       ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
       ECanaShady.CANMC.bit.CCR = 0;           //设置 CCR = 0
       ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

       ECanaShady.canes.all = ECanaRegs.canes.all;

       操作
       {
          ECanaShady.canes.all = ECanaRegs.canes.all;
       } while (ECanaShading.canes.bit.CCE!= 0);      //等待 CCE 位 被清除。

//
   如果(1){//表示 CAN A

       //GpioCtrlRegs.GPADIR.bit.GPIO30 = 0; //0=输入、 1=输出
       //GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; //0=输入、 1=输出
       //GpioCtrlRegs.GPAQSEL2.ALL = 0x0000;   // GPIO16-GPIO31同步到 SYSCLKOUT
       //GpioCtrlRegs.GPAQSEL1.ALL = 0x05000000L;   //所有组 A GPIO 0-15均无资格认证
       //GpioCtrlRegs.GPAQSEL2.ALL = 0x00000000L;   //所有组 A GPIO 16-31均无限定条件
       GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;  //启用 GPIO30上的上拉
       GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0;  //启用 GPIO31上的上拉
       GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 3;//异步输入
       GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;//GPIO30:0=GPIO、1=CANRXA   2=rsvd      3=rsvd
       GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;//GPIO31:0=GPIO、1=CANTXA   2=rsvd      3=rsvd
      // GpioCtrlRegs.GPACTRL.ALL = 0x00003200L;   //对于所有组 A GPIO,QUALPRD = SYSCLKOUT

   }
   else{//用于 General Pugose IO
       GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;//GPIO30:0=GPIO、1=CANRXA   2=rsvd      3=rsvd
       GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;//GPIO31:0=GPIO、1=CANTXA   2=rsvd      3=rsvd
       GpioCtrlRegs.GPADIR.bit.GPIO30 = 0; //0 =输入、 1 =输出
       GpioCtrlRegs.GPADIR.bit.GPIO31 = 0; //0 =输入、 1 =输出
       GpioCtrlRegs.GPAQSEL2.ALL = 0x0000;   // GPIO16-GPIO31同步到 SYSCLKOUT

   };

   //GpioDataRegs.GPADD.bit.GPIO31 = 1;
   //GpioDataRegs.GPASET.bit.GPIO31 =1;
  // for (i=0;i<1000;i++){//delay
  // GpioDataRegs.GPADAT.bit.GPIO31 = 0;
   //GpioDataRegs.GPACLEAR.bit.GPIO30 = 1;

// 8.
   EDIS;

   //开始传输
   while (1)
   {
//********
     // GpioDataRegs.GPADAT.bit.GPIO31 = 1;
       //GpioDataRegs.GPASET.bit.GPIO31 =1;
      // for (i=0;i<1000;i++){//delay
      // GpioDataRegs.GPADAT.bit.GPIO31 = 0;
       //GpioDataRegs.GPACLEAR.bit.GPIO30 = 1;
//*********

      ECANaRegs.CANTRS.ALL = 0x0000FFFC; //为所有发送邮箱设置 TRS
      while (ECanaRegs.Canta.all!= 0x0000FFFC){} //等待所有 Tan 位被置位。
      ECanaRegs.Canta.all = 0x0000FFFC;  //清除所有 Tan
      MessageReceivedCount++;

      //从接收邮箱读取并开始检查数据*/
      对于(j=16;j<31;j++)        //读取并检查16个邮箱
      {
         mailbox_read (j);        //此 func 读取指定的邮箱数据
         Mailbox_check (TestMbox1、TestMbox2、TestMbox3);//检查接收到的数据
      }
   }

//此函数读取所示内容
//按邮箱号(MBXnbr)。
void mailbox_read (int16 MBXnbr)

  volatile struct MBOX *邮箱;
  邮箱=&ECanaMbboxs.MBOX0 + MBXnbr;
  TestMbox1 =邮箱->MDL.all;//= 0x9555AAAn (n 是 MBX 编号)
  TestMbox2 =邮箱->MDH.all;//= 0x89ABCDEF (常量)
  TestMbox3 =邮箱->MSGID.ALL;//= 0x9555BBBn (n 是 MBX 编号)

}//将 rcv MBX 的 MSGID 作为 MDL 数据进行传输。


void mailbox_check (int32 T1、int32 T2、int32 T3)

   if ((T1!= T3)||(T2!= 0x89ABCDEF))
   {
      错误计数++;
   }


//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

/*注意:
如281x 器件勘误表(SPRZ193)中所示、双读/双写应该是
用于访问邮箱 RAM 和 LAM/MOTO/MOTS 区域。 但请注意、是的
只有在访问邮箱 RAM 和 LAM/MOTO/MOTS 区域时、勘误表才适用
相同的时间。 头文件示例在自检模式下运行、不可能
一个争用。 因此、未实现该变通办法。 与之通信时的电压
另一个节点处于非自检模式)、必须包含该变通办法。
*

在这里、我要附加 CANES 寄存器的屏幕截图以及值

    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rambabu、
    所以、您会说代码卡在循环中、它在循环中检查 CCE 是否=1。 出于某种原因、CCE 位未被置位。 您能否"按原样"从 app.note SPRA876B 运行示例测试案例? 即不修改任何内容。 只需按原样运行测试用例、并让我知道您看到的内容。 app.note 示例已经在器件上进行了测试、因此我们至少可以消除软件问题。 此外、您在什么硬件平台上运行此测试用例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、

    感谢您的回复,但我在哪里可以找到我的 app.note SPRA876B,您能否提供链接。

    此致、
    RAM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘记提到 TMS320F28335硬件平台
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请在 www.ti.com 中搜索 SPRA876

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    app.note 中的代码示例适用于所有具有 eCAN 模块的28xx 器件。 这些示例在28335上进行了测试、因此您可以"按原样"运行它们。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、

    我正在 ti.web 站点中搜索 Spra 876B、但我找不到它。

    请提供链接。

    谢谢!

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

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

     你(们)好

    我搜索了,但找不到。

    请找到我搜索的屏幕截图。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将需要取出空间、只需搜索 SPRA876、也可以单击 Devin 提供的链接
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RAM、
    App.note 链接为 www.ti.com/.../spra876b.pdf

    通过“硬件平台”,我将介绍该板。 这是 TI controlCARD 还是您自己的设计?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、
    早上好、它自己的设计采用了 TMS320F28335控制器。

    谢谢!

    此致、
    RAM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、
    我找到了 spra876b.pdf,我正在查看它,今天我将告诉您一些时间,因为我可以使用示例代码的量。
    其自己的设计板、具有 TMS320F28335控制器。

    谢谢!

    此致、
    RAM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RAM、
    我在 app.note 中提供了一些调试提示。 请仔细阅读它们、查看是否有任何项目适用于您的情况。 我希望您有一个连接到 CAN 引脚的收发器。 如果您认为可以、请仅分享原理图的收发器部分。 即从 CANTX/CANRX 引脚一直到总线的连接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、

    感谢您提供信息。
    现在、我有了清晰的想法并解决了坎斯问题
    此致、
    RAM