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.

[参考译文] TM4C1233H6PM:实例化 CAN0时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1127317/tm4c1233h6pm-trouble-instantiating-can0

器件型号:TM4C1233H6PM
主题中讨论的其他器件:TM4C123GH6PM

我一直在研究我们设计的 CCA 的新版本、该版本具有该板载微控制器、由于器件可用性、取代了 TM4C123GH6PM。  我们应用中的主要区别之一是、新的微控制器只有一条 CAN 总线 CAN0、而传统器件上有2条 CAN 总线。  我目前正在使用 TivaWare v2.2.0.295 -此版本支持新的 API 调用来解锁应用中所需的特殊引脚。

无论我如何尝试实例化和启用 CAN0、我都不会从示波器上的 Tx 引脚中获得任何值。  我每250ms 传输一次 CAN 消息。  中断处理也不起作用、因此我移除了收发器、以便可以直接从微控制器探测引脚。  起初、我怀疑在为端口 F 上的 CAN0所需的一个端口解锁特殊引脚时发生了某种错误。 但是、在检查 GPIO PORTF 的 SYSCTL 寄存器后、 我的结论是所有设置都确实正确-我只需在 Tx 引脚上获得3.3V 恒定输出。   

也可以在端口 B 和端口 E 上设置 CAN0、因此我进行了设置。  这些端口上的两组引脚都不是特殊引脚、因此任务明显更简单、但毫无用处。  我从相应端口上的 Tx 引脚获得相同的响应、恒定3.3V 输出。   

我尝试使用 API 调用和 DRM 调用来配置 CAN0、但结果相同。  我查找了微控制器的勘误表并读取了器件和芯片版本的 DID0寄存器、但没有看到任何迹象表明我的微处理器在 CAN0或 GPIO 配置方面存在任何问题(处理器是修订版 A1)。  我切换了示波器以确认结果、并检查了晶体振荡器配置。  由于在 Cortex CPU 上站立一条 CAN 总线从未如此具有挑战性、因此我有一点损失。  下面是一些备用端口(端口 F 和 B)上的 CAN0初始化代码:

针对我的 CCA 的常见初始化:

	ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_20MHZ);
	ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
	gSysTickPeriod = ROM_SysCtlClockGet(); // no idea what speed this will result in yet...

	// setup SysTick timer for 200 Hz interrupts
	ROM_SysTickPeriodSet(gSysTickPeriod / MAIN_LOOP_FREQ);

	// disable sleep mode on all peripherals being used
	ROM_SysCtlPeripheralClockGating(true);
	

端口 F 的实现

	// Must unlock and configure PF0 since it defaults to GPIO and is a special config pin (NMI)
      ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        
      ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);

      // use nominal API for non-special CAN pin
      ROM_GPIOPinConfigure(GPIO_PF3_CAN0TX);
      ROM_GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_3);
      
      // direct register programming required for special pin
      HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; // unlock pin
      HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = GPIO_PIN_0;
      HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; // unlock pin
      HWREG(GPIO_PORTF_BASE + GPIO_O_AFSEL) |= GPIO_PIN_0;
                
#if 0
      // using the ROM functions doesn't seem to be working for this
      ROM_GPIOPinConfigure(GPIO_PF0_CAN0RX);
      ROM_GPIOPinConfigure(GPIO_PF3_CAN0TX);
      ROM_GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3);
#else
      HWREG(GPIO_PORTF_BASE + GPIO_O_DEN) |= GPIO_PIN_0;
      HWREG(GPIO_PORTF_BASE + GPIO_O_PCTL) |= 3U;    // bit 3 of GPIOFPCTL is CAN0Rx
    
#endif

      // lock the registers
      HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
      HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x00;
      HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;

请注意、我在使用 API 调用为 CAN 配置端口 F 时遇到了一些问题、因此改用 DRM。

端口 B 配置

	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
	ROM_GPIOPinConfigure(GPIO_PB4_CAN0RX);
	ROM_GPIOPinConfigure(GPIO_PB5_CAN0TX);
	ROM_GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);

后续 CAN 总线初始化

    gCANbase = CAN0_BASE; // 0x40040000

	// Reset the state of the message objects and the CAN module.
	CANInit(gCANbase);

	// Configure the controller for 1 Mbit operation.
#if 1
	uint32_t temp = CANBitRateSet(gCANbase, gSysTickPeriod, 1000000);
#else
	tCANBitClkParms CANBitClk;
	CANBitClk.ui32SyncPropPhase1Seg = 5;
	CANBitClk.ui32Phase2Seg = 2;
	CANBitClk.ui32QuantumPrescaler = 5;
	CANBitClk.ui32SJW = 2;
	CANBitTimingSet(gCANbase, &CANBitClk);
#endif

	// Enable interrupts for the CAN in the NVIC.
	IntEnable(gCANbase == CAN0_BASE ? INT_CAN0 : INT_CAN1);

	// Enable interrups from CAN controller.
	CANIntEnable(gCANbase, CAN_INT_MASTER | CAN_INT_STATUS);

	InitCANMessages();

	// enable automatic retransmission behavior
	CANRetrySet(gCANbase, TRUE);

	// Take the CAN0 device out of INIT state.
	CANEnable(gCANbase);

请注意、所有这些代码在 CAN1上的传统 TM4C123GH6PM 器件上都可以正常工作。   

感谢您的观看。

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

    您好!

     首先、我无法读取您的图像。 如果您想让我看看、您可以通过在菜单中选择"Insert"->"Code"来插入代码。  

     您是否尝试过 TivaWare CAN 示例?  C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripheral\CAN 文件夹中有多个示例。 为什么不首先尝试 simple_tx、它应该可以开箱即用。  

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

    使用代码插页进行了更新-以前没有看到过、抱歉。

    是的、我看到了 CAN 示例-问题是、CAN0似乎不能在新芯片上工作、但在旧芯片上工作正常。  找不到任何错误、表明这可能是新器件上的问题。

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

    您好!

     我看不到 CAN0的中断 ISR 处理程序、也看不到您如何在矢量表中指定中断矢量。 是否仍然可以有 CAN1的中断向量、而不是 CAN0的中断向量? 请参阅以下代码、其中 CANIntHandler 映射到 CAN0。 否则、我不会发现您的代码有问题。 能否在新版本上运行 simple_tx? 尽管该示例不使用 TX 上的中断、但至少应该显示 PB5上的一些引脚活动、而您说过它不适用于任何引脚选项。 我还建议您在新的修订板上重新运行 CAN1代码。 它是否仍能正常工作? 这是为了排除新电路板上的任何电路板级问题。  

        IntDefaultHandler,                      // Timer 3 subtimer A
        IntDefaultHandler,                      // Timer 3 subtimer B
        IntDefaultHandler,                      // I2C1 Master and Slave
        IntDefaultHandler,                      // Quadrature Encoder 1
        CANIntHandler,                          // CAN0
        IntDefaultHandler,                      // CAN1
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // Hibernate
        IntDefaultHandler,                      // USB0
        IntDefaultHandler,                      // PWM Generator 3

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

    您好、Charles、感谢您的回答。

    是的、具有 CAN1检测功能的相同代码在具有 TM4C123GH6PM 代码的旧电路板上工作。  我将尝试按照您的建议运行其中一个示例项目、如 simple_tx。

    NVIC 配置如下:

    //*****************************************************************************
    //
    // startup_ewarm.c - Startup code for use with IAR's Embedded Workbench,
    //                   version 5.
    //
    // Copyright (c) 2012-2017 Texas Instruments Incorporated.  All rights reserved.
    // Software License Agreement
    // 
    // Texas Instruments (TI) is supplying this software for use solely and
    // exclusively on TI's microcontroller products. The software is owned by
    // TI and/or its suppliers, and is protected under applicable copyright
    // laws. You may not combine this software with "viral" open-source
    // software in order to form a larger program.
    // 
    // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
    // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
    // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
    // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
    // DAMAGES, FOR ANY REASON WHATSOEVER.
    // 
    // This is part of revision 2.1.4.178 of the EK-TM4C123GXL Firmware Package.
    //
    //*****************************************************************************
    
    #include <stdint.h>
    #include "inc/hw_nvic.h"
    #include "inc/hw_types.h"
    
    //*****************************************************************************
    //
    // Enable the IAR extensions for this source file.
    //
    //*****************************************************************************
    #pragma language=extended
    
    //*****************************************************************************
    //
    // Forward declaration of the default fault handlers.
    //
    //*****************************************************************************
    void ResetISR(void);
    static void NmiSR(void);
    static void FaultISR(void);
    static void IntDefaultHandler(void);
    
    //*****************************************************************************
    //
    // External declaration for the interrupt handler used by the application.
    //
    //*****************************************************************************
    extern void CAN1_IntHandler(void);
    extern void CAN0_IntHandler(void);
    // extern void SysTickIntHandler(void);
    extern void	Timer1AIntHandler(void);
    extern void Timer5AIntHandler(void);
    
    //*****************************************************************************
    //
    // The entry point for the application startup code.
    //
    //*****************************************************************************
    extern void __iar_program_start(void);
    
    //*****************************************************************************
    //
    // Reserve space for the system stack.
    //
    //*****************************************************************************
    static uint32_t pui32Stack[128] @ ".noinit";
    
    //*****************************************************************************
    //
    // A union that describes the entries of the vector table.  The union is needed
    // since the first entry is the stack pointer and the remainder are function
    // pointers.
    //
    //*****************************************************************************
    typedef union
    {
        void (*pfnHandler)(void);
        uint32_t ui32Ptr;
    }
    uVectorEntry;
    
    //*****************************************************************************
    //
    // The vector table.  Note that the proper constructs must be placed on this to
    // ensure that it ends up at physical address 0x0000.0000.
    //
    //*****************************************************************************
    __root const uVectorEntry __vector_table[] @ ".intvec" =
    {
        { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) },
                                                // The initial stack pointer
        ResetISR,                               // The reset handler
        NmiSR,                                  // The NMI handler
        FaultISR,                               // The hard fault handler
        IntDefaultHandler,                      // The MPU fault handler
        IntDefaultHandler,                      // The bus fault handler
        IntDefaultHandler,                      // The usage fault handler
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // SVCall handler
        IntDefaultHandler,                      // Debug monitor handler
        0,                                      // Reserved
        IntDefaultHandler,                      // The PendSV handler
    	IntDefaultHandler,                      // The SysTick handler
        IntDefaultHandler,                      // GPIO Port A
        IntDefaultHandler,                      // GPIO Port B
        IntDefaultHandler,                      // GPIO Port C
        IntDefaultHandler,                      // GPIO Port D
        IntDefaultHandler,                      // GPIO Port E
        IntDefaultHandler,						// UART0 Rx and Tx
    	IntDefaultHandler,						// UART1 Rx and Tx
        IntDefaultHandler,                      // SSI0 Rx and Tx
        IntDefaultHandler,                      // I2C0 Master and Slave
        IntDefaultHandler,                      // PWM Fault
        IntDefaultHandler,                      // PWM Generator 0
        IntDefaultHandler,                      // PWM Generator 1
        IntDefaultHandler,                      // PWM Generator 2
        IntDefaultHandler,                      // Quadrature Encoder 0
        IntDefaultHandler,                      // ADC Sequence 0
        IntDefaultHandler,                      // ADC Sequence 1
        IntDefaultHandler,                      // ADC Sequence 2
        IntDefaultHandler,                      // ADC Sequence 3
        IntDefaultHandler,                      // Watchdog timer
        IntDefaultHandler,                      // Timer 0 subtimer A
        IntDefaultHandler,                      // Timer 0 subtimer B
    	Timer1AIntHandler,		                // Timer 1 subtimer A
        IntDefaultHandler,                      // Timer 1 subtimer B
        IntDefaultHandler,                      // Timer 2 subtimer A
        IntDefaultHandler,                      // Timer 2 subtimer B
        IntDefaultHandler,                      // Analog Comparator 0
        IntDefaultHandler,                      // Analog Comparator 1
        IntDefaultHandler,                      // Analog Comparator 2
        IntDefaultHandler,                      // System Control (PLL, OSC, BO)
        IntDefaultHandler,                      // FLASH Control
        IntDefaultHandler,                      // GPIO Port F
        IntDefaultHandler,                      // GPIO Port G
        IntDefaultHandler,                      // GPIO Port H
        IntDefaultHandler,                       // UART2 Rx and Tx
        IntDefaultHandler,                      // SSI1 Rx and Tx
        IntDefaultHandler,                      // Timer 3 subtimer A
        IntDefaultHandler,                      // Timer 3 subtimer B
        IntDefaultHandler,                      // I2C1 Master and Slave
        IntDefaultHandler,                      // Quadrature Encoder 1
        CAN0_IntHandler,                        // CAN0
        CAN1_IntHandler,                        // CAN1
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // Hibernate
        IntDefaultHandler,                      // USB0
        IntDefaultHandler,                      // PWM Generator 3
        IntDefaultHandler,                      // uDMA Software Transfer
        IntDefaultHandler,                      // uDMA Error
        IntDefaultHandler,                      // ADC1 Sequence 0
        IntDefaultHandler,                      // ADC1 Sequence 1
        IntDefaultHandler,                      // ADC1 Sequence 2
        IntDefaultHandler,                      // ADC1 Sequence 3
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port J
        IntDefaultHandler,                      // GPIO Port K
        IntDefaultHandler,                      // GPIO Port L
        IntDefaultHandler,                      // SSI2 Rx and Tx
        IntDefaultHandler,                      // SSI3 Rx and Tx
        IntDefaultHandler,                      // UART3 Rx and Tx
        IntDefaultHandler,                      // UART4 Rx and Tx
        IntDefaultHandler,                      // UART5 Rx and Tx
        IntDefaultHandler,                      // UART6 Rx and Tx
        IntDefaultHandler,                      // UART7 Rx and Tx
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C2 Master and Slave
        IntDefaultHandler,                      // I2C3 Master and Slave
        IntDefaultHandler,                      // Timer 4 subtimer A
        IntDefaultHandler,                      // Timer 4 subtimer B
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        Timer5AIntHandler,                      // Timer 5 subtimer A
        IntDefaultHandler,                      // Timer 5 subtimer B
        IntDefaultHandler,                      // Wide Timer 0 subtimer A
        IntDefaultHandler,                      // Wide Timer 0 subtimer B
        IntDefaultHandler,                      // Wide Timer 1 subtimer A
        IntDefaultHandler,                      // Wide Timer 1 subtimer B
        IntDefaultHandler,                      // Wide Timer 2 subtimer A
        IntDefaultHandler,                      // Wide Timer 2 subtimer B
        IntDefaultHandler,                      // Wide Timer 3 subtimer A
        IntDefaultHandler,                      // Wide Timer 3 subtimer B
        IntDefaultHandler,                      // Wide Timer 4 subtimer A
        IntDefaultHandler,                      // Wide Timer 4 subtimer B
        IntDefaultHandler,                      // Wide Timer 5 subtimer A
        IntDefaultHandler,                      // Wide Timer 5 subtimer B
        IntDefaultHandler,                      // FPU
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C4 Master and Slave
        IntDefaultHandler,                      // I2C5 Master and Slave
        IntDefaultHandler,                      // GPIO Port M
        IntDefaultHandler,                      // GPIO Port N
        IntDefaultHandler,                      // Quadrature Encoder 2
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port P (Summary or P0)
        IntDefaultHandler,                      // GPIO Port P1
        IntDefaultHandler,                      // GPIO Port P2
        IntDefaultHandler,                      // GPIO Port P3
        IntDefaultHandler,                      // GPIO Port P4
        IntDefaultHandler,                      // GPIO Port P5
        IntDefaultHandler,                      // GPIO Port P6
        IntDefaultHandler,                      // GPIO Port P7
        IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
        IntDefaultHandler,                      // GPIO Port Q1
        IntDefaultHandler,                      // GPIO Port Q2
        IntDefaultHandler,                      // GPIO Port Q3
        IntDefaultHandler,                      // GPIO Port Q4
        IntDefaultHandler,                      // GPIO Port Q5
        IntDefaultHandler,                      // GPIO Port Q6
        IntDefaultHandler,                      // GPIO Port Q7
        IntDefaultHandler,                      // GPIO Port R
        IntDefaultHandler,                      // GPIO Port S
        IntDefaultHandler,                      // PWM 1 Generator 0
        IntDefaultHandler,                      // PWM 1 Generator 1
        IntDefaultHandler,                      // PWM 1 Generator 2
        IntDefaultHandler,                      // PWM 1 Generator 3
        IntDefaultHandler                       // PWM 1 Fault
    };

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

    您好!

     我没有听到你的反馈。 我希望您自己解决了这个问题。 我现在将关闭该线程。 如果您有一些更新、您只需写回此帖子、该主题将自动重新打开。