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.

[参考译文] TMS320F28P659DK-Q1:适用于 TMS320F28P659DK-Q1 的 Linux DCAN 编程器

Guru**** 2576215 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1568401/tms320f28p659dk-q1-linux-dcan-programmer-for-tms320f28p659dk-q1

器件型号:TMS320F28P659DK-Q1
主题:C2000WARE 中讨论的其他器件

工具/软件:

你(们)好

根据 TI 的规定进行 fimrare 升级、如果我可以从 windows 中 使用它

对于 Linux、我想开发定制的 dcan 编程器。

dcan_flash_programr.exe–d -k -A  [-q][-w][-v]

在我的系统中、我需要从 Linux 板发送 MCU 二进制文件。 那么、我应该遵循哪些步骤?

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

    您好:

    请让我将此主题转发给闪存内核专家、他们将能够在这方面进一步为您提供帮助。

    此致、

    马特

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

    您好:

    DCAN 主机编程器实现仅限于 Windows。 要将其移植到 Linux、您需要切换到 Linux 版本的 PCAN 库(可在 PEAK PCAN 网站上找到)、并将仅限 Windows 的 I/O 函数调用替换为 Linux 等效函数。

    此致、

    Alex

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

    您好 Alex、

    在 Linux 板中、我们可以按如下方式实现固件升级吗?

    1. 将引导模式设置为 CAN 引导

      • 使用脚本将电路板配置为通过 CAN 进行引导。(因为我们的 Linux 板可以更改 MCU 的引导模式)

    2. 发送闪存内核和应用程序

      • 运行:

        ./dcan_linux_programmer flash_kernel.txt app.txt

      • 在这里、dcan_linux_programmer.c将:

        • flash_kernel.txt0x01以 50 万比特率通过具有 ID 的 CAN 发送(使用 Linux 套接字 CAN)

        • 等待 5 秒钟让 flash_kernel 启动

        • app.txt通过具有 ID 的 CAN 发送应用程序文件0x02

    3. 切换到闪存引导和复位

      • 将引导模式更改回闪存引导并复位电路板以运行新编程的应用程序。

    问题: 可以使用相同的闪存内核(来自 C2000Ware_5_04_00_00/utilities/flash_programmers/dcan_flash_programmer/dcan_flash_programmer/flash_kernel_ex5_dcan_flash_kernel.txt)

    用于这种基于 Linux 的方案?

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

    您好:

    您将需要编译项目并生成一个新的.txt 文件。  C2000 微控制器的 CAN 闪存编程(修订版 A) 和编程流程对此进行了介绍。 DCAN 闪存编程器的 F28P65x 示例代码可从 Ware_Root driverlib/f28p65x/examples/c28x_dual/flash_kernel/导入。

    您可能还需要调整 CAN 设置以匹配主机的位时序和 ID。 可以在 ex_5_bootloader_can_timing.h 中进行这些更改

    此致、

    Alex

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

    你(们)好

    您需要编译工程并生成一个新的.txt 文件。

    1.关于应用固件(我们需要升级的新固件)、我将使用下面的等式编译并生成.txt 文件--(在 cmd 中将从 0x80000 开始、固件将刷写到 BANK0)

       hex2000 -boot -sci8 -a -o application.txt application.out


    2. 关于 CAN 闪存内核此外、如果需要更改、我们还可以使用 Ware_Root can/driverlib/f28p65x/examples/c28x_dual/flash_kernel/dcan_flash_kernel_f28p65x 中的代码

    希望它与引导 ROM CAN 引导加载程序兼容。

    在 SDK 中 、还提供了 flash_kernel_ex5_dcan_flash_kernel.txt、 我可以使用它吗? 它是否与引导 ROM 引导加载程序兼容???

    3.我的怀疑是关于 Linux 中 dcan_programr.exe 在 windows 中的替代方法。当引用 C2000Ware_5_04_00_00/utilities/flash_programmers/dcan_flash_programmer 中的代码时、下面的流程如所示

    •  flash_kernel.txt  0x01 以 50 万比特率通过具有 ID 的 CAN 发送(使用 Linux 套接字 CAN)

    • 等待 5 秒钟让 flash_kernel 启动

    •  app.txt 通过具有 ID 的 CAN 发送应用程序文件 0x02


      我是否可以使用套接字来替代 Linux??

      DCAN 闪存编程器的 F28P65x 示例代码可从 Ware_Root 中导入、driverlib/f28p65x/examples/c28x_dual/flash_kernel/.

      我认为它的 CAN 闪存内核、编程器是不同的吗?

    您可能还需要调整 CAN 设置以匹配主机的位时序和 ID。 可以在 ex_5_bootloader_can_timing.h 中进行这些更改。


    如果我更改闪存内核中的 CAN 时序、它会影响通信正常吗? CAN 设置应与引导 ROM 中的设置匹配?


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

    您好:

    我可以使用它吗? 它是否与引导 ROM 引导加载程序兼容?

    此内核文件不适用于 F28P65x 器件、您需要使用 C2000 Hex 实用程序 在您给出的编译后处理步骤生成正确的文件。

    我是否可以使用套接字来替代 Linux??

    我们仅支持 PEAK PCAN 驱动程序、但只要 CAN 帧的格式正确、此驱动程序就应该有效。

    我认为它的 CAN 闪存内核、程序员是不同的吗?

    正确、我在这里错了字、抱歉。 内核是在器件上运行的内容、而编程器是在主机上运行的内容。

    [引述 userid=“647997" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1568401/tms320f28p659dk-q1-linux-dcan-programr-for-tms320f28p659dk-q1/6042845
    如果我更改闪存内核中的 CAN 时序、它会影响通信正常吗? CAN 设置应与引导 ROM 中的设置匹配? [/报价]

    引导 ROM 期望 CAN 帧速率为 100kbps 、请参阅 TMS320F28P65x 实时微控制器技术参考手册(修订版 B) 第 4.7.8.2.5 和 4.8.1 节。 将闪存内核加载到 RAM 后、内核可以重新配置 CAN 模块以使用更高的比特率、在本例中为 500kbps。

    此致、

    Alex

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

    你(们)好

    MCU 通过 CAN 与 Linux 主机 systm 连接。


    要逐步进行调试、我已按照以下步骤操作:-  

    1.使电路板进入 CAN 引导引脚(引脚 84 = 0、引脚 72 = 1)
    2、在调试模式下使用 CCS 刷写到电路板上的 DCAN 闪存内核 I
    3.使程序员将运行在 Linux 主机系统(用于发送应用程序)使用套接字 can
    4.我使用给定的 commnad:- hex2000 -boot -sci8 -a -o application.txt application.out 制作的应用程序
    5.在  application.txt 中、第 3 个和第 4 个字节 替换为根据位时序寄存器值 (CAN_CALC_BTRREG) 的最终结果计算出的十六进制值

    PS: — 在 Linux 主机的闪存内核和编程器中也使用了 1Mbps 比特率

    输出得到:-
    1.没有任何东西在 candump
    2.编程器本身在 237 帧后卡住



    我的怀疑是  
    1. 是否可以在 CAN 引导模式下通过 CCS 使用 CPU_RAM 加载代码?
    2. 是否可以按照上述方法调试 dacn flahs 内核?

    3.有什么我需要照顾,使这项工作?

    注意: — 使用此方法逐个调试。如果可以,我已经计划在 BootROM 中使用 CAN 引导加载程序加载闪存内核。


    使用的编程器

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define APP_ID 0x1 //应用程序帧的 CAN ID
    #define BROKNK_SIZE 8 //每帧 8 个字节
    #define DEFAULT_DELAY_US 10000 //帧间间隔 10ms(根据需要调整)
    #define MAX_RETRY 3.

    int verbose = 1;

    //----- 打开 CAN 插座-----------
    int open_can_socket (const char *ifname){
    内部袜子;
    结构 ifreq ifr;
    结构 sockaddr_can addr;

    SOCK = SOCKET (PF_CAN、SOCK_RAW、CAN_RAW);
    if (sock < 0){ perror(“socket")“);return –1;}

    strcpy (ifr.ifr_name、ifname);
    if (ioctl (sock、SIOCGIFINDEX、&IFR)< 0){ perror(“SIOCGIFINDEX “);Close (sock);return –1;}

    addr.can_family = AF_CAN;
    addr.can_ifindex = IFR.IFR_ifIndex;

    if (bind (sock、(struct sockaddr *)&addr、sizeof (addr))< 0){perror(“bind")“);close (sock);return –1;}

    返回袜子;
    }

    //----- 重试发送一个 CAN 帧-----------
    int send_can_frame (int sock、u_int32_t can_id、u_int8_t *data、u_int8_t len、int frame_num){
    结构 can_frame;
    如果 (len > 8) len = 8;

    frame.can_id = can_id;
    frame.can_dlc = len;
    memcpy (frame.data、data、len);

    if (verbose){
    printf(“Frame %d -> CAN ID:0x%X、Data:“、frame_num、can_id);
    对于 (int i = 0;i < len;i++) printf(“%02x “、data[i]);
    printf(“\n")“);
    }

    INT RETRY = 0、nbytes;
    而 (RETRY < MAX_RETRY){
    nbytes =写入 (sock、&frame、sizeof (frame));
    if (nbytes == sizeof (frame)) 返回 0;
    perror(“CAN 写入失败、重试“);
    uleep(1000);
    重试++;
    }
    返回–1;
    }

    //----- 通过 CAN 发送文件------------
    int send_file_over_can (int sock、const char *文件名、u_int32_t can_id){
    文件*fp = fopen(文件名,“rb")“);
    if(!FP){ perror(“fopen");“;return –1;}

    U_INT8_t buffer[LINK_SIZE];
    size_t bytesRead;
    INT FRAME_COUNT = 0;

    while ((bytesRead = fread (buffer、1、chunk_size、FP))> 0){
    for (size_t i = bytesRead;i < Block_size;i++) buffer[i]= 0xFF;//填充最后一个帧
    FRAME_COUNT++;

    if (send_can_frame (sock、can_id、buffer、chunk_size、frame_count)< 0){
    fclose (fp);
    返回–1;
    }
    uSleep (default_delay_US);
    }

    fclose (fp);
    printf(“发送的总帧数:%d\n“、frame_count);
    返回 0;
    }

    int main (int argc、char *argv[]){
    如果 (argc !=3){
    fprintf (stderr、“Usage:%s \n“、argv[0]);
    返回 1;
    }

    const char *app_file = argv[1];
    const char *can_if = argv[2];

    printf(“将 CAN 接口%s 设置为 500 Kbps \n“、can_if);
    字符 cmd[128];
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s down“、can_if);system (cmd);
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s type can bitrate 500000“、can_if);system (cmd);
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s up“、can_if);system (cmd);

    INT sock = open_can_socket (can_if);
    如果 (SOCK < 0) 返回 1;

    printf(“正在发送应用程序固件:%s\n“、app_file);
    if (send_file_over_can (sock、app_file、app_ID)< 0){
    fprintf (stderr、“发送应用程序文件时出错\n“);
    Close (sock);return 1;
    }

    printf(“应用程序已成功发送!\n“);
    关闭(袜子);
    返回 0;
    }



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

    你(们)好

    MCU 通过 CAN 与 Linux 主机 systm 连接。


    要逐步进行调试、我已按照以下步骤操作:-  

    1.使电路板进入 CAN 引导引脚(引脚 84 = 0、引脚 72 = 1)
    2、在调试模式下使用 CCS 刷写到电路板上的 DCAN 闪存内核 I
    3.使程序员将运行在 Linux 主机系统(用于发送应用程序)使用套接字 can
    4.我使用给定的 commnad:- hex2000 -boot -sci8 -a -o application.txt application.out 制作的应用程序
    5.在  application.txt 中、第 3 个和第 4 个字节 替换为根据位时序寄存器值 (CAN_CALC_BTRREG) 的最终结果计算出的十六进制值

    PS: — 在 Linux 主机的闪存内核和编程器中也使用了 1Mbps 比特率

    输出得到:-
    1.没有任何东西在 candump
    2.编程器本身在 237 帧后卡住



    我的怀疑是  
    1.是否可以在 CAN 引导模式下通过 CCS 使用 CPU_RAM 加载代码?
    2.是否可以用上述方法调试 dacn flahs 内核?

    3.在这种情况下,在正常的 CAN 闪存编程方法中,我应该在编程器(Linux 主机)端使用什么 CAN ID 和比特率?
    现在、我使用的是 CAN ID = 0x01 和比特率 1Mbps。

    如果使用 bootROM 加载闪存内核 (CAN ID = 0x01、比特率为 100kbps)。

    3.有什么我需要照顾,使这项工作?

    注意: — 使用此方法逐个调试。如果可以,我已经计划在 BootROM 中使用 CAN 引导加载程序加载闪存内核。


    Linux 主机中使用的编程器

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define APP_ID 0x1 //应用程序帧的 CAN ID
    #define BROKNK_SIZE 8 //每帧 8 个字节
    #define DEFAULT_DELAY_US 10000 //帧间间隔 10ms(根据需要调整)
    #define MAX_RETRY 3.

    int verbose = 1;

    //----- 打开 CAN 插座-----------
    int open_can_socket (const char *ifname){
    内部袜子;
    结构 ifreq ifr;
    结构 sockaddr_can addr;

    SOCK = SOCKET (PF_CAN、SOCK_RAW、CAN_RAW);
    if (sock < 0){ perror(“socket")“);return –1;}

    strcpy (ifr.ifr_name、ifname);
    if (ioctl (sock、SIOCGIFINDEX、&IFR)< 0){ perror(“SIOCGIFINDEX “);Close (sock);return –1;}

    addr.can_family = AF_CAN;
    addr.can_ifindex = IFR.IFR_ifIndex;

    if (bind (sock、(struct sockaddr *)&addr、sizeof (addr))< 0){perror(“bind")“);close (sock);return –1;}

    返回袜子;
    }

    //----- 重试发送一个 CAN 帧-----------
    int send_can_frame (int sock、u_int32_t can_id、u_int8_t *data、u_int8_t len、int frame_num){
    结构 can_frame;
    如果 (len > 8) len = 8;

    frame.can_id = can_id;
    frame.can_dlc = len;
    memcpy (frame.data、data、len);

    if (verbose){
    printf(“Frame %d -> CAN ID:0x%X、Data:“、frame_num、can_id);
    对于 (int i = 0;i < len;i++) printf(“%02x “、data[i]);
    printf(“\n")“);
    }

    INT RETRY = 0、nbytes;
    而 (RETRY < MAX_RETRY){
    nbytes =写入 (sock、&frame、sizeof (frame));
    if (nbytes == sizeof (frame)) 返回 0;
    perror(“CAN 写入失败、重试“);
    uleep(1000);
    重试++;
    }
    返回–1;
    }

    //----- 通过 CAN 发送文件------------
    int send_file_over_can (int sock、const char *文件名、u_int32_t can_id){
    文件*fp = fopen(文件名,“rb")“);
    if(!FP){ perror(“fopen");“;return –1;}

    U_INT8_t buffer[LINK_SIZE];
    size_t bytesRead;
    INT FRAME_COUNT = 0;

    while ((bytesRead = fread (buffer、1、chunk_size、FP))> 0){
    for (size_t i = bytesRead;i < Block_size;i++) buffer[i]= 0xFF;//填充最后一个帧
    FRAME_COUNT++;

    if (send_can_frame (sock、can_id、buffer、chunk_size、frame_count)< 0){
    fclose (fp);
    返回–1;
    }
    uSleep (default_delay_US);
    }

    fclose (fp);
    printf(“发送的总帧数:%d\n“、frame_count);
    返回 0;
    }

    int main (int argc、char *argv[]){
    如果 (argc !=3){
    fprintf (stderr、“Usage:%s \n“、argv[0]);
    返回 1;
    }

    const char *app_file = argv[1];
    const char *can_if = argv[2];

    printf(“将 CAN 接口%s 设置为 500 Kbps \n“、can_if);
    字符 cmd[128];
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s down“、can_if);system (cmd);
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s type can bitrate 500000“、can_if);system (cmd);
    snprintf (cmd、sizeof (cmd)、“sudo ip link set %s up“、can_if);system (cmd);

    INT sock = open_can_socket (can_if);
    如果 (SOCK < 0) 返回 1;

    printf(“正在发送应用程序固件:%s\n“、app_file);
    if (send_file_over_can (sock、app_file、app_ID)< 0){
    fprintf (stderr、“发送应用程序文件时出错\n“);
    Close (sock);return 1;
    }

    printf(“应用程序已成功发送!\n“);
    关闭(袜子);
    返回 0;
    }



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

    您好:

    是否可以在 CAN 引导模式下使用 CPU_RAM 通过 CCS 加载代码?

    是的、内核可以通过 CCS 编译并加载到 RAM 中。 您还可以通过引导 ROM 加载符号、然后通过 CCS 连接并加载符号。

    2.是否可以 按照上述方法调试 DCAN 闪存内核?

    是的、可通过 CCS 中的 JTAG 加载内核来调试内核。

    3.在这种情况下,在正常的 CAN 闪存编程方法中,我应该在编程器(Linux 主机)端使用什么 CAN ID 和比特率?
    现在、我使用的是 CAN ID = 0x01 和比特率 1Mbps。 I
    f 使用引导 ROM 加载闪存内核 (CAN ID = 0x01、比特率为 100kbps)。

    引导 ROM 使用 100kbps 比特率、ID = 0x1、但您的应用程序代码可以重新配置此功能、以使用任何 ID 和比特率。 因此、您必须将内核以 100kbps 的速率发送到引导 ROM、然后以 1mps 的速率发送应用。

    4.有什么我需要照顾,使这项工作?

    引导 ROM 期望以特定格式在每个 CAN 帧中发送两个字节。   有关更多信息、请参阅 TMS320F28P65x 实时微控制器技术参考手册(修订版 B)第 4.7.8.2.5 节。

    C2000 微控制器的 CAN 闪存编程(修订版 A) 也是一个有用的参考

    此致、

    Alex