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.
我一直在研究我们设计的 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 };
您好!
我没有听到你的反馈。 我希望您自己解决了这个问题。 我现在将关闭该线程。 如果您有一些更新、您只需写回此帖子、该主题将自动重新打开。