Other Parts Discussed in Thread: TCAN4550
我已经调通了SPI通信,可以读到期间ID和寄存器。但是当我发送CAN数据时,发送失败。Error Counter Register (address = h1040)的值为0x000100D8,Protocol Status Register (address = h1044)的值为0x0000076D,即Protocol Status Register的LEC[2:0]值为0x101,我不知道为什么会这样。请帮助我解决CAN发送问题,谢谢。
软件:将sllc469b的demo移植到了stm32f407,mcan初始化即CAN发送部分如下
/*
* Configure the TCAN4550
*/
void TCAN4550_CAN_Init(void)
{
// TCAN4x5x_Device_ClearSPIERR(); // Clear any SPI ERR flags that might be set as a result of our pin mux changing during MCU startup
Tcan_Ir_Err_Clear = 1;
TCAN4550_Interrupt_Clear();
/* Step one attempt to clear all interrupts */
TCAN4x5x_Device_Interrupt_Enable dev_ie = {0}; // Initialize to 0 to all bits are set to 0.
TCAN4x5x_Device_ConfigureInterruptEnable(&dev_ie);
if (dev_ir.PWRON) // If the Power On interrupt flag is set
TCAN4x5x_Device_ClearInterrupts(&dev_ir); // Clear it because if it's not cleared within ~4 minutes, it goes to sleep
/* Configure the CAN bus speeds */
TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {0}; // 1Mbps arbitration with a 40 MHz crystal ((40E6 / 1) / (32 + 8) = 1E6)
TCANNomTiming.NominalBitRatePrescaler = 4;
TCANNomTiming.NominalTqBeforeSamplePoint = 8;
TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {0}; // 5 Mbps CAN FD with a 40 MHz crystal (40E6 / (6 + 2) = 5E6)
TCANDataTiming.DataBitRatePrescaler = 1;
TCANDataTiming.DataTqBeforeSamplePoint = 6;
TCANDataTiming.DataTqAfterSamplePoint = 2;
/* Configure the MCAN core settings */
TCAN4x5x_MCAN_CCCR_Config cccrConfig = {0}; // Remember to initialize to 0, or you'll get random garbage!
cccrConfig.FDOE = 1; // CAN FD mode enable
cccrConfig.BRSE = 1; // CAN
/* Configure the default CAN packet filtering settings */
TCAN4x5x_MCAN_Global_Filter_Configuration gfc = {0};
gfc.RRFE = 1; // Reject remote frames (TCAN4x5x doesn't support this)
gfc.RRFS = 1; // Reject remote frames (TCAN4x5x doesn't support this)
gfc.ANFE = TCAN4x5x_GFC_REJECT;
TCAN4x5x_MRAM_Config MRAMConfiguration = {0};
MRAMConfiguration.SIDNumElements = 2;
MRAMConfiguration.XIDNumElements = 1;
MRAMConfiguration.Rx0NumElements = 4;
MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data;
MRAMConfiguration.Rx1NumElements = 2;
MRAMConfiguration.Rx1ElementSize = MRAM_64_Byte_Data;
MRAMConfiguration.RxBufNumElements = 0;
MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data;
MRAMConfiguration.TxEventFIFONumElements = 0;
MRAMConfiguration.TxBufferNumElements = 2;
MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data;
Tcan4550_Var.Protect = TCAN4x5x_MCAN_EnableProtectedRegisters();
TCAN4550_Power_Control_Reg_Status = AHB_READ_32(REG_MCAN_CCCR);
TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig);
TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc);
TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming);
TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming);
TCAN4x5x_MRAM_Clear();
TCAN4x5x_MRAM_Configure(&MRAMConfiguration);
TTCAN4x5x_MCAN_DisableProtectedRegisters();
TCAN4x5x_MCAN_Interrupt_Enable mcan_ie = {0};
mcan_ie.RF0NE = 1;
mcan_ie.RF1NE = 1;
TCAN4x5x_MCAN_ConfigureInterruptEnable(&mcan_ie);
TCAN4x5x_MCAN_SID_Filter SID_ID0 = {0};
SID_ID0.SFT = TCAN4x5x_SID_SFT_CLASSIC;
SID_ID0.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;
SID_ID0.SFID1 = 0x1;
SID_ID0.SFID2 = 0x7FF;
TCAN4x5x_MCAN_WriteSIDFilter(0, &SID_ID0);
TCAN4x5x_MCAN_SID_Filter SID_ID1 = {0};
SID_ID1.SFT = TCAN4x5x_SID_SFT_CLASSIC;
SID_ID1.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;
SID_ID1.SFID1 = 0x7FF;
SID_ID1.SFID2 = 0x7FF;
TCAN4x5x_MCAN_WriteSIDFilter(1, &SID_ID1);
TCAN4x5x_MCAN_XID_Filter XID_ID = {0};
XID_ID.EFT = TCAN4x5x_XID_EFT_CLASSIC;
XID_ID.EFEC = TCAN4x5x_XID_EFEC_PRIORITYSTORERX1;
XID_ID.EFID1 = 0x8080;
XID_ID.EFID2 = 0x1FFFFFFF;
TCAN4x5x_MCAN_WriteXIDFilter(0, &XID_ID);
TCAN4x5x_DEV_CONFIG devConfig = {0};
devConfig.SWE_DIS = 1;
devConfig.DEVICE_RESET = 0;
devConfig.WD_EN = 0;
devConfig.nWKRQ_CONFIG = 0;
devConfig.INH_DIS = 1;
devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1;
devConfig.FAIL_SAFE_EN = 0;
devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO;
devConfig.WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT;
devConfig.WD_BIT_RESET = 0;
devConfig.nWKRQ_VOLTAGE = 0;
devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_MCAN_INT0;
devConfig.CLK_REF = 1;
devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES;
TCAN4x5x_Device_Configure(&devConfig);
TCAN4x5x_Device_SetMode(TCAN4x5x_DEVICE_MODE_NORMAL);
TCAN4x5x_MCAN_ClearInterruptsAll();
}
void TCAN4550_Communication_Test(void)
{
if(TCAN_Send)
{
/* Define the CAN message we want to send*/
TCAN4x5x_MCAN_TX_Header header = {0};
uint8_t data[4] = {0x55, 0x66, 0x77, 0x88};
header.DLC = MCAN_DLC_8B;
header.ID = 0x144;
header.FDF = 0;
header.BRS = 1;
header.EFC = 0;
header.MM = 0;
header.RTR = 0;
header.XTD = 0;
header.ESI = 0;
TCAN4x5x_MCAN_WriteTXBuffer(0, &header, data);
TCAN4x5x_MCAN_TransmitBufferContents(0);
TCAN_Send = 0;
}
}
硬件部分:OSC1的时钟源为定时器PWM波