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-Q1:TCAN4550-Q1 CAN 控制器故障排除

Guru**** 2540720 points
Other Parts Discussed in Thread: TCAN4550-Q1, TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1321739/tcan4550-q1-trouble-with-tcan4550-q1-can-controller

器件型号:TCAN4550-Q1
主题中讨论的其他器件: TCAN4550

您好!  

我目前正在使用 Ambarella 平台上带 SPI 接口的 TCAN4550-Q1 CAN 控制器配置 CAN 总线。 虽然我已经能够建立 CAN0网络接口并使用 canutilitiis 确认环回功能、但尝试使用独木舟或 PCAN 等工具来跟踪消息时遇到问题。  我可以使用 MSO 在 CAN 导线上观察波形数据  

root@-:~# ip - details link show CAN0
2:CAN0: MTU 16 qdisc pfifo_fast 状态启动模式默认组默认 qlen 10
   链路/ CAN 混杂0 minmtu 0 maxmtu 0
   CAN 状态错误激活(错误计数器 TX 0 Rx 0)重新启动 ms 0
         比特率800000采样点0.800
         tq 25 prop-seg 19 phase-seg1 20 phase-seg2 10 SJW 1
         m_can:tseg1 2..256 tseg2 2..128 SJW 1..128 BRP 1..512 BRP-inc 1
         m_can:dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..32 dbrp-inc 1
         时钟40000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

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

    Anand、您好!

    如果您在 CANH 和 CANL 引脚上看到当 TCAN4550发送消息时的信号、则与独木舟和 PCAN 的位时序配置匹配可能存在问题。  完整 CAN 消息帧的波形是什么样子?  消息是否得到确认、或者独木舟和 PCAN 模块是否生成错误标志?  您能否捕获并提供完整 CAN 消息的波形?

    您能否确认 TCAN4550和 CONE 以及 PCAN 模块的标称和数据位时序设置是什么?

    此致、

    乔纳森

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

    尊敬的 Jonathan:  

     感谢您的回复、我已尝试将目标的样本点、相位段值与 PCAN 工具的默认值进行匹配、 当我从目标器件发送 messeges 并且 messeges 没有被确认时、我在跟踪窗口中遇到了 gettating bus hav重 和 BUSOFF 错误、并且示波器也在读取错误帧/线路上的意外数据、 我已经在 CANH 和 CANL 导线的测试点测量了电阻、得到的值是124欧姆、这也是原因之一吗、我在下面附上了一些图像。

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

    Anand、您好!

    我对您正在使用的 PCAN 分析仪工具没有直接的体验、但通过一些研究、我发现其他人已经说、总线严重故障要么是由于不正确或缺少总线终端、要么是位时序设置不正确、 时钟源可能不够充分、因此它们以8MHz 时钟频率为基准。

    正确端接的 CAN 总线具有两组120欧姆端接电阻器、一组在总线的两端各放置。  它们是并联的、因此总线阻抗应为大约60欧姆。  由于测量的电阻为124欧姆、我怀疑您缺少一组端接电阻器、这可能会导致误差。

    我还在 PCAN 配置的屏幕截图中看到、它显示了8MHz 的时钟频率。  CAN 中使用的典型时钟频率较高、例如20MHz、40MHz、80MHz 等。  您是否有更快的时钟选项?

    如果您能为我提供设置和 TCAN4550电路的原理图、我可以查看其中是否有任何可能的错误或改进。

    如果您可以为我提供您在 TCAN4550配置中使用的最终寄存器值的列表、我还可以查看该列表以了解任何可能的问题。

    此致、

    乔纳森

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

    尊敬的 Jonathan:

    我们项目中使用的 TCAN4x5x 驱动程序代码直接来自 GitHub 上的官方 Linux 内核库、网址为https://github.com/torvalds/linux/tree/master/drivers/net/can/m_can。  我尚未对驱动程序代码本身进行任何修改。 根据我的理解,特定的寄存器值通常由运行时应用的初始化例程、中断处理程序和配置设置确定 

    我附上了一个原理图、显示了我的系统中 TCAN4550电路的设置。

    感谢您的支持。

    此致、

    阿南德·库尔卡尼

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

    Anand、您好!

    我知道您正在使用 Linux 社区的驱动程序代码、并且它将在运行时设置许多配置寄存器。  很遗憾、我没有提供任何信息来帮助您调试问题、因为我不知道器件是如何配置的、也不知道可能设置了哪些状态和中断位来指示问题。

    我相信驱动器中有一些用于读取 TCAN4550寄存器的函数。  是否无法在配置序列结束时简单地将所有器件寄存器读回某些表单或日志文件或 UART 终端、以便我们可以验证驱动程序代码所使用的设置并确保位时序设置 是否与 PCAN 设置匹配?

    我看到原理图有一个问题、但我不确定它目前正在引起任何问题。  OSC2引脚和晶体(R384)之间的串联电阻应位于 OSC1引脚和晶体之间。  OSC1引脚是 TCAN4550的电流跨导放大器的"输出"、向晶体馈送电流、OSC2引脚是"输入"。  这是常见的误解、因为当使用单端时钟而非晶体时、OSC1引脚变为单端时钟的"输入"引脚且 OSC2引脚接地。

    如需更多信息、请参阅 TCAN455x 时钟优化和设计指南应用手册。 (链接)

    此致、

    乔纳森

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

    Jonathan、您好!
      由于我对这项任务相对比较陌生,我不确定这种方法是否正确, 我曾尝试使用以下代码通过 SPI 读取寄存器值:

    #include <stdio.h>
    #include <stdint.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/spi/spidev.h>
    
    static const char *device = "/dev/spidev2.0";
    static uint8_t mode = SPI_MODE_0;
    static uint8_t bits = 8;
    static uint32_t speed = 1000000; // 1 MHz
    static uint16_t delay = 0;
    
    #define REG_MCAN_CREL    0x1000
    #define REG_MCAN_ENDN    0x1004
    #define REG_MCAN_CUST    0x1008
    #define REG_MCAN_DBTP    0x100C
    #define REG_MCAN_TEST    0x1010
    #define REG_MCAN_RWD     0x1014
    #define REG_MCAN_CCCR    0x1018
    #define REG_MCAN_NBTP    0x101C
    #define REG_MCAN_TSCC    0x1020
    #define REG_MCAN_TSCV    0x1024
    #define REG_MCAN_TOCC    0x1028
    #define REG_MCAN_TOCV    0x102C
    #define REG_MCAN_ECR     0x1040
    #define REG_MCAN_PSR     0x1044
    #define REG_MCAN_TDCR    0x1048
    #define REG_MCAN_IR      0x1050
    #define REG_MCAN_IE      0x1054
    #define REG_MCAN_ILS     0x1058
    #define REG_MCAN_ILE     0x105C
    #define REG_MCAN_GFC     0x1080
    #define REG_MCAN_SIDFC   0x1084
    #define REG_MCAN_XIDFC   0x1088
    #define REG_MCAN_XIDAM   0x1090
    #define REG_MCAN_HPMS    0x1094
    #define REG_MCAN_NDAT1   0x1098
    #define REG_MCAN_NDAT2   0x109C
    #define REG_MCAN_RXF0C   0x10A0
    #define REG_MCAN_RXF0S   0x10A4
    #define REG_MCAN_RXF0A   0x10A8
    #define REG_MCAN_RXBC    0x10AC
    #define REG_MCAN_RXF1C   0x10B0
    #define REG_MCAN_RXF1S   0x10B4
    #define REG_MCAN_RXF1A   0x10B8
    #define REG_MCAN_RXESC   0x10BC
    #define REG_MCAN_TXBC    0x10C0
    #define REG_MCAN_TXFQS   0x10C4
    #define REG_MCAN_TXESC   0x10C8
    #define REG_MCAN_TXBRP   0x10CC
    #define REG_MCAN_TXBAR   0x10D0
    #define REG_MCAN_TXBCR   0x10D4
    #define REG_MCAN_TXBTO   0x10D8
    #define REG_MCAN_TXBCF   0x10DC
    #define REG_MCAN_TXBTIE  0x10E0
    #define REG_MCAN_TXBCIE  0x10E4
    #define REG_MCAN_TXEFC   0x10F0
    #define REG_MCAN_TXEFS   0x10F4
    #define REG_MCAN_TXEFA   0x10F8
    
    uint32_t spi_read_register(int fd, uint16_t address) {
        uint8_t tx_buffer[4], rx_buffer[4];
        uint32_t value;
    
        tx_buffer[0] = 0x80 | ((address >> 8) & 0xFF);
        tx_buffer[1] = address & 0xFF;
        tx_buffer[2] = 0x00;
        tx_buffer[3] = 0x00;
    
        struct spi_ioc_transfer tr = {
            .tx_buf = (unsigned long)tx_buffer,
            .rx_buf = (unsigned long)rx_buffer,
            .len = 4,
            .delay_usecs = delay,
            .speed_hz = speed,
            .bits_per_word = bits,
        };
    
        if (ioctl(fd, SPI_IOC_MESSAGE(1), &tr) < 1) {
            perror("SPI_IOC_MESSAGE");
            return -1;
        }
    
        value = (rx_buffer[3] << 24) | (rx_buffer[2] << 16) | (rx_buffer[1] << 8) | rx_buffer[0];
        return value;
    }
    int main() {
        int fd;
    
        if ((fd = open(device, O_RDWR)) < 0) {
            perror("open");
            return 1;
        }
    
        if (ioctl(fd, SPI_IOC_WR_MODE, &mode) < 0) {
            perror("ioctl (SPI_IOC_WR_MODE)");
            return 1;
        }
    
        if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits) < 0) {
            perror("ioctl (SPI_IOC_WR_BITS_PER_WORD)");
            return 1;
        }
    
        if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {
            perror("ioctl (SPI_IOC_WR_MAX_SPEED_HZ)");
            return 1;
        }
    
        uint32_t cccr_value = spi_read_register(fd, REG_MCAN_CCCR);
        uint32_t crel_value = spi_read_register(fd, REG_MCAN_CREL);
        uint32_t endn_value = spi_read_register(fd, REG_MCAN_ENDN);
        uint32_t cust_value = spi_read_register(fd, REG_MCAN_CUST);
        uint32_t dbtp_value = spi_read_register(fd, REG_MCAN_DBTP);
        uint32_t test_value = spi_read_register(fd, REG_MCAN_TEST);
        uint32_t rwd_value = spi_read_register(fd, REG_MCAN_RWD);
        uint32_t nbtp_value = spi_read_register(fd, REG_MCAN_NBTP);
        uint32_t tscc_value = spi_read_register(fd, REG_MCAN_TSCC);
        uint32_t tscv_value = spi_read_register(fd, REG_MCAN_TSCV);
        uint32_t tocc_value = spi_read_register(fd, REG_MCAN_TOCC);
        uint32_t tocv_value = spi_read_register(fd, REG_MCAN_TOCV);
        uint32_t ecr_value = spi_read_register(fd, REG_MCAN_ECR);
        uint32_t psr_value = spi_read_register(fd, REG_MCAN_PSR);
        uint32_t tdcr_value = spi_read_register(fd, REG_MCAN_TDCR);
        uint32_t ir_value = spi_read_register(fd, REG_MCAN_IR);
        uint32_t ie_value = spi_read_register(fd, REG_MCAN_IE);
        uint32_t ils_value = spi_read_register(fd, REG_MCAN_ILS);
        uint32_t ile_value = spi_read_register(fd, REG_MCAN_ILE);
        uint32_t gfc_value = spi_read_register(fd, REG_MCAN_GFC);
        uint32_t sidfc_value = spi_read_register(fd, REG_MCAN_SIDFC);
        uint32_t xidfc_value = spi_read_register(fd, REG_MCAN_XIDFC);
        uint32_t xidam_value = spi_read_register(fd, REG_MCAN_XIDAM);
        uint32_t hpms_value = spi_read_register(fd, REG_MCAN_HPMS);
        uint32_t ndat1_value = spi_read_register(fd, REG_MCAN_NDAT1);
        uint32_t ndat2_value = spi_read_register(fd, REG_MCAN_NDAT2);
        uint32_t rxf0c_value = spi_read_register(fd, REG_MCAN_RXF0C);
        uint32_t rxf0s_value = spi_read_register(fd, REG_MCAN_RXF0S);
        uint32_t rxf0a_value = spi_read_register(fd, REG_MCAN_RXF0A);
        uint32_t rxbc_value = spi_read_register(fd, REG_MCAN_RXBC);
        uint32_t rxf1c_value = spi_read_register(fd, REG_MCAN_RXF1C);
        uint32_t rxf1s_value = spi_read_register(fd, REG_MCAN_RXF1S);
        uint32_t rxf1a_value = spi_read_register(fd, REG_MCAN_RXF1A);
        uint32_t rxesc_value = spi_read_register(fd, REG_MCAN_RXESC);
        uint32_t txfqs_value = spi_read_register(fd, REG_MCAN_TXFQS);
        uint32_t txesc_value = spi_read_register(fd, REG_MCAN_TXESC);
        uint32_t txbrp_value = spi_read_register(fd, REG_MCAN_TXBRP);
        uint32_t txbar_value = spi_read_register(fd, REG_MCAN_TXBAR);
        uint32_t txocr_value = spi_read_register(fd, REG_MCAN_TXBCR);
        uint32_t txbto_value = spi_read_register(fd, REG_MCAN_TXBTO);
        uint32_t txbc_value = spi_read_register(fd, REG_MCAN_TXBCF);
        uint32_t txbtie_value = spi_read_register(fd, REG_MCAN_TXBTIE);
        uint32_t txbcie_value = spi_read_register(fd, REG_MCAN_TXBCIE);
        uint32_t txefc_value = spi_read_register(fd, REG_MCAN_TXEFC);
        uint32_t txefs_value = spi_read_register(fd, REG_MCAN_TXEFS);
        uint32_t txefa_value = spi_read_register(fd, REG_MCAN_TXEFA);
    
        close(fd);
    
        printf("Value from REG_MCAN_CCCR register (little-endian): %08X\n", cccr_value);
        printf("Value from REG_MCAN_CREL register (little-endian): %08X\n", crel_value);
        printf("Value from REG_MCAN_ENDN register (little-endian): %08X\n", endn_value);
        printf("Value from REG_MCAN_CUST register (little-endian): %08X\n", cust_value);
        printf("Value from REG_MCAN_DBTP register (little-endian): %08X\n", dbtp_value);
        printf("Value from REG_MCAN_TEST register (little-endian): %08X\n", test_value);
        printf("Value from REG_MCAN_RWD register (little-endian): %08X\n", rwd_value);
        printf("Value from REG_MCAN_NBTP register (little-endian): %08X\n", nbtp_value);
        printf("Value from REG_MCAN_TSCC register (little-endian): %08X\n", tscc_value);
        printf("Value from REG_MCAN_TSCV register (little-endian): %08X\n", tscv_value);
        printf("Value from REG_MCAN_TOCC register (little-endian): %08X\n", tocc_value);
        printf("Value from REG_MCAN_TOCV register (little-endian): %08X\n", tocv_value);
        printf("Value from REG_MCAN_ECR register (little-endian): %08X\n", ecr_value);
        printf("Value from REG_MCAN_PSR register (little-endian): %08X\n", psr_value);
        printf("Value from REG_MCAN_TDCR register (little-endian): %08X\n", tdcr_value);
        printf("Value from REG_MCAN_IR register (little-endian): %08X\n", ir_value);
        printf("Value from REG_MCAN_IE register (little-endian): %08X\n", ie_value);
        printf("Value from REG_MCAN_ILS register (little-endian): %08X\n", ils_value);
        printf("Value from REG_MCAN_ILE register (little-endian): %08X\n", ile_value);
        printf("Value from REG_MCAN_GFC register (little-endian): %08X\n", gfc_value);
        printf("Value from REG_MCAN_SIDFC register (little-endian): %08X\n", sidfc_value);
        printf("Value from REG_MCAN_XIDFC register (little-endian): %08X\n", xidfc_value);
        printf("Value from REG_MCAN_XIDAM register (little-endian): %08X\n", xidam_value);
        printf("Value from REG_MCAN_HPMS register (little-endian): %08X\n", hpms_value);
        printf("Value from REG_MCAN_NDAT1 register (little-endian): %08X\n", ndat1_value);
        printf("Value from REG_MCAN_NDAT2 register (little-endian): %08X\n", ndat2_value);
        printf("Value from REG_MCAN_RXF0C register (little-endian): %08X\n", rxf0c_value);
        printf("Value from REG_MCAN_RXF0S register (little-endian): %08X\n", rxf0s_value);
        printf("Value from REG_MCAN_RXF0A register (little-endian): %08X\n", rxf0a_value);
        printf("Value from REG_MCAN_RXBC register (little-endian): %08X\n", rxbc_value);
        printf("Value from REG_MCAN_RXF1C register (little-endian): %08X\n", rxf1c_value);
        printf("Value from REG_MCAN_RXF1S register (little-endian): %08X\n", rxf1s_value);
        printf("Value from REG_MCAN_RXF1A register (little-endian): %08X\n", rxf1a_value);
        printf("Value from REG_MCAN_RXESC register (little-endian): %08X\n", rxesc_value);
        printf("Value from REG_MCAN_TXBC register (little-endian): %08X\n", txbc_value);
        printf("Value from REG_MCAN_TXFQS register (little-endian): %08X\n", txfqs_value);
        printf("Value from REG_MCAN_TXESC register (little-endian): %08X\n", txesc_value);
        printf("Value from REG_MCAN_TXBRP register (little-endian): %08X\n", txbrp_value);
        printf("Value from REG_MCAN_TXBAR register (little-endian): %08X\n", txbar_value);
        printf("Value from REG_MCAN_TXBCR register (little-endian): %08X\n", txocr_value);
        printf("Value from REG_MCAN_TXBTO register (little-endian): %08X\n", txbto_value);
        printf("Value from REG_MCAN_TXBCF register (little-endian): %08X\n", txbc_value);
        printf("Value from REG_MCAN_TXBTIE register (little-endian): %08X\n", txbtie_value);
        printf("Value from REG_MCAN_TXBCIE register (little-endian): %08X\n", txbcie_value);
        printf("Value from REG_MCAN_TXEFC register (little-endian): %08X\n", txefc_value);
        printf("Value from REG_MCAN_TXEFS register (little-endian): %08X\n", txefs_value);
        printf("Value from REG_MCAN_TXEFA register (little-endian): %08X\n", txefa_value);
    
        return 0;
    }
    

    以下是我在设置 CAN 网络接口之前和之后获得的输出:

    [14:55] Anand S. Kulkarni
    root@ambarella-vcam:/usr/bin# testtcan
    
    Value from REG_MCAN_CCCR register (little-endian): 000C4800
    
    Value from REG_MCAN_CREL register (little-endian): 00004866
    
    Value from REG_MCAN_ENDN register (little-endian): 00024866
    
    Value from REG_MCAN_CUST register (little-endian): 00044866
    
    Value from REG_MCAN_DBTP register (little-endian): 00064866
    
    Value from REG_MCAN_TEST register (little-endian): 00084866
    
    Value from REG_MCAN_RWD register (little-endian): 000A4866
    
    Value from REG_MCAN_NBTP register (little-endian): 000E4866
    
    Value from REG_MCAN_TSCC register (little-endian): 00104866
    
    Value from REG_MCAN_TSCV register (little-endian): 00124866
    
    Value from REG_MCAN_TOCC register (little-endian): 00144866
    
    Value from REG_MCAN_TOCV register (little-endian): 00164866
    
    Value from REG_MCAN_ECR register (little-endian): 00204866
    
    Value from REG_MCAN_PSR register (little-endian): 00224866
    
    Value from REG_MCAN_TDCR register (little-endian): 00244866
    
    Value from REG_MCAN_IR register (little-endian): 00284866
    
    Value from REG_MCAN_IE register (little-endian): 00664866
    
    Value from REG_MCAN_ILS register (little-endian): 00664866
    
    Value from REG_MCAN_ILE register (little-endian): 002E6666
    
    Value from REG_MCAN_GFC register (little-endian): 00406666
    
    Value from REG_MCAN_SIDFC register (little-endian): 00424866
    
    Value from REG_MCAN_XIDFC register (little-endian): 00444866
    
    Value from REG_MCAN_XIDAM register (little-endian): 00484866
    
    Value from REG_MCAN_HPMS register (little-endian): 004A4866
    
    Value from REG_MCAN_NDAT1 register (little-endian): 004C4866
    
    Value from REG_MCAN_NDAT2 register (little-endian): 004E4866
    
    Value from REG_MCAN_RXF0C register (little-endian): 00504866
    
    Value from REG_MCAN_RXF0S register (little-endian): 00524866
    
    Value from REG_MCAN_RXF0A register (little-endian): 00544866
    
    Value from REG_MCAN_RXBC register (little-endian): 00564866
    
    Value from REG_MCAN_RXF1C register (little-endian): 00664866
    
    Value from REG_MCAN_RXF1S register (little-endian): 005A6666
    
    Value from REG_MCAN_RXF1A register (little-endian): 005C6666
    
    Value from REG_MCAN_RXESC register (little-endian): 005E6666
    
    Value from REG_MCAN_TXBC register (little-endian): 006E4866
    
    Value from REG_MCAN_TXFQS register (little-endian): 00624866
    
    Value from REG_MCAN_TXESC register (little-endian): 00444866
    
    Value from REG_MCAN_TXBRP register (little-endian): 00664866
    
    Value from REG_MCAN_TXBAR register (little-endian): 00684866
    
    Value from REG_MCAN_TXBCR register (little-endian): 006A4866
    
    Value from REG_MCAN_TXBTO register (little-endian): 006C4866
    
    Value from REG_MCAN_TXBCF register (little-endian): 006E4866
    
    Value from REG_MCAN_TXBTIE register (little-endian): 00704866
    
    Value from REG_MCAN_TXBCIE register (little-endian): 00724866
    
    Value from REG_MCAN_TXEFC register (little-endian): 00786666
    
    Value from REG_MCAN_TXEFS register (little-endian): 007A4866
    
    Value from REG_MCAN_TXEFA register (little-endian): 007C4866
    
    root@ambarella-vcam:/usr/bin# sudo ip link set can0 type can bitrate 500000
    
    root@ambarella-vcam:/usr/bin# sudo ip link set can0 up
    
    root@ambarella-vcam:/usr/bin# testtcan
    
    Value from REG_MCAN_CCCR register (little-endian): 000C4800
    
    Value from REG_MCAN_CREL register (little-endian): 00004866
    
    Value from REG_MCAN_ENDN register (little-endian): 00024866
    
    Value from REG_MCAN_CUST register (little-endian): 00044866
    
    Value from REG_MCAN_DBTP register (little-endian): 00064866
    
    Value from REG_MCAN_TEST register (little-endian): 00084866
    
    Value from REG_MCAN_RWD register (little-endian): 000A4866
    
    Value from REG_MCAN_NBTP register (little-endian): 000E4866
    
    Value from REG_MCAN_TSCC register (little-endian): 00106666
    
    Value from REG_MCAN_TSCV register (little-endian): 00106666
    
    Value from REG_MCAN_TOCC register (little-endian): 00664866
    
    Value from REG_MCAN_TOCV register (little-endian): 00664866
    
    Value from REG_MCAN_ECR register (little-endian): 66204866
    
    Value from REG_MCAN_PSR register (little-endian): 00664866
    
    Value from REG_MCAN_TDCR register (little-endian): 00664866
    
    Value from REG_MCAN_IR register (little-endian): 66284866
    
    Value from REG_MCAN_IE register (little-endian): 00664866
    
    Value from REG_MCAN_ILS register (little-endian): 00664866
    
    Value from REG_MCAN_ILE register (little-endian): 00664866
    
    Value from REG_MCAN_GFC register (little-endian): 00406666
    
    Value from REG_MCAN_SIDFC register (little-endian): 00426666
    
    Value from REG_MCAN_XIDFC register (little-endian): 00444866
    
    Value from REG_MCAN_XIDAM register (little-endian): 00664866
    
    Value from REG_MCAN_HPMS register (little-endian): 664A0866
    
    Value from REG_MCAN_NDAT1 register (little-endian): 004C6666
    
    Value from REG_MCAN_NDAT2 register (little-endian): 00664866
    
    Value from REG_MCAN_RXF0C register (little-endian): 00664866
    
    Value from REG_MCAN_RXF0S register (little-endian): 00664866
    
    Value from REG_MCAN_RXF0A register (little-endian): 00664866
    
    Value from REG_MCAN_RXBC register (little-endian): 00664866
    
    Value from REG_MCAN_RXF1C register (little-endian): 00664866
    
    Value from REG_MCAN_RXF1S register (little-endian): 00664866
    
    Value from REG_MCAN_RXF1A register (little-endian): 00664866
    
    Value from REG_MCAN_RXESC register (little-endian): 005E6666
    
    Value from REG_MCAN_TXBC register (little-endian): 00664866
    
    Value from REG_MCAN_TXFQS register (little-endian): 00626666
    
    Value from REG_MCAN_TXESC register (little-endian): 00646666
    
    Value from REG_MCAN_TXBRP register (little-endian): 00666666
    
    Value from REG_MCAN_TXBAR register (little-endian): 00686666
    
    Value from REG_MCAN_TXBCR register (little-endian): 006A6666
    
    Value from REG_MCAN_TXBTO register (little-endian): 006C6666
    
    Value from REG_MCAN_TXBCF register (little-endian): 00664866
    
    Value from REG_MCAN_TXBTIE register (little-endian): 00706666
    
    Value from REG_MCAN_TXBCIE register (little-endian): 00664866
    
    Value from REG_MCAN_TXEFC register (little-endian): 00786666
    
    Value from REG_MCAN_TXEFS register (little-endian): 00664866
    
    Value from REG_MCAN_TXEFA register (little-endian): 007C6666

    如果您想了解该方法能否准确分析器件配置、将会非常有帮助。

    关于原理图中的串联电阻器(R384)、我可确认它确实为0欧姆。 尽管具有该值、但其在 OSC2引脚和晶体之间的位置是否仍可能影响振荡器电路的稳定性并引入阻抗不匹配?

    再次感谢您的帮助和宝贵的专业知识。

    此致、

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

    Anand、您好!

    感谢寄存器信息、但是、我不能仅仅通过查看值来确定它们是否正确。  较低的两个字节似乎始终为0x4866或0x6666、这是正常现象。  我已经看了一些寄存器、如标称位时序和预分频器 (NBTP)、对于500kb 的比特率、该时序是不起作用的。

    您能否尝试验证是否正确回读这些寄存器?  器件 ID 寄存器0x0000和0x0004应始终返回已知值。  同样、可以使用测试和暂存寄存器0x0808写入一个值、然后对其进行读回以验证读取和写入 SPI 通信是否正常工作。

    谢谢。此致、

    乔纳森

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

    尊敬的 Jonathan:

    很抱歉延迟与您取得联系。 我一直在对问题进行故障排除、在从 PCAN 和独木舟成功接收 CAN 消息 方面取得了进展、我在从目标设备传输消息时遇到了挑战。  TCAN4x5x 控制器正在成功地从 PCAN 和独木舟接收数据。

    但是、当尝试从目标器件发送消息时、外部接收器仅检测一次该消息。 检查后、收到的消息似乎没有任何数据有效载荷。

    我已经尝试使用驱动程序代码中提供的函数来读取和写入寄存器。 但是、尽管成功写入测试寄存器、从寄存器读取的值仍然为0。

    [    3.064191] tcan4x5x spi3.0: no CAN clock source defined
    [    3.070293] tcan4x5x spi3.0: setup mode 0, 8 bits/w, 10000000 Hz max --> 0
    [    3.088392] TCAN4x5x Device ID0: 0x32150320
    [    3.092575] TCAN4x5x Device ID1: 0x87654321
    [    3.098278] TCAN4x5x Revision: 0x0
    [    3.102649] TCAN4x5x Status: 0xa33
    [    3.106285] TCAN4x5x Error Status: 0x80
    [    3.110203] TCAN4x5x Interrupt Flags: 0x80
    [    3.110766] iio iio:device1: registered accelerometer lis2dw12
    [    3.114373] TCAN4x5x Control: 0x0
    [    3.123524] TCAN4x5x MCAN Configuration: 0x0
    [    3.127801] Value read from TCAN4X5X_TEST_REG: 0

    我期待您的答复。

    谢谢。此致、

    阿南德  

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

    Anand、您好!

    我尝试使用驱动程序代码中提供的函数对寄存器进行读写。 但是、尽管成功写入测试寄存器、从寄存器读取的值仍为0。

    您是指地址为0x1010的"测试"寄存器吗?  如果是、这是一个只读寄存器。  或者您是指地址为0x0808的"测试寄存器和暂存"寄存器、该地址可同时支持读/写访问?

    但是,尝试从目标设备发送消息时,外部接收器仅检测一次该消息。 检查后,收到的消息似乎没有任何数据有效负载。

    如果我对您的理解正确、接收设备(PCAN 或独木舟)确实会在总线上看到从 TCAN4550传输的消息。  根据您尝试传输的数据、此报文是否具有正确的报文 ID 和报头位?  消息标头中的 DLC 值是多少?

    我曾经看到过一种类似您的情况、它的消息不包含任何消息数据。  事实证明、将消息数据放入 TCAN4550 MRAM 中的 TX 缓冲器元素时、SPI 通信是使用多字写入的。  但是、SPI 片选信号在每个32位数据字之间转换为高电平、这导致 SPI 多字写入失败。  只有事务中包含消息 ID 的第一个32位字被放入 TX 缓冲区。

    您是否能够使用逻辑分析仪监控 SPI 信号?

    您能否回读用于传输消息的 TX 缓冲器的存储器内容?  如果是、您能否回读并验证它是否与消息内容(包括正确的 DLC 和数据字节)匹配?

    您可以在 Bosch (链接)发布的《M_CAN 用户手册》的第2.4.3节中找到 MRAM TX 缓冲区元素定义。

    此致、

    乔纳森

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

    尊敬的 Jonathan:

    感谢您的详细答复和建议、澄清一下、我指的是地址为0x0808的"测试寄存器和便笺本"寄存器、而不是地址1010"的"测试"寄存器。  

    关于接收来自 TCAN4550的消息、 接收到的消息缺少任何数据有效载荷、并且消息 ID 与预期值不匹配。 消息标头中的 DLC 值也不符合预期。 下图显示了接收器跟踪窗口。

    我目前正在使用逻辑分析仪监控数据传输之间的 SPI 信号、以识别任何异常。

    此外、我尝试读取用于传输消息的 TX 缓冲器的存储器内容。 不过、我从 M_CAN TX 缓冲区检索到的数据与消息的预期内容不匹配。

    我发送的是 ID 为123、数据为12345678的 mesge、这就是我从 FIFO 得到的
    [145.924597] Transmit FIFO Data[0]:00000000

    非常感谢您提出任何其他建议或见解、期待您的回答。

    此致、

    阿南德·库尔卡尼

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

    尊敬的 Jonathan:

    在此、我还想提一下一点、 在我们的系统中、我们使用频率为20 MHz 的外部晶体。 为了适应这种情况、我通过将 tcan4x5x-core.c 文件中的时钟定义从40 MHz 更改为20 MHz 进行了必要的调整。 因此、这一改动在我们的系统内实现了成功的消息接收。 但是、在进行回送测试时、我注意到结果存在同样的差异。 具体来说,当使用20 MHz 时钟配置执行回送测试时,收到的消息与 PCAN 视图跟踪中显示的消息相同: CAN0 000 [0]  

    此结果与在40 MHz 定义时观察到的预期行为进行了对比。  在以前的配置下、回送测试产生了预期的结果。

    但在定义了40 MHz  时钟时,当尝试从外部发送消息然后接收消息时,它显示出总线关闭,然后在 PCAN 和独木舟上的大巴状况。

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

    Anand、您好!

    如果您无法写入和读回 Scratchpad 寄存器0x0808中的值、并且所有其他读回在您尝试读 TX 消息数据时都返回"0"、那么我不确定这是否只是写入、读取、写入或写入 或者同时使用这两种功能。  您的 SPI 通信似乎存在一些问题。  

    由于您看到一些器件活动、器件似乎在工作、但奇怪的行为可能是由某种 SPI 错误造成的。  最好使用逻辑分析仪或示波器图来验证 SPI 信号、以查看它们是否存在任何错误。 时钟问题也可能导致 SPI 通信错误。  

    请注意、这里有3个具有不同地址范围的不同寄存器分组。

    地址为0x0000至0x002F 的组中的寄存器以逻辑方式实现、只需要 SPI 时钟。  它们不需要通过 OSC1/2引脚提供的系统时钟被激活或正常工作来与之交互。

    组中地址为0x0800至0x08FF 的寄存器是与器件相关的寄存器、与 MCAN 控制器无关。  它们确实需要系统时钟正常工作、以便数字内核可以根据来自 SPI 总线的寄存器读/写请求工作。

    组中地址为0x1000到0x10FF 的寄存器是与 MCAN 相关的寄存器、是 Bosch MCAN IP 的一部分。  这些寄存器还要求系统时钟正常工作、以便访问寄存器以及发送或接收 CAN 消息。

    有一个 FIFO 可以处理 SPI 时钟域到 SPI 读取/写入数据上的系统时钟域转换。  如果系统时钟有问题、则通过 FIFO 获取数据时将出现错误、这将在仅在 SPI 时钟域之外运行的状态寄存器0x000C 中报告。

    您可以读取寄存器0x0000至0x0010吗?  您是否也可以尝试写入寄存器0x0010并回读刚刚写入的值?  同时、您是否可以再次尝试对暂存区寄存器0x0808进行写入/读取测试、以查看其是否仍有问题?  如果 Sratchpad 寄存器不工作、但其他寄存器可以工作、那么我们可以得出这是时钟问题的结论。  如果您在寄存器0x0000至0x0010方面也有问题、则您的 SPI 信号可能存在协议问题。

    对于 CAN 消息接收、我有点困惑、不确定我是否理解。  在今天的第一篇文章中、您提到收到的消息没有任何数据负载、并且具有错误的消息 ID。  但在第二篇文章中、您说您更改了时钟配置、并且在我们的系统中成功接收了此类消息。  这是否意味着在时钟配置调整后接收的消息包含正确的数据有效载荷和消息 ID?

    您做了哪些调整?  您能否重试以获取该器件的寄存器值列表?  上次出现时、寄存器的值不正确、因此我仍然不确定您使用的配置。

    您是否能够在范围上捕获从 TCAN4550传输的消息以及从 PCAN 或独木舟传输到 TCAN4550的消息?

    此致、

    乔纳森