主题中讨论的其他器件:TCAN4550
我们可以使用 tcan4550成功发送8字节数据,但 canfd 消息无法发送,列表代码
配置部分
/*
*配置 TCAN4550
*
void TCAN4550_Init (void)
{
TCAN4x5x_Device_ClearSPIERR();//清除由于我们的引脚多路复用器在 MCU 启动期间发生变化而可能设置的任何 SPI ERR 标志
/*步骤1尝试清除所有中断*/
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};
TCANNomTiming.NominalBitRatePrescaler = McanArbRateSet[0];
TCANNomTiming.NominalTqBeforeSamplePoint = McanArbRateSet[1];
TCANNomTiming.NominalTqAfterSamplePoint = McanArbRateSet[2];
TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};
TCANDataTiming.DataBitRatePrescaler = McanDatRateSet[0];
TCANDataTiming.DataTqBeforeSamplePoint = McanDatRateSet[1];
TCANDataTiming.DataTqAfterSamplePoint = McanDatRateSet[2];
/*配置 MCAN 内核设置*/
TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//请记住初始化为0、否则您将获得随机垃圾!
cccrConfig.FDOE = 1;// CAN FD 模式启用
cccrConfig.BRSE = 1;// CAN FD 比特率开关使能
cccrConfig.NISO = 0;
cccrConfig.DAR = 0;
/*配置默认 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 = 16;//标准 ID 元素数量,必须为定义的每个元素将过滤器写入 MRAM
MRAMConfiguration.XIDNumElements= 0;//扩展的 ID 元素数量,必须为每个定义的元素将一个过滤器写入 MRAM
MRAMConfiguration.Rx0NumElements = 16;// 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 = 4;// TX 事件 FIFO 元素数量
MRAMConfiguration.TxBufferNumElements = 4;// TX 缓冲区元素数量
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新消息中断使能
mCAN_e.TCE = 1;//传输完成中断使能
mCAN_ie.BOE = 1;// Bus_Off 状态中断使能
mCAN_ie.TOOE = 1;//发生超时中断使能
mCAN_ie.MRAFE = 1;//消息 RAM 访问失败中断使能
mCAN_ie.TFEE = 1;// Tx FIFO 空中断使能
// mCAN_e.word = 0XFFFFFFFF;
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_EDGE;//唤醒引脚可由任一边沿触发(默认)
TCAN4x5x_Device_Configure (&devConfig);//使用上述配置配置配置器件
TCAN4x5x_Device_SetMode (TCAN4x5x_DEVICE_MODE_NORMAL);//设置为正常模式、因为配置已完成。 这条线路将打开收发器
TCAN4x5x_MCAN_ClearInterruptsAll();//重置所有 MCAN 中断(不包括任何 SPIERR 中断)
}
和测试部件
DEVMODE = TCAN4x5x_Device_ReadMode ();
TCAN4550_Init();
DEVMODE = TCAN4x5x_Device_ReadMode ();
TCAN4x5x_MCAN_Interrupt_Enable Int_Config ={0};
TCAN4x5x_MCAN_ReadInterruptEnable (&Int_Config);//读取中断寄存器并确保配置正确
/***/
TCAN4x5x_MCAN_TX_Header 接头={0};//请记住初始化为0、否则您将获得随机垃圾!
标头=标头;
header.ID = 0x0636;//设置 ID
header.DLC = MCAN_DLC_16B;//将 DLC 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节数据数组传递到 WriteTXFIFO 函数中、仅读取前8个字节)
header.FDF = 1;// CAN FD 帧被启用
header.BRS = 1;//位速率开关被启用
header.EFC = 0;
插头.mm = 0;
header.RTR = 0;
header.XTD = 0;//本示例中未使用扩展 ID
header.ESI = 0;//错误状态指示器
uint32 reg = 0;
while (1)
{
TCAN4x5x_MCAN_ReadInterrupts (&MCAN_IR);//读取中断寄存器
TCAN4x5x_MCAN_ClearInterruptsAll();
TCAN4x5x_MCAN_ReadInterrupts (&MCAN_IR);//读取中断寄存器
TCAN4x5x_MCAN_ReadInterruptEnable (&Int_Config);//读取中断寄存器并确保配置正确
PaloadData[0]=循环控制;
loopctrl ++;
DataNum = TCAN4x5x_MCAN_WriteTXBuffer (0、&HEADER、PaloadData);//此行会将数据和标头写入 TX FIFO 1
SendFlg = TCAN4x5x_MCAN_TransmitBufferContents (0);//请求发送 TX 缓冲区1
osDelay (1000);
}
是否存在任何错误,请