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.

[参考译文] CCS/EK-TM4C1294XL:EK-TM4C1294XL CAN 引导加载程序

Guru**** 2608865 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/754673/ccs-ek-tm4c1294xl-ek-tm4c1294xl-can-boot-loader

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

我使用 EK-TM4C1294XL 套件来构建应用、我成功构建了该应用、但是、 现在我需要通过 CAN 总线刷写套件、因此我决定根据  TivaWareTm引导加载程序文档使用 TI 引导加载程序我更新了位于"ti\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c1294xl\boot_serial"的串行引导示例 、以使用 CAN 总线0而不是 UART、但我无法通过此总线传输或接收任何数据 。 下面显示了我在 bl_config.h 文件上应用的更新  

//
#define CAN_ENABLE_UPDATE

//

//
//要启用 GPIO 模块以配置 CAN0 Rx 管脚。 这将会
//是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
//名称(如 B)。 "x"的值应与"x"的值匹配
// CAN_RX_PORT。
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_RX_PERIPh SYSCTL_RCGC2_GPIOA

//
//
//用于配置 CAN0 Rx 管脚的 GPIO 端口。 这将是其中之一
// GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
// B)。 "x"的值应该与 CAN_RX_Periph 的"x"的值相匹配。
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_RX_PORT GPIO_PORTA_base

//
//
//与 CAN0 Rx 管脚共享的 GPIO 管脚。 这是一个介于0之间的值
//和7.
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_RX_PIN 0
#define CAN_RX_PIN_PCTL 7.
//
//
//要启用 GPIO 模块以配置 CAN0 Tx 引脚。 这将会
//是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
//名称(如 B)。 "x"的值应与"x"的值匹配
// CAN_TX_PORT。
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_TX_PERIPh SYSCTL_RCGC2_GPIOA

//
//
//用于配置 CAN0 Tx 引脚的 GPIO 端口。 这将是其中之一
// GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
// B)。 "x"的值应与 CAN_TX_Periph 的"x"的值匹配。
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_TX_PORT GPIO_PORTA_base

//
//
//与 CAN0 Tx 引脚共享的 GPIO 引脚。 这是一个介于0之间的值
//和7.
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_TX_PIN 1.
#define CAN_TX_PIN_PCTL 7.
//
//
// CAN 总线上使用的比特率。 这必须是20000、50000、125000、
// 250000、50000或1000000。 CAN 位速率必须小于或等于
//晶振频率除以8 (crystal_FREQ / 8)。
//
//取决于:CAN_ENABLE_UPDATE
//不包括:无
//要求:无
//
//
#define CAN_BIT_RATE 20000

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您采取了哪些措施来验证您的硬件? 您使用什么来提供 CAN 命令? 这被称为"可以更新应用程序"。 您是否在来自 CAN 更新应用程序的 CAN 总线线路上看到"LM_API_UPD_PINing"命令? 如果是、您是否从运行引导加载程序的器件获得了确认? 您是否获得了应答 LM_API_UPD_ping?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我们 使用 driverlib 来创建其他 CAN 节点"CAN 编程器"、这些函数具有我们应用于目标节点的相同位时序配置 CAN 编程器节点 向目标节点发送"LM_API_UPD_ping"命令、并等待来自目标节点的任何反馈"LM_API_UPD_ping"。方法是使用 USB 监控 CAN 总线以进行 CAN 解析器和 我们只接收从 CAN 编程器节点发送的"LM_API_UPD_PINing"命令、以测试与目标节点的通信状态;通过调试在目标节点上刷写的引导加载程序代码、我们在目标节点上没有收到任何数据、因此无法接收到该节点上的任何数据。

    我们按照以下步骤更新 bl_ca.c 文件中的 void UpdateerCAN (void)函数:我替换 ui32Cmd = PacketRead (g_pui8CommandBuffer、&ui32Bytes);将行替换为 ui32Cmd =0; 仅用于测试传输函数、在总线上不传输任何内容。

    等待您的支持!!!

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

    尊敬的 Bob:

    我们使用 driverlib.lib 构建了一个应用程序、通过 CAN 总线0发送和接收数据 、它运行正常、我们仍在调试通过 CAN 总线进行的固件更新、并应用以下内容  

    "我们在 基于 driverlib.lib 构建的 CAN 应用程序中调整函数、并在 串行引导示例中使用这些函数、但它不起作用"。

     之前应用之间的主推理是我们设置 主振荡器配置的方法。 在 CAN 应用中、我们使用流动函数   

    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
    
    ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、25000000); 

    但在串行引导加载程序中、我们可以使用以下代码  

    #ifdef crystal_FREQ
    #if defined (target_IS_TM4C129_RA0)|| \
    定义(TARGET_IS_TM4C129_RA1)|| \
    已定义(TARGET_IS_TM4C129_RA2)
    
    //
    //由于指定了晶振频率,因此启用主振荡器
    //并从它为处理器计时。 检查振荡器范围
    //必须设置,等待状态需要更新
    //
    if (crystal_FREQ >= 10000000)
    {
    HWREG (SYSCTL_MOSCCTL)|=(SYSCTL_MOSCCTL_OSCRNG);
    HWREG (SYSCTL_MOSCCTL)&=~(SYSCTL_MOSCCTL_PWRDN | SYSCTL_MOSCCTL_NOXTAL);
    }
    其他
    {
    HWREG (SYSCTL_MOSCCTL)&=~(SYSCTL_MOSCCTL_PWRDN | SYSCTL_MOSCCTL_NOXTAL);
    }
    
    //
    //等待振荡器稳定
    //
    延迟(524288);
    
    if (crystal_FREQ > 16000000)
    {
    HWREG (SYSCTL_MEMTIME0)=(SYSCTL_MEMTIME0_FBCHT_1_5 |(1 << SYSCTL_MEMTIME0_FWS_S)|
    SYSCTL_MEMTIME0_EBCHT_1_5 |(1 << SYSCTL_MEMTIME0_EWS_S)|
    SYSCTL_MEMTIME0_MB1);
    HWREG (SYSCTL_RSCLKCFG)=(SYSCTL_RSCLKCFG_MEMTIMEU | SYSCTL_RSCLKCFG_OSCSRC_MOSC);
    }
    其他
    {
    HWREG (SYSCTL_RSCLKCFG)=(SYSCTL_RSCLKCFG_OSCSRC_MOSC);
    }
    其他
    //
    //由于指定了晶振频率,因此启用主振荡器
    //并从它为处理器计时。
    //
    HWREG (SYSCTL_RCC)&=~(SYSCTL_RCC_MOSCDIS);
    
    //
    //主振荡器启动时的延迟。
    //
    延迟(524288);
    
    //
    //设置晶体频率并切换到主振荡器。
    //
    HWREG (SYSCTL_RCC)=((HWREG (SYSCTL_RCC)&
    ~(SYSCTL_RCC_XTAL_M | SYSCTL_RCC_OSCSRC_M)|
    XTAL_VALUE | SYSCTL_RCC_OSCSRC_MAIN);
    #endif
    #endif 

    您是否对使同一函数在我们使用 driverlib.lib 构建的应用程序中起作用而不使用 串行引导示例的原因有任何了解? 所附图像显示了 CAN0寄存器的值,我们注意到两种情况下的寄存器值相同。

    CAN_APP 寄存器值:

    serial_boot CAN0寄存器值:

      

    谢谢!!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、我不知道您为什么会看到不同的行为。 您没有提到 crystal_FREQ 的值。 是25000000吗? 此外、当您使用25MHz 晶体时、为什么使用 PLL 来获得25MHz 频率?