主题中讨论的其他器件: EK-TM4C123GXL、 EK-TM4C1294XL、 TM4C123GH6PM
大家好
我无法通过使用 tm4c123gh6pge 设置的定制板上的 CAN0端口进行通信、但我可以使用完全相同的代码从 CAN1端口轻松进行通信。
同样、在德州开发板(tm4c1294encpdt)上、我无法通过 CAN0端口进行通信、但可以使用 CAN1使用相同的代码进行通信。
我想知道的是、我是否需要应用单独的配置来使用基于德州 MCU 的 CAN0?
谢谢、此致。
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.
大家好
我无法通过使用 tm4c123gh6pge 设置的定制板上的 CAN0端口进行通信、但我可以使用完全相同的代码从 CAN1端口轻松进行通信。
同样、在德州开发板(tm4c1294encpdt)上、我无法通过 CAN0端口进行通信、但可以使用 CAN1使用相同的代码进行通信。
我想知道的是、我是否需要应用单独的配置来使用基于德州 MCU 的 CAN0?
谢谢、此致。
您好、Ayhan、
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base "]我无法通过我使用 tm4c123gh6pge 设置的定制板上的 CAN0端口进行通信,但我可以使用完全相同的代码从 CAN1端口轻松地进行通信。您能否详细说明 CAN0通信有什么问题? 您在 CAN0_TX 和 CAN0_RX 引脚上看到了什么。
TM4C123GH6PGE 的 CAN0代码能否在 EK-TM4C123GXL LaunchPad 上运行?
您能否同时显示我们的 CAN0和 CAN1代码? 有什么区别?
下面是一个在 CAN0上运行的简单 CAN 示例。 您可以尝试一下、它是否起作用? 请在 LaunchPad 和定制板上运行。 如果它在 LaunchPad 上工作、但不在您的定制板上工作、则您可能需要检查您的定制板连接。
e2e.ti.com/.../2021.simple_5F00_tx.c
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base ]同样、在德州开发板(tm4c1294encpdt)上、我无法通过 CAN0端口进行通信、但可以使用 CAN1与相同的代码进行通信。对于 TM4C129 LaunchPad 开发板、您需要将 JP4和 JP5跳线更改为它们的垂直位置、以使用 CAN0。 否则、它们用于 UART0。

您好 Charles
使用开发板上的 CAN0端口、当跳线为垂直时、我能够从 PA0-PA1引脚(CAN0)进行通信。 但是、这次我无法使用 UART。 我认为我无法从 CAN0端口发送消息、因为之前禁用了 UART。 在最终版本的代码中、我将 CAN1端口转换为 CAN0 (PA0-PA1)、将 UART0转换为 UART1、现在我将 PB0和 PB1作为 UART 引脚。 但是、当我运行程序时、我可以从 CAN0端口发送消息、但在 UART 上看不到它。 这样做的原因可能是什么?
在我的定制板上、我确定 CAN0不工作、但我需要一些时间来测量引脚上的输出、因为我当前的所有 MCU 板都已修改为使用 CAN1端口。 要重试、我将修改 CAN0端口的卡、并向您详细说明这种情况。
感谢您的关注。 此致。
您好!
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3821695 #3821695")但是,当我运行程序时,我可以从 CAN0端口发送消息,但在 UART 上看不到消息。 这样做的原因可能是什么?请参阅以下说明。 当处于垂直跳线位置时、它是 UART2、而 UART1则不会成为虚拟 COM 端口。

您好、Charles、
首先、很抱歉耽误您的回答。
我将 PA6和 PA7配置为 UART2。
void
InitConsole(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA6_U2RX);
GPIOPinConfigure(GPIO_PA7_U2TX);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
UARTClockSourceSet(UART2_BASE, UART_CLOCK_PIOSC);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
UARTStdioConfig(2, 115200, 16000000);
}
但我仍然无法在虚拟 COM 端口上看到任何内容。
您好、Ayhan、
我真的看不到您修改后的代码有什么问题。 我假设您将 JP4和 JP5更改为 EK-TM4C1294XL LaunchPad 上的垂直位置、对吧? 我假设您正在谈论 EK-TM4C1294XL LaunchPad、对吧? 请注意 、EK-TM4C1294XL LaunchPad 可以选择 UART0 或 UART2作为 COM 端口。 EK-TM4C123GXL 电路板或您自己的定制电路板上并非如此。 对于这些电路板、您将需要 UART2上的外部 FTDI 芯片。 我只是想确保我们在这里讨论的是相同的东西/板。
您能否创建一个仅将 UART2用作 COM 端口的小型程序? 在此程序中,只需执行简单的 UARTprintf()即可打印出内容? 向我展示整个代码、以便我查看并运行它。
您好、Charles、
是的、我将 JP4和 JP5更改为垂直位置、电路板为 TM4C1294XL LaunchPad、我确信是这样。 (下图是谷歌搜索的、但与我的卡片相同)

下面的代码是来自德州示例的 hello world。 当 JP4和 JP5处于水平位置时、 我将其上传至电路板并选择 UART0、我可以从 COM 端口看到消息。
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "drivers/pinout.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
uint32_t g_ui32SysClock;
void
ConfigureUART(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, g_ui32SysClock);
}
int
main(void)
{
g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);
PinoutSet(false, false);
GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_1);
ConfigureUART();
UARTprintf("Hello, world!\n");
while(1)
{
LEDWrite(CLP_D1, 1);
SysCtlDelay(g_ui32SysClock / 10 / 3);
LEDWrite(CLP_D1, 0);
SysCtlDelay(g_ui32SysClock / 10 / 3);
}
}

然后、我将 UART0配置 为 UART2。 我将代码上载到卡上、LED 闪烁、因此代码工作正常、但无法看到来自 COM 端口的消息。 我在水平和垂直位置使用 JP4和 JP5进行了试验。 结果不变。
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "drivers/pinout.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
uint32_t g_ui32SysClock;
void
ConfigureUART(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
GPIOPinConfigure(GPIO_PA6_U2RX);
GPIOPinConfigure(GPIO_PA7_U2TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
UARTStdioConfig(2, 115200, g_ui32SysClock);
}
int
main(void)
{
g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);
PinoutSet(false, false);
GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_1);
ConfigureUART();
UARTprintf("Hello, world!\n");
while(1)
{
LEDWrite(CLP_D1, 1);
SysCtlDelay(g_ui32SysClock / 10 / 3);
LEDWrite(CLP_D1, 0);
SysCtlDelay(g_ui32SysClock / 10 / 3);
}
}

您好!
我认为我发现了您的代码问题。 您应该改用 PD4作为 UR2RX、PD5作为 UR2TX。 请参阅以下代码。 这对我很有影响。 另请参阅 LaunchPad 原理图。
void
ConfigureUART(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
GPIOPinConfigure(GPIO_PD4_U2RX);
GPIOPinConfigure(GPIO_PD5_U2TX);
GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
UARTStdioConfig(2, 115200, g_ui32SysClock);
}

您好、Charles、
提醒:我在定制板上使用的是 TM4C123GH6PGE。
我修改了用于 CAN0通信(PF0和 PF3)的电路板。 同时、该卡设计为能够与其他收发器通信 CAN1 (PA0和 PA1)。
CAN1通信的以下代码、它可以正常工作:
// multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_can.h"
#include "inc/hw_ints.h"
#include "driverlib/can.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "driverlib/debug.h"
#include "utils/uartstdio.c"
#include "utils/uartstdio.h"
unsigned int sysClock = 16000000;
volatile uint32_t g_ui32IntCount = 0;
volatile uint32_t g_ui32Msg1Count = 0;
volatile uint32_t g_ui32Msg2Count = 0;
volatile uint32_t g_ui32Msg3Count = 0;
volatile uint32_t g_ui32Msg4Count = 0;
volatile uint32_t g_ui32Msg5Count = 0;
volatile uint32_t g_ui32Msg6Count = 0;
volatile uint32_t g_ui32Msg7Count = 0;
volatile uint32_t g_ui32Msg8Count = 0;
volatile uint32_t g_ui32Msg9Count = 0;
volatile uint32_t g_ui32Msg10Count = 0;
volatile uint32_t g_ui32Msg11Count = 0;
volatile uint32_t g_ui32Msg12Count = 0;
volatile bool g_bMsgObj6Sent = 0;
volatile bool g_bErrFlag = 0;
volatile bool g_bRXFlag1 = 0;
volatile bool g_bRXFlag2 = 0;
volatile bool g_bRXFlag3 = 0;
volatile bool g_bRXFlag4 = 0;
volatile bool g_bRXFlag5 = 0;
volatile bool g_bRXFlag6 = 0;
volatile bool g_bRXFlag7 = 0;
volatile bool g_bRXFlag8 = 0;
volatile bool g_bRXFlag9 = 0;
volatile bool g_bRXFlag10 = 0;
volatile bool g_bRXFlag11 = 0;
volatile bool g_bRXFlag12 = 0;
tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2;
tCANMsgObject g_sCANMsgObject3;
tCANMsgObject g_sCANMsgObject4;
tCANMsgObject g_sCANMsgObject5;
tCANMsgObject g_sCANMsgObject6;
uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
void
CANIntHandler(void)
{
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
uint32_t ui32Status;
ui32Status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE);
if(ui32Status == CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL);
g_bErrFlag = 1;
UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
}
else if(ui32Status == 1)
{
CANIntClear(CAN1_BASE, 1);
g_ui32Msg1Count++;
g_bRXFlag1 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 2)
{
CANIntClear(CAN1_BASE, 2);
g_ui32Msg2Count++;
g_bRXFlag2 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 3)
{
CANIntClear(CAN1_BASE, 3);
g_ui32Msg3Count++;
g_bRXFlag3 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 4)
{
CANIntClear(CAN1_BASE, 4);
g_ui32Msg4Count++;
g_bRXFlag4 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 5)
{
CANIntClear(CAN1_BASE, 5);
g_ui32Msg5Count++;
g_bRXFlag5 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 6)
{
CANIntClear(CAN1_BASE, 6);
g_ui32Msg6Count++;
g_bRXFlag6 = 1;
g_bMsgObj6Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 7)
{
CANIntClear(CAN1_BASE, 7);
g_ui32Msg7Count++;
g_bRXFlag7 = 1;
//g_bMsgObj7Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 8)
{
CANIntClear(CAN1_BASE, 8);
g_ui32Msg8Count++;
g_bRXFlag8 = 1;
//g_bMsgObj8Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 9)
{
CANIntClear(CAN1_BASE, 9);
g_ui32Msg9Count++;
g_bRXFlag9 = 1;
//g_bMsgObj9Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 10)
{
CANIntClear(CAN1_BASE, 10);
g_ui32Msg10Count++;
g_bRXFlag10 = 1;
//g_bMsgObj10Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 11)
{
CANIntClear(CAN1_BASE, 11);
g_ui32Msg11Count++;
g_bRXFlag11 = 1;
//g_bMsgObj11Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 12)
{
CANIntClear(CAN1_BASE, 12);
g_ui32Msg12Count++;
g_bRXFlag12 = 1;
//g_bMsgObj12Sent = 1;
g_bErrFlag = 0;
}
else
{
}
}
void
InitConsole(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
UARTStdioConfig(1, 115200, 16000000);
}
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
psCANMsg->ui32MsgID);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
void
PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
{
//UARTprintf("CAN message loss detected on message object %d\n",
// ui32MsgObj);
}
UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
int
main(void)
{
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
InitConsole();
volatile uint32_t ui32Loop;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_CAN1RX);
GPIOPinConfigure(GPIO_PA1_CAN1TX);
GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);
CANInit(CAN1_BASE);
CANBitRateSet(CAN1_BASE, 16000000, 500000);
CANIntRegister(CAN1_BASE, CANIntHandler); // if using dynamic vectors
CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable(INT_CAN1);
CANEnable(CAN1_BASE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);
//----------------to transmit-----------------------------------
g_sCANMsgObject1.ui32MsgID = 0x1006;
g_sCANMsgObject1.ui32MsgIDMask = 0;
g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
//------------------to receive-------------------------------------------
sCANMessage.ui32MsgID = 0x1002;
sCANMessage.ui32MsgIDMask = 0xfffff;
sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
MSG_OBJ_EXTENDED_ID);
sCANMessage.ui32MsgLen = 8;
CANMessageSet(CAN1_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
for(;;)
{
SysCtlDelay(200000);
PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
CANMessageSet(CAN1_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
if(g_bRXFlag1)
{
sCANMessage.pui8MsgData = pui8MsgData;
CANMessageGet(CAN1_BASE, 1, &sCANMessage, 0);
g_bRXFlag1 = 0;
PrintCANMessageInfoRx(&sCANMessage, 1);
}
if(g_bErrFlag)
{
UARTprintf(" error - cable connected?\n");
}
else
{
//UARTprintf(" total count = %u\n",
// g_ui32Msg1Count);
}
}
return(0);
}
下图 是 CAN1的 CANH 和 CANL 引脚的作用域:

这是从 PCAN 视图接收到的消息:

在此过程之后、我对 CAN0端口(PF0和 PF3)尝试了相同的过程:
// multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_can.h"
#include "inc/hw_ints.h"
#include "driverlib/can.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "driverlib/debug.h"
#include "utils/uartstdio.c"
#include "utils/uartstdio.h"
unsigned int sysClock = 16000000;
volatile uint32_t g_ui32IntCount = 0;
volatile uint32_t g_ui32Msg1Count = 0;
volatile uint32_t g_ui32Msg2Count = 0;
volatile uint32_t g_ui32Msg3Count = 0;
volatile uint32_t g_ui32Msg4Count = 0;
volatile uint32_t g_ui32Msg5Count = 0;
volatile uint32_t g_ui32Msg6Count = 0;
volatile uint32_t g_ui32Msg7Count = 0;
volatile uint32_t g_ui32Msg8Count = 0;
volatile uint32_t g_ui32Msg9Count = 0;
volatile uint32_t g_ui32Msg10Count = 0;
volatile uint32_t g_ui32Msg11Count = 0;
volatile uint32_t g_ui32Msg12Count = 0;
volatile bool g_bMsgObj6Sent = 0;
volatile bool g_bErrFlag = 0;
volatile bool g_bRXFlag1 = 0;
volatile bool g_bRXFlag2 = 0;
volatile bool g_bRXFlag3 = 0;
volatile bool g_bRXFlag4 = 0;
volatile bool g_bRXFlag5 = 0;
volatile bool g_bRXFlag6 = 0;
volatile bool g_bRXFlag7 = 0;
volatile bool g_bRXFlag8 = 0;
volatile bool g_bRXFlag9 = 0;
volatile bool g_bRXFlag10 = 0;
volatile bool g_bRXFlag11 = 0;
volatile bool g_bRXFlag12 = 0;
tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2;
tCANMsgObject g_sCANMsgObject3;
tCANMsgObject g_sCANMsgObject4;
tCANMsgObject g_sCANMsgObject5;
tCANMsgObject g_sCANMsgObject6;
uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
void
CANIntHandler(void)
{
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
uint32_t ui32Status;
ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
if(ui32Status == CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
g_bErrFlag = 1;
UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
}
else if(ui32Status == 1)
{
CANIntClear(CAN0_BASE, 1);
g_ui32Msg1Count++;
g_bRXFlag1 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 2)
{
CANIntClear(CAN0_BASE, 2);
g_ui32Msg2Count++;
g_bRXFlag2 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 3)
{
CANIntClear(CAN0_BASE, 3);
g_ui32Msg3Count++;
g_bRXFlag3 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 4)
{
CANIntClear(CAN0_BASE, 4);
g_ui32Msg4Count++;
g_bRXFlag4 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 5)
{
CANIntClear(CAN0_BASE, 5);
g_ui32Msg5Count++;
g_bRXFlag5 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 6)
{
CANIntClear(CAN0_BASE, 6);
g_ui32Msg6Count++;
g_bRXFlag6 = 1;
g_bMsgObj6Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 7)
{
CANIntClear(CAN0_BASE, 7);
g_ui32Msg7Count++;
g_bRXFlag7 = 1;
//g_bMsgObj7Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 8)
{
CANIntClear(CAN0_BASE, 8);
g_ui32Msg8Count++;
g_bRXFlag8 = 1;
//g_bMsgObj8Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 9)
{
CANIntClear(CAN0_BASE, 9);
g_ui32Msg9Count++;
g_bRXFlag9 = 1;
//g_bMsgObj9Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 10)
{
CANIntClear(CAN0_BASE, 10);
g_ui32Msg10Count++;
g_bRXFlag10 = 1;
//g_bMsgObj10Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 11)
{
CANIntClear(CAN0_BASE, 11);
g_ui32Msg11Count++;
g_bRXFlag11 = 1;
//g_bMsgObj11Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 12)
{
CANIntClear(CAN0_BASE, 12);
g_ui32Msg12Count++;
g_bRXFlag12 = 1;
//g_bMsgObj12Sent = 1;
g_bErrFlag = 0;
}
else
{
}
}
void
InitConsole(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
UARTStdioConfig(1, 115200, 16000000);
}
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
psCANMsg->ui32MsgID);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
void
PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
{
//UARTprintf("CAN message loss detected on message object %d\n",
// ui32MsgObj);
}
UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
int
main(void)
{
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
InitConsole();
volatile uint32_t ui32Loop;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF0_CAN0RX);
GPIOPinConfigure(GPIO_PF3_CAN0TX);
GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3);
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
CANInit(CAN0_BASE);
CANBitRateSet(CAN0_BASE, 16000000, 500000);
CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable(INT_CAN0);
CANEnable(CAN0_BASE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);
//----------------to transmit-----------------------------------
g_sCANMsgObject1.ui32MsgID = 0x1006;
g_sCANMsgObject1.ui32MsgIDMask = 0;
g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
//------------------to receive-------------------------------------------
sCANMessage.ui32MsgID = 0x1002;
sCANMessage.ui32MsgIDMask = 0xfffff;
sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
MSG_OBJ_EXTENDED_ID);
sCANMessage.ui32MsgLen = 8;
CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
for(;;)
{
//uint32_t ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
//UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
SysCtlDelay(200000);
//UARTprintf(" error - cable connected?\n");
PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
CANMessageSet(CAN0_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
if(g_bRXFlag1)
{
sCANMessage.pui8MsgData = pui8MsgData;
CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);
g_bRXFlag1 = 0;
PrintCANMessageInfoRx(&sCANMessage, 1);
}
if(g_bErrFlag)
{
UARTprintf(" error - cable connected?\n");
}
else
{
//UARTprintf(" total count = %u\n",
// g_ui32Msg1Count);
}
}
return(0);
}
下图 是 CAN0的 CANH 和 CANL 引脚的作用域:

这是 PCAN 视图:

您可以看到、使用相同代码时、CAN1端口上没有问题。 我确信收发器没有损坏、因为我用了很多不同的卡来尝试它、结果是一样的。
您对这种情况的发生原因有什么看法吗?
您好!
我看到您启用了 CAN0。 如果不启用 CAN0、您将看到显示的大量错误。 您能否将 while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))添加 到代码中? 有什么不同吗? 您是否也可以单步进入 CANInit()函数?
SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))//添加此行
{
}
您好!
我将这一行添加到我的代码中
while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))//添加此行
{
}
现在、我可以看到 CAN0寄存器设置的值。 但仍然没有发送或接收到 CAN 消息。

(在我注释该行后、寄存器仍然可见、因此我认为在之前尝试捕获 CAN0寄存器设置时出错。)
[引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3845996 #3845996"] -在定制板上运行 TivaWare 示例 simple_tx.c 或 simple_rx.c。 您看到了什么?[/报价]
我已经通过结合 TivaWare 示例中的 multi_TX 和 multi_Rx 来制作此代码。 正如我说过的、它在 CAN1上运行时没有任何问题。
// multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_can.h"
#include "inc/hw_ints.h"
#include "driverlib/can.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "driverlib/debug.h"
#include "utils/uartstdio.c"
#include "utils/uartstdio.h"
unsigned int sysClock = 16000000;
volatile uint32_t g_ui32IntCount = 0;
volatile uint32_t g_ui32Msg1Count = 0;
volatile uint32_t g_ui32Msg2Count = 0;
volatile uint32_t g_ui32Msg3Count = 0;
volatile uint32_t g_ui32Msg4Count = 0;
volatile uint32_t g_ui32Msg5Count = 0;
volatile uint32_t g_ui32Msg6Count = 0;
volatile uint32_t g_ui32Msg7Count = 0;
volatile uint32_t g_ui32Msg8Count = 0;
volatile uint32_t g_ui32Msg9Count = 0;
volatile uint32_t g_ui32Msg10Count = 0;
volatile uint32_t g_ui32Msg11Count = 0;
volatile uint32_t g_ui32Msg12Count = 0;
volatile bool g_bMsgObj6Sent = 0;
volatile bool g_bErrFlag = 0;
volatile bool g_bRXFlag1 = 0;
volatile bool g_bRXFlag2 = 0;
volatile bool g_bRXFlag3 = 0;
volatile bool g_bRXFlag4 = 0;
volatile bool g_bRXFlag5 = 0;
volatile bool g_bRXFlag6 = 0;
volatile bool g_bRXFlag7 = 0;
volatile bool g_bRXFlag8 = 0;
volatile bool g_bRXFlag9 = 0;
volatile bool g_bRXFlag10 = 0;
volatile bool g_bRXFlag11 = 0;
volatile bool g_bRXFlag12 = 0;
tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2;
tCANMsgObject g_sCANMsgObject3;
tCANMsgObject g_sCANMsgObject4;
tCANMsgObject g_sCANMsgObject5;
tCANMsgObject g_sCANMsgObject6;
/*
uint8_t g_pui8Msg1[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
uint8_t g_pui8Msg2[8] = { 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01 };
uint8_t g_pui8Msg3[8] = { 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 };
uint8_t g_pui8Msg4[8] = { 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45 };
uint8_t g_pui8Msg5[8] = { 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67 };
uint8_t g_pui8Msg6[8] = { 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89 };
*/
uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t g_pui8Msg2[8] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 };
uint8_t g_pui8Msg3[8] = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
uint8_t g_pui8Msg4[8] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 };
uint8_t g_pui8Msg5[8] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };
uint8_t g_pui8Msg6[8] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
/*
uint8_t g_pui8Msg1[8] = { 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB };
uint8_t g_pui8Msg2[8] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC };
uint8_t g_pui8Msg3[8] = { 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD };
uint8_t g_pui8Msg4[8] = { 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE };
uint8_t g_pui8Msg5[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
*/
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
void
CANIntHandler(void)
{
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
uint32_t ui32Status;
ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
if(ui32Status == CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
g_bErrFlag = 1;
UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
}
else if(ui32Status == 1)
{
CANIntClear(CAN0_BASE, 1);
g_ui32Msg1Count++;
g_bRXFlag1 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 2)
{
CANIntClear(CAN0_BASE, 2);
g_ui32Msg2Count++;
g_bRXFlag2 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 3)
{
CANIntClear(CAN0_BASE, 3);
g_ui32Msg3Count++;
g_bRXFlag3 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 4)
{
CANIntClear(CAN0_BASE, 4);
g_ui32Msg4Count++;
g_bRXFlag4 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 5)
{
CANIntClear(CAN0_BASE, 5);
g_ui32Msg5Count++;
g_bRXFlag5 = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 6)
{
CANIntClear(CAN0_BASE, 6);
g_ui32Msg6Count++;
g_bRXFlag6 = 1;
g_bMsgObj6Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 7)
{
CANIntClear(CAN0_BASE, 7);
g_ui32Msg7Count++;
g_bRXFlag7 = 1;
//g_bMsgObj7Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 8)
{
CANIntClear(CAN0_BASE, 8);
g_ui32Msg8Count++;
g_bRXFlag8 = 1;
//g_bMsgObj8Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 9)
{
CANIntClear(CAN0_BASE, 9);
g_ui32Msg9Count++;
g_bRXFlag9 = 1;
//g_bMsgObj9Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 10)
{
CANIntClear(CAN0_BASE, 10);
g_ui32Msg10Count++;
g_bRXFlag10 = 1;
//g_bMsgObj10Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 11)
{
CANIntClear(CAN0_BASE, 11);
g_ui32Msg11Count++;
g_bRXFlag11 = 1;
//g_bMsgObj11Sent = 1;
g_bErrFlag = 0;
}
else if(ui32Status == 12)
{
CANIntClear(CAN0_BASE, 12);
g_ui32Msg12Count++;
g_bRXFlag12 = 1;
//g_bMsgObj12Sent = 1;
g_bErrFlag = 0;
}
else
{
}
}
void
InitConsole(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
UARTStdioConfig(1, 115200, 16000000);
}
void
PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
psCANMsg->ui32MsgID);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
void
PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
{
unsigned int uIdx;
if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
{
//UARTprintf("CAN message loss detected on message object %d\n",
// ui32MsgObj);
}
UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
{
UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf("\n");
}
int
main(void)
{
//sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
tCANMsgObject sCANMessage;
uint8_t pui8MsgData[8];
InitConsole();
volatile uint32_t ui32Loop;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF0_CAN0RX);
GPIOPinConfigure(GPIO_PF3_CAN0TX);
GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3);
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_CAN0)) // Add this line
{
}
CANInit(CAN0_BASE);
CANBitRateSet(CAN0_BASE, 16000000, 500000);
CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable(INT_CAN0);
CANEnable(CAN0_BASE);
;
//----------------to transmit-----------------------------------
g_sCANMsgObject1.ui32MsgID = 0x1006;
g_sCANMsgObject1.ui32MsgIDMask = 0;
g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
//------------------to receive-------------------------------------------
sCANMessage.ui32MsgID = 0x1002;
sCANMessage.ui32MsgIDMask = 0xfffff;
sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
MSG_OBJ_EXTENDED_ID);
sCANMessage.ui32MsgLen = 8;
CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
for(;;)
{
SysCtlDelay(200000);
PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
CANMessageSet(CAN0_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
if(g_bRXFlag1)
{
sCANMessage.pui8MsgData = pui8MsgData;
CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);
g_bRXFlag1 = 0;
PrintCANMessageInfoRx(&sCANMessage, 1);
}
if(g_bErrFlag)
{
UARTprintf(" error - cable connected?\n");
}
else
{
//UARTprintf(" total count = %u\n",
// g_ui32Msg1Count);
}
}
return(0);
}
这是 CANInit()函数的单步执行:

我上面提到的代码在 LaunchPad 板上运行良好。
请告诉我您是否在定制板的 CAN0上运行示例。 我了解它适用于您的定制板的 CAN1。
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846165 #3846165"]我上面提到的代码在 LaunchPad 板上运行良好。如果您在 LaunchPad 上为 CAN0编码、则代码正常。 如果 TivaWare 示例未在定制板的 CAN0上运行、则说明您的板可能有问题。 您是否有其他板可供尝试? 您能否在所有定制板上重现问题?
您好!
[引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846174 #3846174">如果您在定制板的 CAN0上运行示例,请告诉我。 我了解它适用于您的定制板的 CAN1。 [/报价]我在自定义电路板上的 TIVAware 示例中尝试了 simple_tx、但它不能与 CAN0配合使用。
[引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846174 #3846174">如果您的 CAN0代码在 LaunchPad 上运行正常、则代码正常。 如果 TivaWare 示例未在定制板的 CAN0上运行、则说明您的板可能有问题。 您是否有其他板可供尝试? 您能否在所有定制板上重现问题?是的、我甚至在几乎4-5个不同的定制板上尝试过它。 这是我的定制板的 CAN 收发器的原理图。

我在自定义电路板上的 TIVAware 示例中尝试了 simple_tx、但它不能与 CAN0配合使用。
[/报价]
您能否在 simple_tx.c 示例中探测 CAN0TX 引脚? 您是否看到 PF3令人难以置信?
此外、您在阅读原理图时、将 CAN0TX 直接驱动到收发器。 MCU 是一款3.3V 器件。 您应该在驱动5V 收发器之前先经过电平转换器。
您好、Charles、
我在运行 simple_tx.c 时使用示波器测量了 PF3
在我运行代码之前、它是恒定的2.7V、在我运行代码之后、它是恒定的3.3V。
没有摆动或任何东西。 信号在连接或未连接到接收器时不会改变。
[引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846299 #3846299"]此外、您还可以阅读原理图、直接将 CAN0TX 驱动到收发器。 MCU 是一款3.3V 器件。 您应该在驱动5V 收发器之前先经过电平转换器。 [/报价]是的、您是对的、但这是两个收发器中的一个、另一个收发器在使用相同的连接时工作正常。
此外、如果存在任何连接错误的路径、我还检查了 PCB 布局、但没有。
我在运行 simple_tx.c 时使用示波器测量了 PF3
在我运行代码之前、它是恒定的2.7V、在我运行代码之后、它是恒定的3.3V。
没有摆动或任何东西。 信号在连接或未连接到接收器时不会改变。
[/报价]simple_TX 示例对 CAN0RX 和 CAN0TX 使用 PB4和 PB5引脚? 您是否更改了 PF0和 PF3的代码以在定制板上运行? 如果您没有更改为 PF0和 PF3、则它显然无法在您的定制板上工作。 请确认。
假设您按原样运行 simple_tx 示例、您是否看到 PB5引脚上的 CAN0TX 如何变化?
您能否向我发送使用 PF0和 PF3引脚的整个 CAN0 CCS 项目?
您好!
是的、我根据我的定制电路板设计配置了代码。
这是项目的 wetransfer 下载链接:
您好!
我将再次尝试在 LaunchPad 上运行。 但是、如果您已在 Launchpad 上运行它、并且它可以正常工作、则代码是可以的。 问题必须与电路板相关。 您能不能做我建议的、就是为 CAN0尝试 PB4/PB5或 PE4/PE5? 我知道这需要对您的电路板进行一些更改。 但我真的不知道还有什么建议、因为我们知道:
您的代码在 LaunchPad 上运行。 这意味着代码良好。 如果代码在定制电路板上无法正常工作、则会导致电路板出现问题。
2. TivaWare simple_TX 在您的定制板上不起作用。 这再次导致电路板问题。
您好、再说一次、
我根据 Charles 的建议修改了电路板、我尝试了与 PB4/PB5和 PE4/PE5的通信、这两种通信都不像 PF0/PF3那样正常工作。
如果电路板上存在问题、我通过电缆将引脚直接焊接到 CAN 收发器 TX-RX 引脚上。 这没有改变结果、CAN0仍然不工作。
这很奇怪、因为 CAN1工作正常。
是否需要进行特定设置才能在这些模型 MCU 中使用 CAN0?
这个问题对我来说非常重要、因为在我们的项目中、需要双 CAN 端口、但我只能使用一个。
谢谢
您好!
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3899918 #3899918"]根据 Charles 的建议,我尝试了与 PB4/PB5和 PE4/PE5的通信,但二者都不像 PF0/PF3那样正常工作。[/quote您可以说、其中既是 CANTX 的 PB5又是 PE5、只是平坦线死了。 是这样吗? 您能否显示 PB5和 PE5的 CANTX 引脚的逻辑分析仪或示波器捕获? 下面是我捕获的内容。 我尝试了 PB5 (TX)/PB4 (RX)以及 PE5 (TX)/PE4 (RX)、在这两种情况下、我可以看到至少 TX 在我的 LaunchPad 上切换、而不仅仅是平面。 请注意、我运行 simple_tx 时经过修改、使用 PB5/PB4和 PE5/PE4来生成以下捕捉。

根据 我们先前的讨论、如果以下两个案例为真、请再次确认。
您的代码在 LaunchPad 上运行。 这意味着您的代码良好。 如果 您的代码在定制电路板上无法正常工作、则会导致电路板出现问题。
2. TivaWare simple_TX 在您的定制板上不起作用。 这再次导致电路板问题。
我有用于 PB5和 PE5的 simple_tx。 请参阅以下附件。 为什么不先在 Launchpad 上尝试、然后再在定制板上尝试。 如果它仍然可以在您的 LaunchPad 上工作、但不能在您的定制板上工作、那么我真的不知道还有什么建议。 与您的定制板相比、在 LaunchPad 上运行时、在 TX 引脚上显示逻辑分析仪或示波器捕获。
e2e.ti.com/.../simple_5F00_tx_5F00_can0_5F00_pb5.ce2e.ti.com/.../simple_5F00_tx_5F00_can0_5F00_pe5.c
我也对您的预定义设置很好奇。 请参见下面的。 您在 CCS 中输入了什么器件型号? 对于我来说、LaunchPad 具有 PART_TM4C123GH6PM。 如果您使用的是 TM4C123GH6PGE、则需要在您的设置中反映这一点。

您好 Charles
再次感谢您的支持。
我想我在上次尝试中犯了一个错误。 在上一个测试中、我能够通过 CAN0与 PE4/PE5引脚通信。 它适用于 simple_tx 代码和我在项目中使用的代码。 我通过将电缆直接从 MCU 的引脚连接到收发器来实现这一点。 这表示我的 MCU 的 CAN0端口正在工作、我所做的设置是正确的。
但是、出于某种原因、我仍然无法与项目中应该使用的 PF0和 PF3引脚通信。 即使我使用电缆直接从 MCU 的引脚连接到收发器、正如我在 PE4/PE5引脚上所做的那样、结果也没有改变。
下面是 Pf0和 PF3的示波器图像:
顺便说一下、根据安装的代码、它应该在此时每隔100ms 发送一次周期性消息。
第一幅和第二幅图像是在没有连接到收发器的 pcan 的情况下拍摄的。 (PF3 - PF0)

当我将 PCAN 连接到收发器时、拍摄了第三、第四和第五幅图像。 (在示波器自动缩放时为 PF3 - PF0、示波器停止时)

大家可以看到、当我连接 PCAN 时、我实际上可以在接收端看到一些信号、但我认为这些信号由于某种原因而损坏。 因为 MCU 无法处理我发送的 CAN 消息。
当我尝试发送一条消息时、PCAN 接口上的状态从 OK 变为 BUSHEAVY。

在查看数据表时、我看到了这样的表、其中我注意到 PF0和 PF3的"引脚分配"与其他引脚不同、是3、而不是8。 我想知道这是否要求我在配置期间执行不同的操作?

顺便说一下、这里是 我在 CCS 的"预定义符号"部分中的设置。

您好、Ayhan、
很高兴您在 PE5/PE4上工作。
[引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3902994 #3902994">在查看数据表时、我看到了这样的表、其中我注意到 PF0和 PF3的"引脚分配"是3、而不是8、这与其他引脚不同。 我想知道这是否要求我在配置期间执行不同的操作?我认为原因是 PF[0]是一个特殊的引脚。 您必须先解锁此引脚、然后才能将其用于 CAN。 我的错、我应该提前告知您。 默认情况下、PF[0]仅在 GPIO 模式下被锁定。 为了将 PF[0]重新用于其它功能、需要先将其解锁。 请使用 GPIOUnlockPin()来解锁它。

