> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CAN 接口概述 

控制器局域网（CAN）是一种基于消息的串行通信，能够快速可靠地共享信息。术语 CAN 和 CAN 总线在同一语境中使用。CAN 的优势如下：

* CAN 总线提供一个与所有网络节点通信的入口点，可实现集中式数据记录和诊断。
* CAN 帧按消息 ID 划分优先级。因此高优先级消息 ID 可获得总线仲裁的控制权。按位仲裁通过基于 ID 的优先级来管理 CAN 总线访问并避免冲突。
* CAN 总线在运行期间有两种逻辑状态：
  > * 隐性电平（Recessive level），隐性总线状态等同于逻辑高电平，称为空闲状态。
  > * 显性电平（Dominant level），显性总线状态等同于逻辑低电平。
* 任何节点都可以随时发送数据。CAN 通信中不存在主从节点的概念。
* CAN 节点使用位同步进行同步，其中每个位时间被划分为四个时间量子段。
* CAN 协议确保错误处理并检测 CAN 错误，包括 CRC 和 ACK。

## **CAN 功能**

CAN 协议支持以下功能：

* 基于优先级的总线访问。
* 非破坏性的按位仲裁。
* 通过全帧传输实现广播。
* 通过验收滤波实现多播帧传输。
* 错误检测和错误信号发送。
* 通过识别故障节点自动停用故障节点。

CAN 支持以下数据传输模式。默认情况下，CAN 传输模式设置为中断模式。

* DMA 模式：CAN 帧通过 DMA 从 RX FIFO 移动到系统内存，CPU 负载最小。
* 轮询模式：CPU 定期检查 RX FIFO 中是否有新帧并进行处理。
* 中断模式：收到帧时，通过中断通知 CPU，由 CPU 从 RX FIFO 读取数据。

下表列出了 CAN 通道及支持的最大波特率：

| **CAN 通道** | **支持的最大波特率** |
| :--------: | :----------: |
|      0     |    5 MBPS    |
|      1     |    12 MBPS   |
|      2     |    12 MBPS   |
|      3     |    12 MBPS   |
|      4     |    12 MBPS   |
|      5     |    12 MBPS   |
|      6     |    12 MBPS   |
|      7     |    12 MBPS   |

CAN 接口的每个通道支持以下波特率范围：

| **选项** | **标称比特率** |         **数据比特率**         |
| :----: | :-------: | :-----------------------: |
|    0   |  500 KBPS |          500 KBPS         |
|    1   |  250 KBPS |           5 MBPS          |
|    2   |  125 KBPS |          250 KBPS         |
|    3   |   1 MBPS  |           1 MBPS          |
|    4   |   1 MBPS  |           2 MBPS          |
|    5   |   1 MBPS  | 5 MBPS（CAN0 仅支持最高 5 MBPS） |
|    6   |   1 MBPS  |           8 MBPS          |
|    7   |   1 MBPS  |          10 MBPS          |
|    8   |   1 MBPS  |          12 MBPS          |

## **CAN 架构**

CAN IP 是 SoC 的一部分，是一个可配置的 CAN 控制器。TLE9255WLC 是外部收发器，可通过 SPI 接口进行配置，其工作时钟频率为 4 MHz，采用 SPI 模式 1。SoC 控制器连接到一个 QUP 模块，其 SE4 配置为 4 引脚 SPI 操作。

<Tabs>
  <Tab title="IQ-9075">
    **CAN0**

    Dragonwing IQ-9075 EVK 支持八个 CAN 通道。Dragonwing IQ-9075 EVK 支持 CAN0 与 TLE9255WLC 收发器的连接。下图显示了 CAN0 通道与 TLE9255WLC 收发器之间的连接，该收发器支持最高 5 MBPS 的波特率

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/System/FreeRTOS/media/IQ-9075.png" alt="IQ-9075.png" />
    </Frame>

    **CAN1/CAN2/CAN3/CAN4/CAN5/CAN6/CAN7**

    Dragonwing IQ-9075 EVK 支持 CAN1/CAN2/CAN3/CAN4/CAN5/CAN6/CAN7 与 ADM3058EBRIZ-RL 收发器的连接。下图显示了 CAN1/CAN2/CAN3/CAN4/CAN5/CAN6/CAN7 通道与 ADM3058EBRIZ-RL 收发器之间的连接，该收发器支持最高 12 MBPS 的波特率。

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/System/FreeRTOS/media/can123.png" alt="can123.png" />
    </Frame>
  </Tab>

  <Tab title="IQ-8275">
    **CAN0**

    Dragonwing IQ-8275 EVK 支持四个 CAN 通道。Dragonwing IQ-8275 EVK 支持 CAN0 与 TLE9255WLC 收发器的连接。下图显示了 CAN0 通道与 TLE9255WLC 收发器之间的连接，该收发器支持最高 5 MBPS 的波特率：

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/System/FreeRTOS/media/IQ-8275.png" alt="IQ-8275.png" />
    </Frame>

    **CAN1/CAN2/CAN3**

    Dragonwing IQ-8275 EVK 支持 CAN1/CAN2/CAN3 与 ADM3058EBRIZ-RL 收发器的连接。下图显示了 CAN1/CAN2 通道与 ADM3058EBRIZ-RL 收发器之间的连接，该收发器支持最高 12 MBPS 的波特率。

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/System/FreeRTOS/media/can123-8275.png" alt="can123-8275.png" />
    </Frame>
  </Tab>
</Tabs>

用户测试应用程序在注册客户端回调后与 CAN 服务层通信。CAN 服务层充当测试应用程序与 CAN 及收发器驱动之间的隔离层。TLE9255WLC 收发器驱动是 SPI 驱动的客户端，QUP\_SPI 驱动注册到该 SPI 驱动。

<Frame>
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/System/FreeRTOS/media/test_application.png" alt="teat_application.png" />
</Frame>

## **CAN 文件**

以下是 CAN 接口文件：

| 测试            | `sail_proc\BSP\tests\sailsw1\can_test\src\Can_Testapp.c`                                                            |
| :------------ | :------------------------------------------------------------------------------------------------------------------ |
| API           | <ul><li>`sail_proc\BSP\can\public\sailel1\CanSrv.h`</li><li>`sail_proc\BSP\can\public\sailel1\Can_Task.h`</li></ul> |
| SPI 转 CAN 收发器 | `sail_proc\BSP\cantrcv_tle9255\src\sailel1\cantrcv_Task.c`                                                          |
| CAN 驱动        | `sail_proc\BSP\can\src\sailel1\Can_Task.c`                                                                          |

## **验证 CAN 接口**

有关验证 CAN 接口的信息，请参阅 [CAN 测试命令](RTSS-test-commands#can)。

## **自定义 CAN 接口**

Qualcomm 建议使用默认的 CAN 收发器（TLE9255WLC）。使用默认收发器时，无需修改软件，因为平台 CAN 软件栈提供了完整支持。

如果使用虚拟收发器（例如 ADM3058EBRIZ），则无需修改 CAN 驱动，因为所有收发器处理均由硬件管理。

但是，如果引入新的或不同的 CAN 收发器，则必须在软件中集成并配置相应的收发器驱动。以下各节以 TLE9255 为例介绍所需的更改。

**将收发器映射到平台 CAN 驱动**

必须在 `sail_proc/BSP/can/src/sailel1/Can_Plt_Cfg.c` 的平台 CAN 驱动配置中映射新收发器。

示例（Dragonwing IQ-8275 EVK）：

1. 为新收发器添加映射数组：
   > ```cpp theme={null}
   > CAN_DATA static uint8_t Can_Tle9255_Map[CAN_MTTCAN_MAX_CNT] = {0};
   > ```
2. 映射相应的 CAN 通道（以 CAN0 为例）：
   > ```undefined theme={null}
   > if (chip_family == CHIPINFO_FAMILY_LEMANSAU)
   > {
   > Can_Tcan1146_Map[0] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[1] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[2] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[3] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[4] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[5] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[6] = CAN_TCAN_INVALID;
   > Can_Tcan1146_Map[7] = CAN_TCAN_INVALID;
   >
   > Can_Tcan1044_Map[0] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[1] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[2] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[3] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[4] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[5] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[6] = CAN_TCAN_INVALID;
   > Can_Tcan1044_Map[7] = CAN_TCAN_INVALID;
   >
   > Can_Tle9255_Map[0] = CAN_TCAN1146_CHAN_0;
   > Can_Tle9255_Map[1] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[2] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[3] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[4] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[5] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[6] = CAN_TCAN_INVALID;
   > Can_Tle9255_Map[7] = CAN_TCAN_INVALID;
   > }
   > ```

**实现收发器驱动**

必须为新收发器实现专用驱动。

参考路径示例：`sail_proc/BSP/cantrcv_tle9255/src/sailel1/cantrcv_Task.c`

该驱动处理收发器特定的操作，例如初始化、模式控制和故障处理。

**初始化收发器驱动**

必须在系统启动期间初始化新的收发器驱动。

文件：`sail_proc/BSP/el_entry/src/sailsw1/sailel1_main.c`

添加新收发器驱动的初始化调用。

示例：

```undefined theme={null}
CanTrcv_Tle9255_Init();
```

<br />
