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.

[参考译文] EK-TM4C1294XL:CAN 总线发送器代码有问题

Guru**** 2451240 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/624226/ek-tm4c1294xl-issue-with-can-bus-transmitter-code

器件型号:EK-TM4C1294XL

我正在为 CAN 总线发送器侧编译以下代码:

#include 
#include 
#include "inc/hw_ca.h"
#include "volatile/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/ca.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"

#include "driverlib/pintru32_itude_intru32"






;include "volatile dio_u32uitude_intru32u_uidu_u.u.ut
= 32nuidi20_intru_u_u.u32u_intru_uidu_u32u_u.u.u.u.idu.u.u.u32ut = volt_u32uidu.u.u.u.u32uuuuuu.idu.u.u32u.u.u.u.u.u.u32u.uidio t = volatile u.uidi20_u.u.u.u.u.u.u.

volatile bMsg_BMsgFlag = 0;

tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2
;tCANMsgObject g_sCANMsgObject3;

uint8_t g_pui8Msg1[4]={0、0、0、0、0};
uint2、i2、i2 =}
uint8_t g_pui8Msg3[6]={3、3、3、3、3、3、 3};
uint8_t g_pui8Msg4[8]={4、4、4、5、 5、5、5};

void InitConsole (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、16000000);
}

void PrintCANMessageInfo (tCANMsgObject * psCANMsg、uint32_t ui32MsgObj)
{
unsigned int uIdx;

UARTprintf ("发送 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 SimpleDelay (void)
{
SysCtlDelay (16000000 / 3);
}

void CANIntHandler (void)
{
uint32_t ui32Status;

ui32Status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);

if (ui32Status = CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet (CAN1_base、CAN_STS_CONTROL);
G_bErrFlag = 1;
}

否则、如果(ui32Status = 1)
{
CANIntClear (CAN1_base、1);
G_ui32Msg1Count++;
G_bErrFlag = 0;
}

否则 if (ui32Status = 2)
{
CANIntClear (CAN1_base、2);
G_ui32Msg2Count++;
G_bErrFlag = 0;
}

否则 if (ui32Status = 3)
{
CANIntClear (CAN1_base、3);
G_ui32Msg3Count++;
G_bMsgObj3Sent = 1;
G_bErrFlag = 0;
}

其他
{
}
}

int main (void)
{
uint32_t ui32SysClock;

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_16MHz |
SYSCTL_OSC_INT |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
InitConsole();

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralDisable (SYSCTL_Periph_CAN1);
SysCtlPeripheralReset (SYSCTL_Periph_CAN1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、ui32SysClock、50000);
CANIntRegister (CAN1_base、CANIntHandler);
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);

G_sCANMsgObject1.ui32MsgID = 0x1001;
G_sCANMsgObject1.ui32MsgIDMask = 0;
G_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject1.ui32MsgLen = sizeof (g_pui8Msg1);
G_sCANMsgObject1.pui8MsgData = g_pui8Msg1;

G_sCANMsgObject2.ui32MsgID = 0x2001;
G_sCANMsgObject2.ui32MsgIDMask = 0;
G_sCANMsgObject2.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject2.ui32MsgLen = sizeof (g_pui8Msg2);
G_sCANMsgObject2.pui8MsgData = g_pui8Msg2;

for (;;)
{
PrintCANMessageInfo (&g_sCANMsgObject1、1);
CANMessageSet (CAN1_base、1、&g_sCANMsgObject1、MSG_OBJ_TYPE_TX);

PrintCANMessageInfo (&g_sCANMsgObject2、2);
CANMessageSet (CAN1_base、2、&g_sCANMsgObject2、MSG_OBJ_TYPE_TX);

G_sCANMsgObject3.ui32MsgID = 0x3001;
G_sCANMsgObject3.ui32MsgIDMask = 0;
G_sCANMsgObject3.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject3.ui32MsgLen = sizeof (g_pui8Msg3);
G_sCANMsgObject3.pui8MsgData = g_pui8Msg3;

G_bMsgObj3Sent = 0;

PrintCANMessageInfo (&g_sCANMsgObject3、3);
CANMessageSet (CAN1_base、3、&g_sCANMsgObject3、MSG_OBJ_TYPE_TX);

while (!g_bMsgObj3Sent)
{
}

G_sCANMsgObject3.ui32MsgID = 0x3002;
G_sCANMsgObject3.ui32MsgIDMask = 0;
G_sCANMsgObject3.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject3.ui32MsgLen = sizeof (g_pui8Msg4);
G_sCANMsgObject3.pui8MsgData = g_pui8Msg4;

PrintCANMessageInfo (&g_sCANMsgObject3、3);
CANMessageSet (CAN1_base、3、&g_sCANMsgObject3、MSG_OBJ_TYPE_TX);

SimpleDelay();

if (g_bErrFlag)
{
UARTprintf ("错误-电缆已连接?\n");
}
其他
{
UARTprintf ("总数=%u\n"、
g_ui32Msg1Count + g_ui32Msg2Count + g_ui32Msg3Count);
}

(*(uint32_t *) g_pui8Msg1)++;
(*(uint32_t *) g_pui8Msg2)++;
(*(uint32_t *) g_pui8Msg3)++;
(*(uint32_t *)&g_pui8Msg4[0])++;
(*(uint32_t *)&g_pui8Msg4[4])-;

UARTprintf ("\n\n");
}


}

我注意到这两个问题:

(1)这些参数不会递增:G_ui32Msg1Count、 g_ui32Msg2Count、 g_ui32Msg3Count  

(2)程序在 while (!g_bMsgObj3Sent)之前卡住。 但是、如果我移除该循环、则正在发送消息、但参数 g_ui32Msg1Count、 g_ui32Msg2Count、 g_ui32Msg3Count 仍不会更新

请帮助我解决此问题

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

    根据海报 Robert 的要求/方向-您以正确(清晰可辨)的方式展示了您的代码-这很好。

    您列出的"问题参数"全部(可能)更新(仅限 CAN 接口处理程序中的)。    

    因此、您不应该:

    • 验证是否输入了 CAN 处理程序?
    • 如果事实证明是正确的-"ui32Status"(曾经)是否等于"1、2或3"?   (需要这些值才能实现所需的增量)

    您会注意到、"程序在  while (!g_bMsgObj3Sent)之前卡住"-但您没有告诉我们发生这种"卡住"的确切位置- 以及该位置是否证明是恒定的。

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

    感谢您使用粘贴代码、它确实有所帮助。

    第一条评论,匈牙利记法不为你做任何恩惠。 我花了一段时间才找到您提到的"参数"、尤其是因为它们不是参数而是全局变量。

    第二个注释、您似乎没有处理多个中断同时发生的情况。

    第三、您如何告知计数未更新?

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    确实是-"海报如何提取此类参数/变量信息?"

    "继续"是指"监控"变量"ui32Status"非常有意义...