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.

[参考译文] TCAN4550:TCAN4550问题

Guru**** 2941480 points

Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/836043/tcan4550-tcan4550-problem

器件型号:TCAN4550

大家好、

配置 TCAN4550后、输出波形如下:

问题是为什么会发生这种情况。 你有什么建议吗? 代码如下:

/*********
*目前一切都适用于 TCAN4550 *
(小部分 /
init_cand();//运行主 MCAN 配置序列。 大部分配置都在这里!

/*定义我们要发送的 CAN 消息*/
TCAN4x5x_MCAN_TX_Header 接头={0};//请记住初始化为0、否则您将获得随机垃圾!
uint8_t data[8]={0xff、0xff、0xff、0xff、0xff、0xff、0x55、0x55};//定义数据有效载荷
header.DLC = MCAN_DLC_8B;//将 DLC 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节数据数组传递到 WriteTXFIFO 函数中、仅读取前8个字节)
header.ID = 0x05f;//设置 ID
header.FDF = 0;// CAN FD 帧被启用1.
header.BRS = 0;//位速率开关被启用
header.EFC = 0;
插头.mm = 0;
header.RTR = 0;
header.XTD = 0;//本示例中未使用扩展 ID
header.ESI = 0;//错误状态指示器


TCAN4x5x_MCAN_WriteTXBuffer (0、标头、数据);//此函数实际上将标头和数据有效载荷写入 TCAN 指定 TX 队列编号中的 MRAM。 它返回写入 TXBAR 所需的位、
//但不一定要求您使用它。 在本例中、我们不会这样做、这样我们就可以在稍后发送排队的数据。

TCAN4x5x_MCAN_TransmitBufferContents (0);//请求发送 TX 缓冲区0

配置如下:μ A

无效
init_can (void)

uint32_t a;
TCAN4x5x_Device_ClearSPIERR();//清除由于我们的引脚多路复用器在 MCU 启动期间发生变化而可能设置的任何 SPI ERR 标志
A=AHB_READ_32 (REG_SPI_DEVICE_ID0);
A=AHB_READ_32 (REG_SPI_DEVICE_ID1);
/*第一步尝试清除所有中断*/
TCAN4x5x_Device_Interrupt_Enable DEV_IE ={0};//初始化为0、所有位都设置为0。
TCAN4x5x_Device_ConfigureInterruptEnable (&dev_ie);//为简单起见、禁用所有与 MCAN 无关的中断

TCAN4x5x_Device_Interrupts DEV_ir ={0};//设置一个新的 MCAN IR 对象以方便进行中断检查
TCAN4x5x_Device_ReadInterrupts (&dev_ir);//请求使用当前器件(而非 MCAN)中断值更新结构

if (DEV_ir.PWRON)//如果加电中断标志被置位
TCAN4x5x_Device_ClearInterrupts (&dev_ir);//将其清除、因为如果未在~4分钟内清除、它将进入睡眠状态

/*配置 CAN 总线速度*/
TCAN4x5x_MCAN_Nominal Timing_Simple TCANNomTiming ={0};//使用40MHz 晶体进行500k 仲裁(((40E6 / 2)/(32 + 8)= 500E3)
TCANNomTiming.NominalBitRatePrescaler = 2;
TCANNomTiming.NominalTqBeforeSamplePoint = 32;
TCANNomTiming.NominalTqAfterSamplePoint = 8;

TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};//具有40MHz 晶体的2Mbps CAN FD (40E6 /(15 + 5)= 2E6)
TCANDataTiming.DataBitRatePrescaler = 1;
TCANDataTiming.DataTqBeforeSamplePoint = 15;
TCANDataTiming.DataTqAfterSamplePoint = 5;

/*配置 MCAN 内核设置*/
TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//请记住初始化为0、否则您将获得随机垃圾!
cccrConfig.FDOE = 0;// CAN FD 模式启用
cccrConfig.BRSE = 0;// CAN FD 比特率开关使能

/*配置默认 CAN 数据包过滤设置*/
TCAN4x5x_MCAN_Global_Filter_Configuration GFC ={0};
GFC.RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.ANFE = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收扩展 ID 消息(29位 ID)
GFC.ANFS = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入的消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收标准 ID 消息(11位 ID)

/*
*在下一个配置块中、我们将 MCAN 内核设置为具有:
*- 1个 SID 过滤器滤芯
*- 1个 XID 滤波器元素
*- 5个 RX FIFO 0元素
*- RX FIFO 0支持高达64字节的数据有效载荷
*- RX FIFO 1和 RX 缓冲区不会有任何元素、但我们仍会设置它们的数据有效载荷大小、即使这不是必需的
*-无 TX 事件 FIFO
*- 2个传输缓冲器、支持高达64字节的数据有效载荷
*
TCAN4x5x_MRAM_Config MRAMConfiguration ={0};
MRAMConfiguration.SIDNumElements = 1;//标准 ID 元素数量,必须为定义的每个元素将过滤器写入 MRAM
MRAMConfiguration.XIDNumElements= 1;//扩展 ID 元素数量,必须为每个定义的元素将过滤器写入 MRAM
MRAMConfiguration.Rx0NumElements = 5;// RX0元素数量
MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data;// RX0数据有效载荷大小
MRAMConfiguration.Rx1NumElements = 0;// RX1元素数量
MRAMConfiguration.Rx1元件大小= MRAM_64_Byte_Data;// RX1数据有效载荷大小
MRAMConfiguration.RxBufNumElements = 0;// RX 缓冲区元素数量
MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data;// RX 缓冲区数据有效载荷大小
MRAMConfiguration.TxEventFIFONUMElements = 0;// TX 事件 FIFO 元素数量
MRAMConfiguration.TxBufferNumElements = 2;// TX 缓冲区元素数量2.
MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data;// TX 缓冲区数据有效载荷大小


/*使用上述设置配置 MCAN 内核,此块中的更改是写保护寄存器,*
*因此、一次执行所有操作是最有意义的、因此我们只解锁并锁定一次*/

TCAN4x5x_MCAN_EnableProtectedRegisters ();//首先使受保护的寄存器可访问
TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig);//启用 FD 模式和位速率切换
TCAN4x5x_MCAN_ConfigureGlobalFilter (&GFC);//配置全局过滤器配置(默认 CAN 消息行为)
TCAN4x5x_MCAN_ConfigureNominalTiming_Simple (&TCANNomTiming);//设置标称值/仲裁位时序
TCAN4x5x_MCAN_ConfigureDataTiming_Simple (&TCANDataTiming);//设置 CAN FD 时序
TCAN4x5x_MRAM_CLEAR ();//清除所有 MRAM (向所有 MRAM 写入0)
TCAN4x5x_MRAM_Configure (&MRAMConfiguration);//设置与 MRAM 配置相关的适用寄存器
TCAN4x5x_MCAN_DisableProtectedRegisters ();//禁用受保护的写入并使器件退出初始化模式


/*设置我们要为 MCAN 启用的中断*/
TCAN4x5x_MCAN_Interrupt_Enable mCAN_ie ={0};//请记住初始化为0,否则会出现随机垃圾!
mCAN_ie.RF0NE = 1;// RX FIFO 0新消息中断使能

TCAN4x5x_MCAN_ConfigureInterruptEnable (&mCAN_IE);//启用相应的寄存器


/* Setup (设置)过滤器,此过滤器将把 ID 为0x055的任何邮件标记为优先级信息*/
TCAN4x5x_MCAN_SID_Filter SID_ID ={0};
SID_ID.SFT = TCAN4x5x_SID_SFT_Classic;// SFT:标准滤波器类型。 配置为经典滤波器
SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其作为优先级消息存储在 RX FIFO 0中
SID_ID.SFID1 = 0x055;// SFID1 (经典模式滤波器)
SID_ID.SFID2 = 0x7FF;// SFID2 (经典模式掩码)
TCAN4x5x_MCAN_WriteSIDFilter (0、&SID_ID);//写入 MRAM


/*将 ID 0x12345678存储为优先级消息*/
TCAN4x5x_MCAN_XID_Filter XID_ID ={0};
XID_ID.EFT = TCAN4x5x_XID_EFT_Classic;// EFT
XID_ID.EFEC = TCAN4x5x_XID_EFEC_PRIORITYSTORERX0;// EFEC
XID_ID.EFID1 = 0x12345678;// EFID1 (经典模式滤波器)
XID_ID.EFID2 = 0x1FFFFFFF;// EFID2 (经典模式掩码)
TCAN4x5x_MCAN_WriteXIDFilter (0、&XID_ID);//写入 MRAM

/*配置 TCAN4550 非 CAN 相关功能*/
TCAN4x5x_DEV_CONFIG devConfig ={0};//请记住初始化为0、否则您将获得随机垃圾!
devConfig.SWE_DIS = 0;//保持睡眠唤醒错误使能(它是禁用位,而不是使能位)
devConfig.device_reset = 0;//不请求软件复位
devConfig.WD_EN = 0;//看门狗被禁用
devConfig.nWKRQ_CONFIG = 0;// Mirror INH 函数(默认值)
devConfig.INH_DIS = 0;// INH 启用(默认值)
devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1;// MCAN nINT 1 (默认值)
devConfig.FAIL_SAFE_EN = 0;//禁用失效防护(默认)
devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO;// GPIO 设置为 GPO (默认)
devConfig.WD_action = TCAN4x5x_DEV_CONFIG_WDT_ACT_nINT;//看门狗设置中断(默认)
devConfig.WD_BIT_RESET = 0;//不复位看门狗
devConfig.nWKRQ_VOLTAGE = 0;//将 nWKRQ 设置为内部电压轨(默认值)
devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION;// GPO2无行为(默认)
devConfig.CLK_REF = 1;//输入晶振是一个40MHz 晶振(默认)
devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_Bot_edges;//唤醒引脚可由任一边沿触发(默认)
TCAN4x5x_Device_Configure (&devConfig);//使用上述配置配置配置器件

TCAN4x5x_Device_SetMode (TCAN4x5x_DEVICE_MODE_NORMAL);//设置为正常模式、因为配置已完成。 这条线路将打开收发器

TCAN4x5x_MCAN_ClearInterruptsAll();//重置所有 MCAN 中断(不包括任何 SPIERR 中断)

此致、
Amy

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

    您好、Amy、

    您能否告诉我们 CAN 线路(CANH 和 CANL)上连接了什么?  通常情况下、在 CANH 和 CANL 之间应放置两个120欧姆电阻、电缆每侧各一个电阻。  从波形中看、可能不存在这种情况。  您通常还需要另一个 CAN 设备来与之通信。  否则、在一个帧结束时、TCAN4550将不会接收到一个"确认"、并且可能会考虑帧发送错误。

    此致、
    最大