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.
您好!
我使用 Infineon TLE9869QXA20通过 SPI 向 TCAN4550的寄存器写入数据。 我已经配置了 TCAN4550并希望发送消息、但我在 CANH 或 CANL 上没有得到可测量信号。
如果我在发送前读取寄存器0x10C4、我会得到值0x0000000A、如果我通过寄存器0x10D0发出写入命令、我会在之后读取寄存器0x10C4中的0x00010009。 因此、CAN 消息的发送应该已经成功、但我在示波器上看不到任何信号。
下面是我用于发送 CAN 消息的初始化代码和命令。
我希望能得到快速的回答、谢谢您。
相关信息
蒂莫祝福
//Initializerung 前两个十六进制值是地址、而不是写入字节
SPI_WRITE_1reg (0x10、0x18、0x00、0x00、0x00、 0x0B);
SPI_WRITE_1reg (0x10、0x84、0x00、0x02、0x00、 0x00);
SPI_WRITE_1reg (0x10、0x88、0x00、0x01、0x00、 0x08);
SPI_WRITE_1reg (0x10、0xA0、0x02、0x04、0x00、 0x10);
SPI_WRITE_1reg (0x10、0xB0、0x03、0x05、0x00、 0xF0);
SPI_WRITE_1reg (0x10、0xAC、0x00、0x00、0x00、 0x00);
SPI_WRITE_1reg (0x10、0xBC、0x00、0x00、0x00、 0x76);
SPI_WRITE_1reg (0x10、0xF0、0x02、0x03、0x02、 0x58);
SPI_WRITE_1reg (0x10、0xC0、0x0A、0x00、0x02、 0x70);
SPI_WRITE_1reg (0x10、0xC8、0x00、0x00、0x00、 0x07);
SPI_WRITE_1reg (0x10、0x1C、0x02、0x03、0x06、 0x01);
SPI_WRITE_1reg (0x10、0x18、0x00、0x00、0x00、 0x19);
SPI_WRITE_1reg (0x80、0x00、0x48、0xAA、0x78、 0xBB);
SPI_WRITE_2reg (0x80、0x08、0x20、0x00、0x11、 0x11、0x40、0x00、0x22、0x22);
SPI_WRITE_1reg (0x08、0x00、0xC8、0x00、0x04、 0xA8);
//发送代码
SPI_SEND_Receive (0x41、0x10、0xC4、0x01);
SPI_WRITE_1reg (0x82、0x70、0x02、0xA8、0x00、 0x00);
SPI_WRITE_1reg (0x82、0x74、0x01、0x04、0x00、 0x00);
SPI_WRITE_1reg (0x82、0x78、0x44、0x33、0x22、 0x11);
SPI_WRITE_1reg (0x10、0xD0、0x00、0x00、0x00、 0x01);
Timo、
应用工程师已收到此帖子的通知、并将作出相应的回复。 感谢您的耐心等待。
此致、
Eric Hackett
您好 Eric、
感谢你的答复。 我想问什么是当前状态?
您好、Timo、
分析每个函数调用的目的有点困难。 您是否能够使用TCAN4550演示软件中的驱动程序测试您的设置? 此演示中的 C 驱动程序包含每个器件寄存器的可读函数和结构、从而使配置和其他功能在代码中更具可读性。 main.c 文件还提供了可用于测试硬件设置的示例配置。
我不知道 SPI_WRITE_nreg ()函数是如何运行的,但前两个字段似乎是写入地址。 我还假设以下四个字段包含按降序(最高有效字节优先)写入的数据。 基于此布局、我不会看到共享代码有任何问题、但我无法检查此格式中的所有配置值。 我建议对每一个调用进行注释、以使配置更具可读性、因此每个寄存器写入的意图都是明确的。
请确保满足以下所有条件、以便正确配置器件:
此致、
Eric Schott
嗨、Eric、
您对我的代码的解释是正确的。
我检查了 Vsup、Vio 等各处的电压是否正确。
我的 SPI 通信也在工作。 我可以读取寄存器、当我写入寄存器并读取它们时、它会显示正确的内容。
但是、当我通过 SPI 写入或读取某个内容时、我会在 SDO 线路上获得寄存器0x0820[7:0]的状态、我认为那里有问题。 当我在初始化之前读取寄存器时、得到值0x89、当我在初始化之后读取寄存器时、始终得到值0xA9。 这意味着我有一个 SPI 错误和一个 CAN 错误、但我不知道这些错误应该在哪里或与什么相关。 我附上了一个寄存器读取命令示例。
您是否知道答案、这是我的 CAN 通信不起作用的原因?
感谢您的反馈。
相关信息
蒂莫祝福
此外、当我读取寄存器0x000C 时、我得到值0x0020000A
您好、Timo、
感谢您提供的额外信息和示波器截图。
它确实听起来像是 SPI 问题可能会阻止 CAN 的正确配置和使用。 来自中断寄存器和状态寄存器的值表明器件已识别 SPI_END_ERROR。 当 SPI 事务在未完成当前字节的情况下结束时、会导致这种情况。 一旦识别到这个中断、就应该将其清除(向相应的寄存器写入1)、这样以后发生的任何情况也可以被识别。
您共享的 SPI 接口范围快照似乎没有任何问题、不应导致 SPI_END_ERROR。 但是、之前的事务可能包含这样一个错误、并且状态标志自那时以来未被清除。 您是否能够在启动后捕获此器件的第一个 SPI 事务? 在某些系统中、我在第一个事务中看到了可能导致此类错误的来自 MCU 的杂散时钟脉冲。
当一个 SPI 事务被启动时、中断状态总是作为第一个字节被发送。 这是在数据表中的预期和说明。 图8-17 (TCAN4550-Q1数据表)展示了这一点。 示波器屏幕截图与此一致。
此致、
Eric Schott
尊敬的 Eric:
在第一个图像中、您可以看到两个电路板上启动电压后的第一个 SPI 读取请求的示波器图像。 对于寄存器0x0820、我得到值0x81、这意味着 VTWD 中断得到了、我将通过复位摆脱该中断。 但是、当我发送第二个 SPI 读取请求时、我再次得到值0x89、这意味着 SPI 错误。
在第二个图像中、您可以看到在 TCAN4550复位后、第一个 SPI 读取请求的示波器捕获。 对于寄存器0x0820、我得到值0x00、这意味着一切都将完美或? 但是、当我发送第二个 SPI 读取请求时、我得到值0x88、因此出现 SPI 错误。
您能看到错误来自哪里吗?
如前所述、我使用 AHB_WRITE_32 (0x000C、0x00200000)命令来清除中断标志。 之后、我还得到了寄存器0x0820的值0x00、因此它起作用。 但是、当我重新刷新 Infineon 板以加载新的读取或写入命令时、我既没有得到值0x88的错误。 这意味着、第一个 SPI 传输始终未正确执行、因此中断标志被置位。 但我不知道第一次传输到底有什么问题、也不知道如何解决。
相关信息
蒂莫祝福
我认为该错误源于这样一个事实、即 CS 在 Infineon 复位后直接设置为低电平、直到 Infineon 初始化完成。 TCAN4550已经将其视为通过 SPI 进行的第一次发送尝试、这是不是?
如果是、是否可以忽略此"首次发送"?
您好、Timo、
我正在查看您的回复、并将在明天回复您。
此致、
Eric Schott
您好、Timo、
我同意您在此处进行的第二次分析。 MCU 启动时 NCS 的初始置位将被视为 SPI 结束错误(由于未发送数据、帧不会在字节边界上结束)。 我们在这里的两个示波器快照中都看到了这个状态(状态寄存器000Ch 中的位21)。 我怀疑中断状态(81h 与00h)的差异是由于不同的复位情况-一个由电源完成(UV 标志设置)、另一个由复位完成。
由于我们无法将器件配置为忽略 nCS 断言的初始出现、因此我建议在启动后首先清除所有中断(向状态寄存器000Ch 写入1)。 一旦确认这些位被清除、器件的配置就可以再次开始。
我再次建议您考虑使用 TCAN4550驱动程序库 来提高此程序的可读性。 它仍将使用您已经实现的 SPI 读取和写入函数、但会将 TCAN4550寄存器和功能组织到命名变量和结构中、以便于使用、修改和调试。 如果您对此库有任何疑问、请告诉我。
此致、
Eric Schott
尊敬的 Eric:
正如您所说的、我现在使用了 TCAN4550 Libaray。 我重写了 SPI 函数以与 TLE9869配合使用、并复制了其余文件(TCAN4550.h、TCAN4550.c、TCAN4x5x_Data_Struct.h 和 TCAN4x5x_Reg.h)。 到目前为止、这也起了作用、我通过 SPI 也不再出现错误。
此外、到目前为止、我已经从演示代码的 main.c 中取出了我所需的所有内容、主要是 CAN_Init。 但我在 CAN 线路上仍然没有收到任何消息。 当我用示波器测量 CANH 或 CANL 时、两者均为0伏。
下面是随附的 main.c。 您是否看到任何其他错误或知道它可能是什么?
谢谢
Timo
#include "tle_device.h" #include "port.h" #include "spi.h" #include "eigene_uart.h" #include <string.h> #include <stdio.h> #include "tcan4550.h" //Variablen extern uint16 receive_Array[12]; char string[8]; volatile uint8_t TCAN_Int_Cnt = 0; //Funktionen //void Init_GPIO(void); //void Init_Clock(void); //void Init_SPI(void); void Init_CAN(void); int main(void) { //PORT_ChangePin(0x00U, PORT_ACTION_SET); /***************************************************************************** ** Initialization of the hardware modules based on the configuration set ** ** in Config Wizard ** *****************************************************************************/ TLE_Init(); ADC1_Init(); PORT_ChangePin(0x00U, PORT_ACTION_SET); Init_CAN(); /*Define the CAN message we want to send*/ TCAN4x5x_MCAN_TX_Header header = {0}; //Remember to initialize to 0, or you´ll get random garbage! uint8_t data[4] = {0x55, 0x66, 0x77, 0x88}; //Define the data payload header.DLC = MCAN_DLC_4B; //Set the DLC to be equal to or less than the data payload (it is ok to pass a64 byte array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read) header.ID = 0x144; //Set the ID header.FDF = 1; //CAN FD frame enabled header.BRS = 1; //BIT10 rate switch enabled header.EFC = 0; header.MM = 0; header.RTR = 0; header.XTD = 0; //We are not using an extended ID in this example header.ESI = 0; //Error state indicator TCAN4x5x_MCAN_WriteTXBuffer(0, &header, data); // This function actually writes the header and data payload to the TCAN's MRAM in the specified TX queue number. It returns the bit necessary to write to TXBAR, // but does not necessarily require you to use it. In this example, we won't, so that we can send the data queued up at a later point. /* Let's make a different CAN message */ data[0] = 0x11; data[1] = 0x22; data[2] = 0x33; data[3] = 0x44; //define data payload header.DLC = MCAN_DLC_4B; // Set the DLC to be equal to or less than the data payload (it is ok to pass a 64 byte data array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read) header.ID = 0x123; // Set the ID header.FDF = 1; // CAN FD frame enabled header.BRS = 1; // Bit rate switch enabled header.EFC = 0; header.MM = 0; header.RTR = 0; header.XTD = 0; // We are not using an extended ID in this example header.ESI = 0; // Error state indicator TCAN4x5x_MCAN_WriteTXBuffer(1, &header, data); //This line writes the data and header to TX FIFO1 TCAN4x5x_MCAN_TransmitBufferContents(1); //Request that TX Buffer 1 be transmitted TCAN4x5x_MCAN_TransmitBufferContents(0); //now we can send the TX FIFO element 0 data that we had queued up earliere but didn't send. for (;;) { (void)WDT1_Service(); if (TCAN_Int_Cnt > 0 ) { TCAN_Int_Cnt--; TCAN4x5x_Device_Interrupts dev_ir = {0}; // Define a new Device IR object for device (non-CAN) interrupt checking TCAN4x5x_MCAN_Interrupts mcan_ir = {0}; // Setup a new MCAN IR object for easy interrupt checking TCAN4x5x_Device_ReadInterrupts(&dev_ir); // Read the device interrupt register TCAN4x5x_MCAN_ReadInterrupts(&mcan_ir); // Read the interrupt register if (dev_ir.SPIERR) // If the SPIERR flag is set TCAN4x5x_Device_ClearSPIERR(); // Clear the SPIERR flag if (mcan_ir.RF0N) // If a new message in RX FIFO 0 { TCAN4x5x_MCAN_RX_Header MsgHeader = {0}; // Initialize to 0 or you'll get garbage uint8_t numBytes = 0; // Used since the ReadNextFIFO function will return how many bytes of data were read uint8_t dataPayload[64] = {0}; // Used to store the received data TCAN4x5x_MCAN_ClearInterrupts(&mcan_ir); // Clear any of the interrupt bits that are set. numBytes = TCAN4x5x_MCAN_ReadNextFIFO( RXFIFO0, &MsgHeader, dataPayload); // This will read the next element in the RX FIFO 0 // numBytes will have the number of bytes it transfered in it. Or you can decode the DLC value in MsgHeader.DLC // The data is now in dataPayload[], and message specific information is in the MsgHeader struct. if (MsgHeader.ID == 0x0AA) // Example of how you can do an action based off a received address { // Do something } } } } } /* * Configure the TCAN4550 */ void Init_CAN(void) { TCAN4x5x_Device_ClearSPIERR(); //Clear any SPI ERR flags that might be set as a result of our pin mux changing during MCU startup /*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); //Disable all non-MCAN related interrupts for simplicity TCAN4x5x_Device_Interrupts dev_ir = {0}; //Setup a new MCAN IR objekt for easy interrupt checking TCAN4x5x_Device_ReadInterrupts(&dev_ir); //Requsetthat the struct be updated with current DEVICE (not MCAN) interrupt values if(dev_ir.PWRON) //if the Power On interrupt flag is set { TCAN4x5x_Device_ClearInterrupts(&dev_ir); //clearerr it because if it's not cleared within ca. 4 minutes, it goes sleep } /* Configure the CAN bus speeds */ TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {0}; //500k arbitration with a 40 MHz cystal ((40E6 / 2) / (32 + 8) = 500E3) TCANNomTiming.NominalBitRatePrescaler = 2; TCANNomTiming.NominalTqBeforeSamplePoint = 32; TCANNomTiming.NominalTqAfterSamplePoint = 8; TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {0}; // 2 Mbps CAN FD with a 40 MHz crystal (40E6 / (15 + 5) = 2E6) TCANDataTiming.DataBitRatePrescaler = 1; TCANDataTiming.DataTqBeforeSamplePoint = 15; TCANDataTiming.DataTqAfterSamplePoint = 5; /* 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 FD Bit rate switch enable /*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; //Rejects remote frames (TCAN4x5x doesn't support this) gfc.ANFE = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0; //Default behaviour if incoming message doesn't match filter is to accept into RXFIO0 for extended ID message (29 bit IDs) gfc.ANFS = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0; // Default behavior if incoming message doesn't match a filter is to accept into RXFIO0 for standard ID messages (11 bit IDs) /* *********************************************************** * In the next configuration block, we will set the MCAN core up to have : * - 1 SID filter element * - 1 XID Filter element * - 5 RX FIFO 0 elements * - RX FIFO 0 supports data payloads up to 64 bytes * - RX FIFO 1 and RX Buffer will not have any elements, but we still set their data payload sizes, even though it's not required * - No TX Event FIFOs * - 2 Transmit buffers supporting up to 64 bytes of data payload */ TCAN4x5x_MRAM_Config MRAMConfiguration = {0}; MRAMConfiguration.SIDNumElements = 1; // Standard ID number of elements, you MUST have a filter written to MRAM for each element defined MRAMConfiguration.XIDNumElements = 1; // Extended ID number of elements, you MUST have a filter written to MRAM for each element defined MRAMConfiguration.Rx0NumElements = 5; // RX0 Number of elements MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data; // RX0 data payload size MRAMConfiguration.Rx1NumElements = 0; // RX1 number of elements MRAMConfiguration.Rx1ElementSize = MRAM_64_Byte_Data; // RX1 data payload size MRAMConfiguration.RxBufNumElements = 0; // RX buffer number of elements MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data; // RX buffer data payload size MRAMConfiguration.TxEventFIFONumElements = 0; // TX Event FIFO number of elements MRAMConfiguration.TxBufferNumElements = 2; // TX buffer number of elements MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data; // TX buffer data payload size /* Configure the MCAN core with the settings above, the changes in this block are write protected registers, * * so it makes the most sense to do them all at once, so we only unlock and lock once */ TCAN4x5x_MCAN_EnableProtectedRegisters(); // Start by making protected registers accessible TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig); // Enable FD mode and Bit rate switching TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc); // Configure the global filter configuration (Default CAN message behavior) TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming); // Setup nominal/arbitration bit timing TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming); // Setup CAN FD timing TCAN4x5x_MRAM_Clear(); // Clear all of MRAM (Writes 0's to all of it) TCAN4x5x_MRAM_Configure(&MRAMConfiguration); // Set up the applicable registers related to MRAM configuration TCAN4x5x_MCAN_DisableProtectedRegisters(); // Disable protected write and take device out of INIT mode /* Set the interrupts we want to enable for MCAN */ TCAN4x5x_MCAN_Interrupt_Enable mcan_ie = {0}; // Remember to initialize to 0, or you'll get random garbage! mcan_ie.RF0NE = 1; // RX FIFO 0 new message interrupt enable TCAN4x5x_MCAN_ConfigureInterruptEnable(&mcan_ie); // Enable the appropriate registers /* Setup filters, this filter will mark any message with ID 0x055 as a priority message */ TCAN4x5x_MCAN_SID_Filter SID_ID = {0}; SID_ID.SFT = TCAN4x5x_SID_SFT_CLASSIC; // SFT: Standard filter type. Configured as a classic filter SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0; // Standard filter element configuration, store it in RX fifo 0 as a priority message SID_ID.SFID1 = 0x055; // SFID1 (Classic mode Filter) SID_ID.SFID2 = 0x7FF; // SFID2 (Classic mode Mask) TCAN4x5x_MCAN_WriteSIDFilter(0, &SID_ID); // Write to the MRAM /* Store ID 0x12345678 as a priority message */ 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 (Classic mode filter) XID_ID.EFID2 = 0x1FFFFFFF; // EFID2 (Classic mode mask) TCAN4x5x_MCAN_WriteXIDFilter(0, &XID_ID); // Write to the MRAM /* Configure the TCAN4550 Non-CAN-related functions */ TCAN4x5x_DEV_CONFIG devConfig = {0}; // Remember to initialize to 0, or you'll get random garbage! devConfig.SWE_DIS = 0; // Keep Sleep Wake Error Enabled (it's a disable bit, not an enable) devConfig.DEVICE_RESET = 0; // Not requesting a software reset devConfig.WD_EN = 0; // Watchdog disabled devConfig.nWKRQ_CONFIG = 0; // Mirror INH function (default) devConfig.INH_DIS = 0; // INH enabled (default) devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1; // MCAN nINT 1 (default) devConfig.FAIL_SAFE_EN = 0; // Failsafe disabled (default) devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO; // GPIO set as GPO (Default) devConfig.WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT; // Watchdog set an interrupt (default) devConfig.WD_BIT_RESET = 0; // Don't reset the watchdog devConfig.nWKRQ_VOLTAGE = 0; // Set nWKRQ to internal voltage rail (default) devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION; // GPO2 has no behavior (default) devConfig.CLK_REF = 1; // Input crystal is a 40 MHz crystal (default) devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES; // Wake pin can be triggered by either edge (default) TCAN4x5x_Device_Configure(&devConfig); // Configure the device with the above configuration TCAN4x5x_Device_SetMode(TCAN4x5x_DEVICE_MODE_NORMAL); // Set to normal mode, since configuration is done. This line turns on the transceiver TCAN4x5x_MCAN_ClearInterruptsAll(); // Resets all MCAN interrupts (does NOT include any SPIERR interrupts) }
闪烁代码后、我在 Vio 和 VCCOUT 处没有任何电压。 但 INH-LED 和 GPIO1 LED 亮起。
您好、Timo、
欢迎回来参加该项目! 我很高兴听到转换为新代码的效果良好。 这里的代码看起来很好! 看起来这将正确配置 TCAN4550并让它将前两条消息传输到 CAN 总线。
根据观察到的 CAN 总线和电源引脚状态、TCAN4550听起来不是处于正常模式。 VIO 需要由外部电源供电、以便器件通过任何逻辑电平引脚(包括 SPI)正确连接。 如果未提供 Vio、器件将在 UVio 计时器到期后自动进入睡眠状态、这也会关闭 Vccout。 一旦进入睡眠模式、INH 将处于非激活状态(悬空)、并且 CAN 总线将弱偏置为0V。
器件可能自动进入睡眠模式的另一个原因是未激活的计时器在初始上电后过期。 如果为 TCAN4550供电、然后空闲几分钟、则可能会发生这种情况。 这还将停用 Vccout、INH 和 CAN 总线。 一旦处于睡眠状态、器件将从总线活动或 WAKE 引脚上的转换唤醒。 一旦唤醒、它将能够通过 SPI 与之连接。
在器件处于睡眠模式的这两种情况下、将无法访问 SPI 接口。 为了在软件中考虑这一点、MCU 可以从 TCAN4550读取一个已知值的寄存器(例如器件 ID 或暂存区寄存器)以确认接口是否正常工作。 如果没有响应(全0或全1)、则需要在 SPI 通信成功启动之前发生唤醒事件。 如果没有可用于 TCAN4550的 Vio、则需要先返回该电源、然后才能实现正常模式 (通常该电源与 MCU 共享、因此如果不可用、则无需 SPI)。
我不确定您使用的电路板上的 LED 是什么极性。 您能否在器件引脚处探测电压以获得器件状态的最佳清晰度?
让我知道后续调试工作是如何进行的。 您现在似乎对软件有很好的处理能力、因此它只是在某些硬件处于工作状态之前解决问题。
此致、
Eric Schott
尊敬的 Eric:
由于我使用的是 TCAN4550EVM 板、我的 Vio 引脚是否由 LDO 供电? 那么、我不需要为 Vio 使用外部电源。
我尝试刷写程序并注释掉 Init_CAN()。 然后我在引脚上设置了所有电平,但一旦我尝试 Init_CAN()函数,电平就会直接下降。
通过调试、我发现这是因为 TCAN4x5x_Device_Configure (&devConfig);函数。 只要我想执行这个函数,电压就会下降,在 Init_CAN()中还有所有其他函数,电压就会保持上升。 我认为对寄存器0x0800的写入操作不正确、程序在尝试比较写入操作是否正常时挂起。 因此、我用函数"AHB_WRITE_32 (0x0800、0xC8000460);"对寄存器进行了写入。 这似乎迄今已起作用。
但我仍然没有从 CANH 和 CANL 中获得 CAN 消息。 然后、我注意到、在寄存器0x0820[7:0]上第二次刷写程序后、我得到值0xA0、因此出现 CANSLNT 错误。 我用这个替换了
AHB_WRITE_32 (0x000C、0xFFFFFFF); //删除所有中断标志
AHB_WRITE_32 (0x0830、0xFFFFFFFF); //禁用 CANSLNT 中断
AHB_WRITE_32 (0x0820、0x00100400); //删除 CANSLNT 中断标志
被清除。 如果我现在写入寄存器或执行 Init_cAN()并且希望通过 CAN 发送某些内容,那么我在寄存器0x0820中不会再出现错误,并且电路板的所有级别都在这里。 此外、CANH 和 CANL 处于正确的电平、但仍然不会发出任何消息。
我还尝试了测试模式"SPI 和 M_CAN 内核测试模式"。 为此、我在 init_ccan ()之后直接将值"0xC8100469"写入寄存器0x0800。 但在这里、当我在 GPO2上使用示波器进行测量时、我也看不到任何东西。 还应该有可读的 CAN 消息或?
现在可能是什么错误?
相关信息
Timo
/* Configure the TCAN4550 Non-CAN-related functions */ /* TCAN4x5x_DEV_CONFIG devConfig = {0}; // Remember to initialize to 0, or you'll get random garbage! devConfig.SWE_DIS = 0; // Keep Sleep Wake Error Enabled (it's a disable bit, not an enable) devConfig.DEVICE_RESET = 0; // Not requesting a software reset devConfig.WD_EN = 0; // Watchdog disabled devConfig.nWKRQ_CONFIG = 0; // Mirror INH function (default) devConfig.INH_DIS = 0; // INH enabled (default) devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1; // MCAN nINT 1 (default) devConfig.FAIL_SAFE_EN = 0; // Failsafe disabled (default) devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO; // GPIO set as GPO (Default) devConfig.WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT; // Watchdog set an interrupt (default) devConfig.WD_BIT_RESET = 0; // Don't reset the watchdog devConfig.nWKRQ_VOLTAGE = 0; // Set nWKRQ to internal voltage rail (default) devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION; // GPO2 has no behavior (default) devConfig.CLK_REF = 1; // Input crystal is a 40 MHz crystal (default) devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES; // Wake pin can be triggered by either edge (default) //TCAN4x5x_Device_Configure(&devConfig); // Configure the device with the above configuration */ //Takes the function the block above AHB_WRITE_32(0x0800, 0xC8000460);
您好、Timo、
是的、Vio 由 EVM (U2)上的 LDO 供电、该 LDO 由 TCAN4550的 INH 输出启用。 这意味着当 TCAN4550进入睡眠模式并禁用 INH 输出时、LDO 将停止提供3.3V 电压。 init_cand()函数通过将器件置于正常模式并清除所有中断来结束。
TCAN4x5x_Device_Configure()方法不太可能导致器件进入睡眠状态。 此方法读取器件的当前模式并使用新数据将其写回、因此器件模式不会改变。 在调试以查找发生这种情况的位置时、无效定时器可能会超时、器件会自动进入睡眠模式。 也就是说,当正常调用 Init_CAN()时,听到设备仍进入睡眠状态是很奇怪的。 如果该功能将器件置于正常模式、则在通过 SPI 明确告知器件进入睡眠状态或发生其他故障条件(例如欠压)之前、器件不应再次进入睡眠状态(禁用 INH)。
请通过验证两个 INH 都处于活动状态并读回模式控制寄存器来确认位[7:6]读取2'B10、检查在 Init_can ()函数之后器件是否处于正常模式。 它看起来器件处于睡眠模式、尝试使用唤醒按钮手动唤醒器件并重新启动配置。
如果可能 、我建议您使用 MSP430FR6989 Launchpad 尝试此配置、以验证此测试的硬件设置。 此工具无需任何修改即可运行演示软件、因此很少有变量与 我在内部多次使用的设置不同。
此致、
Eric Schott
尊敬的 Eric:
我找到了我的错误。 我的 AHB_READ_32 ()函数返回了错误的值,因此配置不能正确。 现在、我在 CANL 线路上得到一些东西、但不幸的是、还没有显示正确或完整的消息。
在这两张图片中、您可以看到 CAN 消息出来时。 完整的帧不会被传输、但在 CRC 之后中止、并且没有数据字段。 此外、尽管代码中设置了4字节、但值0仍位于 DLC 中。
我不得不说、我在代码中关闭了 CAN-FD、并将波特率提高到1Mbit/s 我还会向您发送新代码。 如果您能告诉我我我的更改是否正确、那会很好。 但是、在这些变化之前、CAN 消息完全相同、所以我不认为是因为这些变化。
然后、关于此错误、我读取寄存器0x0820、0x0824、0x1020和0x1024并得到以下值:
0x0820 = 0x00000000
0x0824 = 0x08010000
0x1020 = 0x00000002
0x1024 = 0x00000E32 /但每次我尝试时、这里的值都会更改
根据0x0824中的值、我在仲裁阶段有一个 PEA 中断或一个协议性错误、以及一个时间戳错误或中断。 但我不知道它来自哪里、也不知道如何消除它。 它是否也来自以下事实:值0位于 DLC 中? 或者、您可能还知道另一种可能的情况吗?
感谢您的大力支持。
相关信息
Timo
#include "tle_device.h" #include "port.h" #include "spi.h" #include "eigene_uart.h" #include <string.h> #include <stdio.h> #include "tcan4550.h" //Variablen extern uint16 receive_Array[12]; char string[8]; volatile uint8_t TCAN_Int_Cnt = 0; uint32_t readData; //Funktionen void Init_CAN(void); int main(void) { //PORT_ChangePin(0x00U, PORT_ACTION_SET); /***************************************************************************** ** Initialization of the hardware modules based on the configuration set ** ** in Config Wizard ** *****************************************************************************/ TLE_Init(); ADC1_Init(); PORT_ChangePin(0x00U, PORT_ACTION_SET); AHB_WRITE_32(0x000C, 0xFFFFFFFF); //delete all Interrupt-Flags AHB_WRITE_32(0x0830, 0xFFFFFBFF); //disable CANSLNT-Interrupt AHB_WRITE_32(0x0820, 0x00100400); //delete CANSLNT Interrupt-Flag Init_CAN(); TCAN4x5x_MCAN_EnableProtectedRegisters(); AHB_WRITE_32(0x1018, 0x00000340); //set DAR bit AHB_WRITE_32(0x1020, 0x00000000); //setbuf Timestep to always 0 // AHB_READ_32(0x1018); TCAN4x5x_MCAN_DisableProtectedRegisters(); /*Define the CAN message we want to send*/ TCAN4x5x_MCAN_TX_Header header = {0}; //Remember to initialize to 0, or you´ll get random garbage! uint8_t data[4] = {0x55, 0x66, 0x77, 0x88}; //Define the data payload header.DLC = MCAN_DLC_4B; //Set the DLC to be equal to or less than the data payload (it is ok to pass a64 byte array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read) header.ID = 0x144; //Set the ID header.FDF = 0; //CAN FD frame disabled header.BRS = 0; //BIT10 rate switch disabled header.EFC = 0; header.MM = 0; header.RTR = 0; header.XTD = 0; //We are not using an extended ID in this example header.ESI = 0; //Error state indicator TCAN4x5x_MCAN_WriteTXBuffer(0, &header, data); // This function actually writes the header and data payload to the TCAN's MRAM in the specified TX queue number. It returns the bit necessary to write to TXBAR, // but does not necessarily require you to use it. In this example, we won't, so that we can send the data queued up at a later point. /* Let's make a different CAN message */ data[0] = 0x11; data[1] = 0x22; data[2] = 0x33; data[3] = 0x44; //define data payload header.DLC = MCAN_DLC_4B; // Set the DLC to be equal to or less than the data payload (it is ok to pass a 64 byte data array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read) header.ID = 0x123; // Set the ID header.FDF = 0; // CAN FD frame disabled header.BRS = 0; // Bit rate switch disabled header.EFC = 0; header.MM = 0; header.RTR = 0; header.XTD = 0; // We are not using an extended ID in this example header.ESI = 0; // Error state indicator TCAN4x5x_MCAN_WriteTXBuffer(1, &header, data); //This line writes the data and header to TX FIFO1 TCAN4x5x_MCAN_TransmitBufferContents(1); //Request that TX Buffer 1 be transmitted TCAN4x5x_MCAN_TransmitBufferContents(0); //now we can send the TX FIFO element 0 data that we had queued up earliere but didn't send. /* AHB_READ_32(0x0820); AHB_READ_32(0x0824); AHB_READ_32(0x1020); AHB_READ_32(0x1024); */ for (;;) { (void)WDT1_Service(); if (TCAN_Int_Cnt > 0 ) { TCAN_Int_Cnt--; TCAN4x5x_Device_Interrupts dev_ir = {0}; // Define a new Device IR object for device (non-CAN) interrupt checking TCAN4x5x_MCAN_Interrupts mcan_ir = {0}; // Setup a new MCAN IR object for easy interrupt checking TCAN4x5x_Device_ReadInterrupts(&dev_ir); // Read the device interrupt register TCAN4x5x_MCAN_ReadInterrupts(&mcan_ir); // Read the interrupt register if (dev_ir.SPIERR) // If the SPIERR flag is set TCAN4x5x_Device_ClearSPIERR(); // Clear the SPIERR flag if (mcan_ir.RF0N) // If a new message in RX FIFO 0 { TCAN4x5x_MCAN_RX_Header MsgHeader = {0}; // Initialize to 0 or you'll get garbage uint8_t numBytes = 0; // Used since the ReadNextFIFO function will return how many bytes of data were read uint8_t dataPayload[64] = {0}; // Used to store the received data TCAN4x5x_MCAN_ClearInterrupts(&mcan_ir); // Clear any of the interrupt bits that are set. numBytes = TCAN4x5x_MCAN_ReadNextFIFO( RXFIFO0, &MsgHeader, dataPayload); // This will read the next element in the RX FIFO 0 // numBytes will have the number of bytes it transfered in it. Or you can decode the DLC value in MsgHeader.DLC // The data is now in dataPayload[], and message specific information is in the MsgHeader struct. if (MsgHeader.ID == 0x0AA) // Example of how you can do an action based off a received address { // Do something } } } } } /* * Configure the TCAN4550 */ void Init_CAN(void) { TCAN4x5x_Device_ClearSPIERR(); //Clear any SPI ERR flags that might be set as a result of our pin mux changing during MCU startup /*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); //Disable all non-MCAN related interrupts for simplicity TCAN4x5x_Device_Interrupts dev_ir = {0}; //Setup a new MCAN IR objekt for easy interrupt checking TCAN4x5x_Device_ReadInterrupts(&dev_ir); //Requsetthat the struct be updated with current DEVICE (not MCAN) interrupt values if(dev_ir.PWRON) //if the Power On interrupt flag is set { TCAN4x5x_Device_ClearInterrupts(&dev_ir); //clearerr it because if it's not cleared within ca. 4 minutes, it goes sleep } /* Configure the CAN bus speeds */ TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {0}; //500k arbitration with a 40 MHz cystal ((40E6 / 4) / (8 + 2) = 1E6) TCANNomTiming.NominalBitRatePrescaler = 4; TCANNomTiming.NominalTqBeforeSamplePoint = 8; TCANNomTiming.NominalTqAfterSamplePoint = 2; TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {0}; // 2 Mbps CAN FD with a 40 MHz crystal (40E6 / (15 + 5) = 2E6) TCANDataTiming.DataBitRatePrescaler = 1; TCANDataTiming.DataTqBeforeSamplePoint = 15; TCANDataTiming.DataTqAfterSamplePoint = 5; /* Configure the MCAN core settings */ TCAN4x5x_MCAN_CCCR_Config cccrConfig = {0}; //Remember to initialize to 0, or you´ll get random garbage! cccrConfig.FDOE = 0; //CAN FD mode disable cccrConfig.BRSE = 0; //CAN FD Bit rate switch disable /*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; //Rejects remote frames (TCAN4x5x doesn't support this) gfc.ANFE = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0; //Default behaviour if incoming message doesn't match filter is to accept into RXFIO0 for extended ID message (29 bit IDs) gfc.ANFS = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0; // Default behavior if incoming message doesn't match a filter is to accept into RXFIO0 for standard ID messages (11 bit IDs) /* *********************************************************** * In the next configuration block, we will set the MCAN core up to have : * - 1 SID filter element * - 1 XID Filter element * - 5 RX FIFO 0 elements * - RX FIFO 0 supports data payloads up to 64 bytes * - RX FIFO 1 and RX Buffer will not have any elements, but we still set their data payload sizes, even though it's not required * - No TX Event FIFOs * - 2 Transmit buffers supporting up to 64 bytes of data payload */ TCAN4x5x_MRAM_Config MRAMConfiguration = {0}; MRAMConfiguration.SIDNumElements = 1; // Standard ID number of elements, you MUST have a filter written to MRAM for each element defined MRAMConfiguration.XIDNumElements = 1; // Extended ID number of elements, you MUST have a filter written to MRAM for each element defined MRAMConfiguration.Rx0NumElements = 5; // RX0 Number of elements MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data; // RX0 data payload size MRAMConfiguration.Rx1NumElements = 0; // RX1 number of elements MRAMConfiguration.Rx1ElementSize = MRAM_64_Byte_Data; // RX1 data payload size MRAMConfiguration.RxBufNumElements = 0; // RX buffer number of elements MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data; // RX buffer data payload size MRAMConfiguration.TxEventFIFONumElements = 0; // TX Event FIFO number of elements MRAMConfiguration.TxBufferNumElements = 2; // TX buffer number of elements MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data; // TX buffer data payload size /* Configure the MCAN core with the settings above, the changes in this block are write protected registers, * * so it makes the most sense to do them all at once, so we only unlock and lock once */ TCAN4x5x_MCAN_EnableProtectedRegisters(); // Start by making protected registers accessible TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig); // Disable FD mode and Bit rate switching TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc); // Configure the global filter configuration (Default CAN message behavior) TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming); // Setup nominal/arbitration bit timing TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming); // Setup CAN FD timing TCAN4x5x_MRAM_Clear(); // Clear all of MRAM (Writes 0's to all of it) TCAN4x5x_MRAM_Configure(&MRAMConfiguration); // Set up the applicable registers related to MRAM configuration TCAN4x5x_MCAN_DisableProtectedRegisters(); // Disable protected write and take device out of INIT mode /* Set the interrupts we want to enable for MCAN */ TCAN4x5x_MCAN_Interrupt_Enable mcan_ie = {0}; // Remember to initialize to 0, or you'll get random garbage! mcan_ie.RF0NE = 1; // RX FIFO 0 new message interrupt enable TCAN4x5x_MCAN_ConfigureInterruptEnable(&mcan_ie); // Enable the appropriate registers /* Setup filters, this filter will mark any message with ID 0x055 as a priority message */ TCAN4x5x_MCAN_SID_Filter SID_ID = {0}; SID_ID.SFT = TCAN4x5x_SID_SFT_CLASSIC; // SFT: Standard filter type. Configured as a classic filter SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0; // Standard filter element configuration, store it in RX fifo 0 as a priority message SID_ID.SFID1 = 0x055; // SFID1 (Classic mode Filter) SID_ID.SFID2 = 0x7FF; // SFID2 (Classic mode Mask) TCAN4x5x_MCAN_WriteSIDFilter(0, &SID_ID); // Write to the MRAM /* Store ID 0x12345678 as a priority message */ 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 (Classic mode filter) XID_ID.EFID2 = 0x1FFFFFFF; // EFID2 (Classic mode mask) TCAN4x5x_MCAN_WriteXIDFilter(0, &XID_ID); // Write to the MRAM /* Configure the TCAN4550 Non-CAN-related functions */ TCAN4x5x_DEV_CONFIG devConfig = {0}; // Remember to initialize to 0, or you'll get random garbage! devConfig.SWE_DIS = 0; // Keep Sleep Wake Error Enabled (it's a disable bit, not an enable) devConfig.DEVICE_RESET = 0; // Not requesting a software reset devConfig.WD_EN = 0; // Watchdog disabled devConfig.nWKRQ_CONFIG = 0; // Mirror INH function (default) devConfig.INH_DIS = 0; // INH enabled (default) devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1; // MCAN nINT 1 (default) devConfig.FAIL_SAFE_EN = 0; // Failsafe disabled (default) devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO; // GPIO set as GPO (Default) devConfig.WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT; // Watchdog set an interrupt (default) devConfig.WD_BIT_RESET = 0; // Don't reset the watchdog devConfig.nWKRQ_VOLTAGE = 0; // Set nWKRQ to internal voltage rail (default) devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION; // GPO2 has no behavior (default) devConfig.CLK_REF = 1; // Input crystal is a 40 MHz crystal (default) devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES; // Wake pin can be triggered by either edge (default) TCAN4x5x_Device_Configure(&devConfig); // Configure the device with the above configuration TCAN4x5x_Device_SetMode(TCAN4x5x_DEVICE_MODE_NORMAL); // Set to normal mode, since configuration is done. This line turns on the transceiver TCAN4x5x_MCAN_ClearInterruptsAll(); // Resets all MCAN interrupts (does NOT include any SPIERR interrupts) }
您好、Timo、
很高兴听到您可以解决上一个问题。
我同意、这听起来像是为了响应数据帧中使用的 DLC 0而生成的当前错误帧。 它不与您共享的代码对齐、但您共享的波形(直接在 ID 字段之后)中的 RTR 位为显性状态、表示这是一个数据帧、并且数据长度代码在帧中看起来是零(尽管有填充位)。 由于发送长度为零的数据帧毫无意义、这可能是导致错误的原因、尽管我不确定。 此外、即使帧配置为远程帧、您也会收到相同的错误。
此致、
Eric Schott
尊敬的 Eric:
我在 CAN 总线上没有其他器件。 我只将示波器连接到 TCAN4550的 CANH 和 CANL 线路、并尝试发送一条消息。
无论我尝试何种设置、错误帧和 DLC = 0都始终出现。 但是、如果我更改代码、例如 RTR 位或 XTD 位、那么我会在示波器上看到它可以正常工作。 如果我以远程帧的形式发送消息并在 DLC 中写入0、那么我也会得到错误。 我将值写入 DLC 的内容或方式无关紧要。
相关信息
Timo
您好、Timo、
这确实听起来很奇怪。 我已经多次使用演示代码配置、从未遇到过代码与波形不一致的 DLC 问题。 我看不到会改变这种行为的任何修改、但您是否从演示中更改了配置的任何其他部分、这些部分会影响帧的仲裁部分的行为?
请指定此设置在哪些条件下正常工作。 RTR 位的工作值是多少? XTD 位? 哪些配置使得波形中的 DLC 反映了软件中显示的内容?
此致、
Eric Schott
尊敬的 Eric:
我没有更改演示中可能影响帧仲裁部分行为的任何内容。 我只在 TCAN4x5x_Data_Structs.h 中包含了一个.h 文件、以便程序识别数据类型"uint8_t"。 此外、我在 cccccr 寄存器的位配置结构中将"uint8_t moni" 中的变量"uint8_t mon"(第264行)重命名为"uint_8 moni"、因为变量"mon"已经存储了 ZW。 为 Infineon 创建。 但所有这些都不会对 DLC 产生影响、对吧?
我想你误解了我。 无论我尝试哪种配置、DLC 都始终具有值0。 我只是想、例如、如果我更改 RTR 位、那么示波器也会显示我发送一个远程帧、但无论我输入什么、DLC 也会自动为0、并且还会出现一个错误帧。 与 XID 相同、如果我设置为1、那么我会在 Oszilosskop 上获得一个更长的 ID、但是无论我输入什么、也仍然存在 DLC = 0。
因此、DLC 永远不会在软件中设置的波形中显示、它始终保持为0。
为了达到其底部、我尝试了 TESTMODE "SPI 和 M_CAN 内核测试模式"。 起初、我想使用库中的函数、但我没有在任何地方找到描述哪些函数是合适的模式。 使用命令"AHB_WRITE_32 (0x0800、0xC82004A1);"、我激活了测试模式(看门狗关闭、否则我在 GPO2上没有信号)。 激活 TESTMODE 后、我尝试发送一个与示例结构相同的 CAN 消息。 我在 Oszilosskop 上看到了下面的图片。 我有一个时钟、但只有将 CAN 消息设置为连续发送。 如果消息只发送一次、那么我只会得到第一个边沿、而不会得到任何其他信息。
为什么我在这个 TESTMODE 中甚至没有获得正确的信号、这就是为什么我得到 DLC = 0的原因? 或者您有其他想法吗?
非常感谢。
此致
Timo
您好、Timo、
功能调用 TCAN4x5x_Device_EnableTestMode (TCAN4x5x_DEVICE_TEST_MODE_CONTROLLER);将器件配置为 SPI 和 MCAN 测试模式、并分别细分 TXD 和 RXD 信号 GPO2和 GPIO1。 在这种状态下、CAN 控制器仍然希望看到它自己的数据从 CAN 总线中得到反映(只要 TXD 为显性状态、RXD 就应该为显性状态)。 如果 RXD 信号在 TXD 驱动为低电平时被采样为高电平、器件会将其识别为错误。 确保从 TXD (GPO2)到 RXD (GPIO1)信号、数字连接天气或通过 CAN 收发器发生回路(以模拟环路延迟)。
我看不到共享范围快照。 您是要单独发布吗?
此致、
Eric Schott
尊敬的 Eric:
抱歉、我忘记发送示波器照片。 但我发现了错误。 当写入 TX 缓冲区时、只写入1个字。 第二个或第三个字中的所有其他值都没有写入缓冲区。 现在、我收到了整个 CAN 消息、并且可以设置和更改 DLC 以及其他所有内容。
我现在遇到的唯一问题(希望是最后一个问题)是、我仍然在每条消息的末尾得到错误帧。 无论远程帧还是数据帧。 这样做的原因可能是什么? 我附上了以下消息的图片。
此致
Timo
您好、Timo、
很抱歉、我没有时间进一步研究这个问题。 明天我将运行一些测试、看看我是否可以重新创建您在这里看到的内容。
再次提醒我、此设置仅包含 TCAN4550正确吗? CAN 总线上没有其他节点?
此致、
Eric Schott
尊敬的 Eric:
是的。该设置仅由发送消息的 TCAN4550组成。 示波器会记录此消息、但没有其他节点。
此致
Timo
尊敬的 Eric:
我注意到、当我将 TCAN4550EVM 连接到另一个 CAN 节点时、错误帧消失。
感谢您的所有支持。
此致
Timo