英飞凌
直播中

秋风宜人

13年用户 872经验值
擅长:基础元器件
私信 关注

CAN传输在TC233中不起作用是怎么回事?

CAN 传输在 TC233 中不起作用,我使用了 iLLD 示例源中的代码 进行 CAN 初始化。
我将 P14_0  P14_1 用于 TC233 的 CAN Tx 和 Rx 引脚
下面是我分享的代码

/********************************************************************************************************************
* file MULtiCAN.c
* copyright Copyright (C) Infineon Technologies AG 2019
*
* 使用本文件须遵守(i)您或您在
* 正常业务过程中的公司与(ii)英飞凌科技公司或其许可方之间商定的使用条款。 如果且只要未就
* 使用条款达成一致,则使用本文件须遵守以下规定:
*
* Boost Software License - Version 1.0 - August 17th, 2003
*
* 特此免费允许任何获得本许可证所涵盖的软件副本和
* 随附文档("软件" )的个人或组织使用、复制、展示、分发、执行、
* 和传输本软件,以及制作本软件的衍生作品,并允许获得
* 软件的第三方这样做,但须遵守以下规定:
*
* 本软件中的版权声明和本完整声明,包括上述许可授予、本限制
* 和以下免责声明,必须包含在本软件的全部或部分副本以及本软件的所有
* 衍生作品中,除非这些副本或衍生作品仅以
* 源语言处理器生成的机器可执行目标代码的形式存在。
*
* 本软件按原样提供"" ,不作任何明示或暗示的保证,包括但不限于
* 对适销性、特定用途的适用性、所有权和非侵权性的保证。 在任何情况下,
* 版权持有者或分发本软件的任何人都不对因本软件或本软件的使用或其他
* 交易而引起、产生或与之相关的任何损害或其他责任承担责任,不论是
* 合同、侵权行为还是其他责任。
*********************************************************************************************************************/
/*********************************************************************************************************************/
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/
#include"MULTICAN.h"
#include"rtc.h"/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/
AppMulticanType g_multican; /* Global MULTICAN configuration and control structure */
AppLedType g_led;/* 全局 LED 配置和控制结构 */
uint32 Battery_Saving_Mode, Low_Power_Mode, Mode,Motor_ON_OFF, MCU_ON_OFF;
/*********************************************************************************************************************/
/*--------------------------------------------- 函数实现----------------------------------------------*/
/*********************************************************************************************************************/
/*
* 该宏:
* - 将链接器部分定义为 .intvec_tc<向量 编号>_ .
* - 为中断函数定义编译器特定属性。
* - 将中断服务例程定义为 ISR 功能。
*
* IFX_INTERRUPT(isr, vectabNum, priority)
* - isr:ISR 函数名称。
* vectabNum:矢量表编号。
* 优先级:中断优先级。 有关更多详细信息,请参阅 MIDI 规范)*/
IFX_INTERRUPT(canIsrTxHandler, 0, ISR_PRIORITY_CAN_TX);
//IFX_INTERRUPT(canIsrRxHandler, 0, ISR_PRIORITY_CAN_RX);
IFX_INTERRUPT(canIsrRxHandler, 0, ISR_PRIORITY_CAN_RX);
/* TX 中断发生后调用中断服务例程 (ISR)。
* LED1 亮起,表示 CAN 报文传输成功。
*/
void canIsrTxHandler(void)
{
/* Just to indicate that the CAN message has been transmitted by turning on LED1 */
// IfxPort_setPinLow(g_led.led1.port, g_led.led1.pinIndex);
IfxPort_togglePin(g_led.led2.port, g_led.led2.pinIndex);
}

void canIsrRxHandler(void)
{
volatile IfxMultican_Status readStatus[10];
memset(readStatus, 0, 10*sizeof(readStatus[0]));
for(int i = 1; i<= 2; i++)
{
Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(g_multican.canDstMsgObj.node->mcan、 i);
if(hwObj->STAT.B.NEWDAT != 0)
{
IfxPort_togglePin(g_led.led2.port, g_led.led2.pinIndex);
g_multican.canDstMsgObj.msgObjId = i;
readStatus[i-1] = IfxMultican_Can_MsgObj_readMessage( g_multican.canDstMsgObj,  g_multican.rxMsg);
}
}
}
/* 一旦产生 RX 中断,就会调用中断服务例程 (ISR)。
* 将接收到的 CAN 报文内容与发送的 CAN 报文内容进行比较
*,如果成功,则打开 LED2 指示 CAN 报文接收成功。
*/
/*初始化 MULTICAN 模块、节点和与本应用程序用例相关的消息对象的函数 */
void initMultican(void)
{
IfxMultican_Can_initModuleConfig( g_multican.canConfig, MODULE_CAN);
g_multican.canConfig.nodePointer[TX_INTERRUPT_SRC_ID].priority = ISR_PRIORITY_CAN_TX;
g_multican.canConfig.nodePointer[RX_INTERRUPT_SRC_ID].priority = isr_priority_can_rx;
IfxMultican_Can_initModule( g_multican.can, g_multican.canConfig);
IfxMultican_Can_Node_initConfig( g_multican.canNodeConfig, g_multican.can);
// g_multican.canNodeConfig.txPin = IfxMultican_TXD0_P20_8_OUT;
// g_multican.canNodeConfig.rxPin = IfxMultican_RXD0B_P20_7_IN;
g_multican.canNodeConfig.txPin = IfxMultican_TXD1_P14_0_OUT;
g_multican.canNodeConfig.rxPin = IfxMultican_RXD1B_P14_1_IN;
g_multican.canNodeConfig.loopBackMode = FALSE;
g_multican.canNodeConfig.nodeId = IfxMultican_NodeId_1;
IfxMultican_Can_Node_init( g_multican.canSrcNode, g_multican.canNodeConfig);
IfxMultican_Can_Node_init( g_multican.canDstNode, g_multican.canNodeConfig);
TX_CAN_ID_Init();
RX_CAN_ID_Init();
//
// g_multican.canMsgObjConfig.msgObjId = DST_MESSAGE_OBJECT_ID+2;
// g_multican.canMsgObjConfig.messageId = CAN_MESSAGE_ID+2;
//
// IfxMultican_Can_MsgObj_init( g_multican.canDstMsgObj, g_multican.canMsgObjConfig);
IfxMultican_Can_MsgObj_initConfig( g_multican.canMsgObjConfig, g_multican.canSrcNode);
/*** CAN TX 的 msgObjId 必须不同于所有 CAN RX msgObjId ***/
g_multican.canMsgObjConfig.msgObjId = (IfxMultican_MsgObjId)TX_INTERRUPT_SRC_ID;
g_multican.canMsgObjConfig.messageId = CAN_MESSAGE_ID;
g_multican.canMsgObjConfig.frame = IfxMultican_Frame_transmit;
g_multican.canMsgObjConfig.txInterrupt.enabled = TRUE;
g_multican.canMsgObjConfig.txInterrupt.srcId = TX_INTERRUPT_SRC_ID;
IfxMultican_Can_MsgObj_init( g_multican.canSrcMsgObj, g_multican.canMsgObjConfig);
}

void transmitCanMessage(void){
const uint32 dataLow = 0xDEADBEEF;
const uint32 dataHigh = 0xBA5EBA11;
/* RX 信息无效 */
IfxMultican_Message_init( g_multican.rxMsg、
INVALID_ID_VALUE,
INVALID_DATA_VALUE,
INVALID_DATA_VALUE,
g_multican.canMsgObjConfig.control.messageLen);
/* 注意
* 需要在发送 CAN_Message 之前指定正确的 MsgObjID
* -> RX-ISR 函数只响应属于该 MsgObjID 的 MsgID
*/
// g_multican.canDstMsgObj.msgObjId = DST_MESSAGE_OBJECT_ID;
/* TX 报文初始化 */
IfxMultican_Message_init( g_multican.txMsg、
CAN_TX_MCU_BAT_MODE,
dataLow,
dataHigh,
g_multican.canMsgObjConfig.control.messageLen);
/* 使用先前定义的 TX 报文内容发送 CAN 报文 */
IfxMultican_Can_MsgObj_sendMessage( g_multican.canSrcMsgObj, g_multican.txMsg);
// while( IfxMultican_Status_notSentBusy ==
// IfxMultican_Can_MsgObj_sendMessage( g_multican.canSrcMsgObj, g_multican.txMsg) )
// {
// }
}
void initLed(void){
/* ======================================================================
* 配置连接到 LED 的引脚:
* ======================================================================
* - 定义 GPIO 端口
* - 定义连接到 LED 的 GPIO 引脚
* - 定义一般 GPIO 引脚用法(不使用备用函数)
* - 定义焊盘驱动器强度
* ======================================================================
*/
g_led.led1.port = MODULE_P13;
g_led.led1.pinIndex = 0;
g_led.led1.mode = IfxPort_OutputIdx_general;
g_led.led1.padDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1;
g_led.led2.port = MODULE_P13;
g_led.led2.pinIndex = 1;
g_led.led2.mode = IfxPort_OutputIdx_general;
g_led.led2.padDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1;
/* 将与 LED 相连的引脚初始化为"HIGH"; 将 LED 保持关闭默认状态 */
IfxPort_setPinHigh(g_led.led1.port、 g_led.led1.pinIndex);
IfxPort_setPinHigh(g_led.led2.port.PinHigh) g_led.led2.pinIndex);
/* 为连接到 LED 的两个引脚设置引脚输入/输出模式 */
IfxPort_setPinModeOutput(g_led.led1.port.PinModeOutput(g_led.led1.port.PinModeOutput)) g_led.led1.pinIndex、 IfxPort_OutputMode_pushPull, g_led.led1.mode);
IfxPort_setPinModeOutput(g_led.led2.port.PinModeOutput) g_led.led2.pinIndex、 IfxPort_OutputMode_pushPull, g_led.led2.mode);
/* 为连接到 LED 的两个引脚设置焊盘驱动模式 */
IfxPort_setPinPadDriver(g_led.led1.port、 g_led.led1.pinIndex、 g_led.led1.padDriver);
IfxPort_setPinPadDriver(g_led.led2.port.PinPadDriver) g_led.led2.pinIndex、 g_led.led2.padDriver);
}

回帖(1)

王磊

2024-5-22 17:48:19
根据您提供的信息,您的问题是CAN传输在TC233中不起作用。为了解决这个问题,我们可以按照以下步骤进行排查:

1. 检查硬件连接:首先,请确保您的TC233开发板的CAN Tx和Rx引脚(P14_0和P14_1)连接正确。如果连接错误,CAN传输可能无法正常工作。

2. 检查CAN初始化代码:请确保您使用的CAN初始化代码是正确的,并且与您的硬件配置相匹配。您可以查看iLLD示例源代码中的CAN初始化部分,确保所有参数都设置正确。

3. 检查CAN配置:请检查您的CAN配置,包括波特率、同步跳线等。确保这些配置与您的网络和设备兼容。

4. 使用示波器或逻辑分析仪:为了进一步诊断问题,您可以使用示波器或逻辑分析仪观察CAN总线上的信号。这将帮助您确定问题是否出在硬件上。

5. 检查CAN驱动:请确保您的CAN驱动程序已正确安装并配置。如果驱动程序有问题,可能会导致CAN传输失败。

6. 检查软件逻辑:请检查您的软件逻辑,确保CAN传输请求和响应处理正确。如果软件逻辑有误,可能会导致CAN传输失败。

7. 尝试其他示例代码:如果以上步骤都无法解决问题,您可以尝试使用其他示例代码或库来实现CAN传输。这将帮助您确定问题是否出在您的代码上。

8. 寻求技术支持:如果问题仍然存在,您可以联系英飞凌技术支持团队寻求帮助。他们可能会提供更专业的建议和解决方案。

通过以上步骤,您应该能够找到导致CAN传输在TC233中不起作用的原因,并采取相应的措施解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分