公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

PSoC CAN协议的故障排除指南 - KBA224456 (ZH)

PSoC CAN协议的故障排除指南 - KBA224456 (ZH)

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

Version: **

问题:使用控制器局域网络 (Controller Area Network, CAN) 组件时需要考虑哪些方面, 以及怎样排除关于CAN的各种问题?

回答:本文档提供了使用PSoC CAN组件的通用指南, 记录了一些经常被报告的问题以及调试步骤。此文档可以用做使用PSoC CAN时的故障排除指南

1.     一般信息

1.1     CAN规测试报

1.2      参考文档和

1.3      示例工程

1.4      用于开CAN工程的普拉斯套件

1.5      PSoC系列CAN件的

2.     配置CAN组件的步骤

2.1    PSoC Creator中配置CAN

2.2     硬件接指南

2.3     中断以监视CAN错误事件

3.     调试CAN问题

3.1     CAN接收

3.2     CAN

3.3     校准使用的WCO在通信中引起的问题

3.4     CANCY8CKIT-026上没有工作

3.5     某些点未接收或CAN消息

3.6     PSoC CreatorCAN工程提示时钟错误

4.     常见问题回答

1. 一般信息

CAN组件支持PSoC 3, PSoC 5LP, PSoC 4100M, PSoC 4200M, PSoC 4200L, PSoC 4100S Plus系列。PSoC 4MPSoC 4100S Plus提供汽车级产品

CAN组件支持CAN2.0ACAN2.0B协议实施并且兼容ISO 11898-1。更高版本的库无法在此CAN组件上实施。您可以建立您自己的基于CAN的库。此文档假设您已经有了对PSoC 3, PSoC 4, PSoC 5lp产品以及PSoC Creator™的基本了解。

如果您刚接触这些产品你, 请阅读AN54181 - PSoC® 3入门, AN77759 - PSoC® 5LP入门, 以及AN79953 – PSoC 4入门。如果您刚接触PSoC Creator, 请阅读PSoC Creator主页

1.1 CAN合规测试报告

CAN组件经过了C&S集团公司基于标准协议和数据连接层合规测试的认证。完整的认证报告可以点击此处获取。

1.2 参考文档和链接

在开始PSoCCAN设计之前, 您可以浏览如下文档

以及一些其它相关文档供阅读:

1.3 示例工程

  1. PSoC Creator为所有支持CAN的产品提供了CAN basicCAN full示例工程。使用菜单路径, File à Code Example。在Find Code Example窗口, Device family下拉列表中选择PSoC系列。从Filter by下拉列表中选择CAN。结果如 1

1. PSoC Creator中找到CAN示例

  

pastedImage_11.png

1.4 用于开发CAN工程的赛普拉斯套件

如下是各个系列的PSoC原型机套件和收发器节点套件的链接:

1.5 PSoC系列CAN组件的对比

PSoC 3PSoC 5LP系列的CAN组件实施方法相同。PSoC 4 (PSoC 4M, PSoC 4L以及PSoC 4S) 系列CAN的实施方法和PSoC 3PSoC 5LP略有差异。 1列举了这些差异。

1.关于CAN组件实施的差异

特性

PSoC 3PSoC 5LPCAN

PSoC 4M, PSoC 4LPSoC 4S PlusCAN

单发传输

不适用

适用

外部环回测试模式

不适用

适用

选择数据字节顺序

不适用

适用

Rx卡在'0' (显性) 超过11个连续位时间时中断

不适用

适用

RTR中断

不适用

适用

访问错误捕获寄存器

不适用

适用

保存和还原配置的应用程序编程接口 (application programming interface, API)

适用

不适用

PSoC 3, PSoC 5LPPSoC 4系列的CAN组件中的某些宏和寄存器是不同的。可阅读对应PSoC系列的寄存器技术参考手册 (Technical Reference Manual, TRM) 和架构TRM

2. 配置CAN组件的步骤

2.1 PSoC Creator中配置CAN组件

在配置CAN组件之前, 请首先阅读参考文档和的部分。按照如下步骤在PSoC Creator中配置CAN组件:

  1. 根据对应参考文档, 确认在Project.cydwr à Clocks时钟设定已经完成。阅读硬件接指南的部分获取更多详情。
  2. 拖放CAN组件。
  3. CAN TxRx配置恰当的管脚。
  4. CAN组件配置界面的General选项卡里的内容。
  5. 配置期望使用的波特率。在CAN组件配置界面选择恰当的BRP, TSEGSJW
  6. 配置Rx的缓存。
  7. 配置Tx的缓存

2.2 硬件连接指南

基于所支持的波特率范围选择适当的CAN收发器, 侦听模式的组网以及其他。部分收发器可能需要通过SPI来配置和初始化。

关于开发平台, 您可以使用CY8CKIT-026 CAN and LIN Shield Kit。如下是连接CY8CKIT-026套件的指南以及需要在PSoC Creator中所做的相应修改:

  • 通过兼容Arduino的连接器CY8CKIT-026插入基础套件。CY8CKIT-026有两个CAN收发器:CAN2。将J3_10 (CAN_Rx) J3_9 (CAN_Tx) 连接至对应的CAN_RxCAN_Tx (J19 – CAN1J9 – CAN2)
  • 根据CY8CKIT-026的电源配置使能CAN收发器。注意CY8CKIT-026如果仅由基础套件供电CY8CKIT-026的跳线器J20的管脚1和管脚2互相连接时), 只有CAN2被使能。为了两个CAN收发器都被使能需要外部电源为CY8CKIT-026和基础套件供电 (J20的管脚2-3连接或者J20的管脚3-4连接) 2CY8CKIT-026跳线器J20的原理图和连接详情。确保您根据CAN收发器的使能需求设置了正确的跳线连接。

2. CY8CKIT-026跳线器J20原理图和连接详情

   pastedImage_0.png

  • CAN时钟的误差容限在波特率不高于125kbps时需要保证在± 1.58%以内在波特率大于125kbps时需要保证在0.5%。对于PSoC 4, CAN时钟源是HFCLK, 而对于PSoC 3PSoC 5LP, 时钟源是BUS_CLK。确保这些时钟源于高精确度的时钟。如下一些选项可以应用在需要高准确度CAN时钟的PSoC 4 CAN工程里:
  • 如过设备是基于内部主振荡器 (internal main oscillator, IMO)运行的那就需要通过外部高准确度的时钟晶体振荡器进行校准。IMO的误差容限是±已经超出了CAN协议的规范。您应该如 3所示使能Trim with WCO选项。确保WCO晶体 (32 kHz) 已焊接在板上并连接到正确的PSoC管脚。可以阅读对应的PSoC产品数据手册检查管脚。

3. Trim With WCO

  pastedImage_1.png

  • 除了使用IMO, 还可以使用符合CAN时钟误差容限的外部晶体或外部振荡器作为PSoC的时钟源。确保外部时钟连接到了已选PSoC产品的对应管脚。4说明了如何在PSoC Creator‘Configure System Clocks’窗口使能外部时钟。查看对应PSoC产品的数据手册以选择恰当的外部时钟。

4. 使能外部时钟

  pastedImage_2.png

  • 如果您使用的是DB9连接器请确保使用直连线束。

阅读http://www.interfacebus.com/Can_Bus_Connector_Pinout.html了解不同种类的线束。 5说明了DB9母头连接器上CAN管脚的分布。

5. DB9连接器

  pastedImage_3.png

2.3 设定中断以监视CAN的错误事件

监视CAN的错误事件有助于在发送和接收过程中对网络中被观察到的任何问题进行监视和调试。用户代码负责处理已发生的错误事件。CAN组件的Interrupt选项卡列举了使能后可以触发中断的事件。CAN组件只分配了一个中断服务子程序 (Interrupt Service Routine, ISR)。对于任何一种中断, 都只有一个中断服务子程序生效。因此, 接收消息事件和错误事件将触发同一个中断服务子程序。用户需要检查CAN_INT_SR_REG的对应标志位并在代码中处理该中断。本节解释了怎样处理错误中断。

关于在CAN配置窗口使能所需中断可参考 6

6. 使能CAN中断

  pastedImage_4.png

一旦某中断被使能, CAN.h中对应宏就将被设置为1

例如, 如果在配置窗口选择了Bit stuffing error detected, 然后编译工程, 可以看到CAN.h#define CAN_STUFF_ERR被定义为了1

如下CAN.h中的代码也会被使能:

#if (CAN_Rx_STUFF_ERR)

void CAN_BitStuffErrorIsr(void);

#endif /* CAN_Rx_STUFF_ERR */

CAN_Rx_STUFF_ERR被定义为1, 函数void CAN_Rx_BitStuffErrorIsr(void)会被使能。该函数即可被用于处理位填充错误中断。

CAN_INT.c的代码片段中, 可以在注释/* `#START BIT_STUFF_ERROR_ISR` */之后添加代码。

void CAN_Rx_BitStuffErrorIsr(void)

    {

        /* Clear Stuff Error flag */

        CAN_Rx_INT_SR_REG = CAN_Rx_STUFF_ERROR_MASK;

        /* `#START BIT_STUFF_ERROR_ISR` */

        //Place your code here

        /* `#END` */

        #ifdef CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK

CAN_Rx_BitStuffErrorIsr_Callback();

        #endif /* CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK */

}

用户可以在这个中断路径中处理位错误或者在回调函数CAN_Rx_BitStuffErrorIsr_Callback()中添加位错误处理代码。在头文件cyapicallbacks.h中添加如下宏定义, 可以使能回调函数。

#define CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK

上述方法可以作为在CAN配置窗口中任一使能中断的参考。这可以为工程和CAN网络的调试提供帮助。

3. 调试CAN问题

本节讨论了一些CAN应用中的常见问题, 以及调试这些问题的步骤。

3.1 CAN帧未接收

  • 检查CAN的中断服务子程序是否被触发。如果没有检查源码中的如下几点:
  • 检查在CAN_INT.cCY_ISR(CAN_ISR)是否清除了接收消息的标志位。

添加如下代码用于清除接收消息的标志位:

/* Clear Receive Message flag */

CAN_INT_SR_REG = CAN_RX_MESSAGE_MASK;

  • 如果使用CY_ISR_PROTO(ISR_CAN)CAN中断重新分配需要使用CyIntSetVector(CAN_ISR_NUMBER, ISR_CAN)分配中断向量。注意清除接收消息的标志位。阅读AN90799 - PSoC® 4中断4.2章节创建自定义ISR获取更多关于重新分配中断的内容。
    • 如果使用了CAN_1_SetOpMode()确保它在CAN_1_Start()前被调用。
    • 检查CAN组件的波特率设置是否正确。
    • 检查CAN时钟源是否在*.cydwr中配置正确。如果是IMO, 检查IMO Trim with WCO是否使能 3所示。
    • 检查WCO、外部晶体或者外部振荡器是否正确焊接在电路板上。参考配置CAN组件的步骤
    • 发送一次虚拟数据并使用示波器检查位时序。检查位时序是否符合CAN的误差容限。
    • 检查收发器是否支持期望的波特率。
    • 检查收发器管脚是否按照数据手册的说明连接。
    • 使用中断以监视CAN错误事件中提到的中断使用方法监测错误事件。对于任何一种错误如果如果节点无法自己纠正错误计数器就会累加至引起总线关闭错误。

如下是一些可能在接收CAN消息过程中发生的错误, 检查是否遇到了各个错误:

  • 填充错误:检查晶体或振荡器如果是使用WCO校准IMO, 检查WCO晶体。
  • 循环冗余校验错误:此错误常出现在发送节点而且网络能够恢复。检查总线上的数据和发出的数据。
  • 格式错误:检查硬件连接。检查CAN-H或者CAN-L线是否卡在了逻辑0 (GND) 位。检查是否有任何外部静电改变了位逻辑电位。

3.2 CAN帧未发送

检查是否触发了位错误、应答错误或者总线关闭错误。如果是的话, 可以:

  • 检查是否总线终端电阻是否安装。
  • 检查总线连接。
  • 检查CAN时钟源是否在*.cydwr中配置正确。如果是IMO, 检查IMO Trim with WCO是否使能 3所示。
  • 检查WCO、外部晶体或者外部振荡器是否正确焊接在电路板上。参考配置CAN组件的步骤
  • 检查CAN组件的波特率设置是否正确。
  • 如果使用了CAN_1_SetOpMode()确保它在CAN_1_Start()前被调用。
  • 发送一次虚拟数据并使用示波器检查位时序。检查位时序是否符合CAN的误差容限。
  • 发送一次虚拟数据并使用示波器检查位时序。检查位时序是否符合CAN的误差容限。检查收发器是否支持期望的波特率。检查收发器管脚是否按照数据手册的说明连接。

3.3 校准使用的WCO在通信中引起的问题

确保WCO被正确安装在电路板上, 按照 3, IMO使用WCO校准设置正确的值。

WCO校准被使能时, 可以将HFCLK路由到一个管脚上以检查WCO是否准确的校准了IMO。这可以帮助检查IMO的误差容限在校准之后是否符合了CAN时钟规范。注意, 这种处理仅适用于带有数字信号接口 (digital signal interface, DSI) 的产品。查看对应芯片的架构TRM或者产品数据手册以了解该芯片是否带有DSI

按照这些步骤路由HFCLK到某个管脚:

  1. 拖放数字输出管脚并确保硬件连接已禁用, 7所示。

7. 管脚配置

  pastedImage_0.png

 

2. 到Clocking选项卡并按下述配置参数:

  • In clock
  • In clk en
  • In reset
  • Out clock
  • Out Clk en

8. 时钟配置

  pastedImage_2.png

3. 拖放一个时钟组件并设置:

  • Initially align to: HFCLK
  • Frequency: 24 MHz

9. 时钟组件设置

pastedImage_3.png

4. 连接时钟组件和管脚, 10

10. 连接时钟组件和管脚

pastedImage_4.png 

                 

这可以帮助监视通过示波器监视IMO

3.4 CAN在CY8CKIT-026上没有工作

如果该套件连接到了一个客户板上, 或者此套件没有被安装在任何Arduino兼容的赛普拉斯套件上, 对于CAN应用, 需要如下的跳线设置:

  • CAN 1收发器需要将Arduino端子J1Pin5 (V3.3) 列接到3.3 V5 V
  • CAN 2收发器需要将Arduino端子J1Pin7 (P4 VDD) 列接到3.3 V5 V

注意, CAN1收发器支持不高于125 Kbps的波特率。如果波特率更高, 需要使用CAN2收发器并填充跳线J10以添加终端电阻。参考CY8CKIT-026 CAN and LIN Shield Kit Guide

3.5 某些节点未接收或发送CAN消息

使用示波器检查CAN TxRx数据。无论CAN消息未接收还是未发送, 都有可能产生填充错误 (参考CAN接收)。如果IMO未被校准, 或者由于WCO晶体或走线导致CAN时钟不准确, 波特率将无法满足为时序要求。关于选择和装配WCO, 可以参考AN95089 - PSoC® 4/PRoC™ BLE Crystal Oscillator Selection and Tuning Techniques章节8 Crystal Analysis for WCO的内容

3.6 PSoC Creator的CAN工程提示时钟错误

11 显示了PSoC CreatorCAN工程提示的时钟错误。

11. 时钟错误

  pastedImage_9.png

CAN的源时钟是HFCLK。而SYSCLK必须等于或快于其他任何从HFCLK分出的时钟。请确保SYSCLK等于或快于CAN的源时钟

4. 常见问题回答

1. 该怎样设置过滤接收一串或某个ID?

如下是配置一个信箱的步骤

Full CAN中选择接收一个ID

      1. 右击CAN组件并选择Configure
      2. Receive Buffers选项卡。
      3. 选择信箱。
      4. 选择Full CAN
      5. ID列中输入要选取接收的ID

阅读PSoC 4100M/4200M Family PSoC 4 Architecture TRM中第17.5.2章节接收滤波器获取更多详情。

Basic CAN中选择接收一个ID

      1. 右键CAN组件并选择Configure
      2. Receive Buffers选项卡。
      3. 选择信箱。
      4. 选择Basic CAN
      5. main.c中声明一个CAN_RX_CFG类型的变量。

CAN_RX_CFG rxMailbox;

对于basic CAN的配置, 它使用接收掩码寄存器 (acceptance mask register, AMR)和接收代码寄存器 (acceptance code register, ACR)设置ID。每个信箱有自己的AMRACR。如下是AMRACR的示意:

      • [31:3] – 识别码IDE = 0时的识别码, ID[31:3] – IDE = 1时的识别码)
      • [2] – IDE
      • [1] – RTR
      • [0] – N/A

结构体CAN_RX_CFG4个元素: rxmailbox, rxamr, rxacr, rxcmd

对于一个信箱的ID设置, 可以通过修改AMRACR设置接收滤波器实现。例如, 如需设置一个信箱的ID0x001, AMRACR的设置如下:

rxMailbox.rxmailbox = 0;

rxMailbox.rxamr= 0x001FFFF9u; //IDE=0 (Standard ID, RTR=0,Bit[31:21]=0 to AMR register

/* writing 1 to a bit in amr register makes respective acr bit as don't care. If 0 the/n corresponding bit in acr register is checked for filtering. */

rxMailbox.rxacr = 0x00200000u; // Write ID = 0x001 to Bit[31:21] (most significant 11 bits of this register for standard ID).

使用基本信箱来接收某一串ID。为配置信箱来接收0x180-187, IDE = 0 (清除), RTR = 0 (清除)ID, 2设置AMRACR寄存器的值。

2. AMRACR寄存器中的值

ACR

AMR

注解

ACR[31:21] = 0x180

AMR[31:21] = 0x7

ID [31:21] 的最后三位需要被设置为无需关注以接收0x180-187ID。因此, AMR设置为0x7

ACR[20:3] = 0x0 (无需关注)

AMR[20:3] = 0x3FFFF (1)

11位识别码设置为无需关注。

ACR[2] = 0

AMR[2] = 0

IDE = 0

ACR[1] = 0

AMR[1] = 0

RTR =0

ACR[0] = 0

AMR[0] = 0

N/A

rxMailbox.rxamr= 0x007FFFF9u; //Writing to AMR register

rxMailbox.rxacr=0x30000000u; //180<<21

然后AMR就可以被用来接收某串ID

2. 怎样动态修改 CAN Rx ID?怎样修改 AMR 和 ACR 寄存器?

设置CAN组件的接收滤波器来动态分配ID。阅读PSoC 4100M/4200M Family PSoC 4 Architecture TRM的章节17.5.2 Acceptance Filter获取更多信息。 12显示了CAN的接收滤波器。标准型识别码 (11)的情况下, AMRACR寄存器的位2131用来过滤。扩展识别码 (29)的情况下, AMRACR寄存器的位331用来过滤。

12, 消息帧有11位识别码, 而且要求第9位和第10位为无须关注位 (01均可)。需要在AMR寄存器中将这两位写为1。因此在 12, 3029都被设置为1

12. CAN的接收滤波器

   pastedImage_3.png

例如, 如果需要将标准型ID修改为0x011, ACR寄存器的位31到位21应该被设置为0x011, 设置AMR寄存器的对应位为0, 用于检查ACR寄存器的接收滤波。

下述代码片段可以用于相关PSoC系列。

PSOC 3PSoC 5LP系列

对于标准型ID

/*0x110 is new ID assigned in the below code, you can assign your own ID */

uint8 result = CAN_FAIL;

uint32 temp_amr;

uint32 temp_acr;

/* obtain necessary value to put in AMR (Bit[31;21]is Mask set to 0 for ID, Bit[20:3]=1, Bit2(IDE)=0, Bit1 RTR=0,Bit0=N/A */

temp_amr = ((uint32)0x0u << 21u) | ((uint32)0x3FFFFu << 3u);

/* obtain necessary value to put in ACR (Bit[31;21]is ID=0x110, Bit[20:3]=1, Bit2(IDE)=0, Bit1 RTR=0,Bit0=N/A */

temp_acr = ((uint32)0x110u << 21u) | ((uint32)0x3FFFFu << 3u); 

/*Writing to AMR reg and check if success*/

if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxamr, temp_amr) == CYRET_SUCCESS)

{

/*Writing to ACR reg and check if success*/

      if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr) == CYRET_SUCCESS)

      {

          result = CYRET_SUCCESS;

      }

}

对于扩展型ID

  uint8 result = CAN_FAIL;

  uint32 temp_amr;

  uint32 temp_acr;         

  temp_amr = ((uint32)0x0u << 3u); /* obtain necessary value to put in AMR (Bit[31;3] are zero */

  temp_acr = ((uint32)0x110u << 3u); /* obtain necessary value to put in ACR (Bit[31;3] is ID 0x110, */

  temp_acr |= (uint32)0x04u; /* Bit2(IDE)=1*/

  if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxamr, temp_amr) == CYRET_SUCCESS)

  {

      if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr) == CYRET_SUCCESS)

      {

          result = CYRET_SUCCESS;

      }

  }

}

在这里temp_acr = ((uint32)0x110u << 3u);ID存储到temp_acrAPI CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr)将此ID写入ACR寄存器。

PSoC 4系列:

#define AMR_1 (0x001FFFF9) /* AMR (Bit[31;21]is Mask set to 0 for ID, Bit[20:3]=1, Bit2(IDE)=0, Bit1   RTR=0,Bit0=N/A*/

#define ACR_1 (0x00600000) /* ACR (Bit[31;21]is ID=0x110, Bit2(IDE)=0, Bit1   RTR=0,Bit0=N/A*/

CY_SET_REG32((reg32 *) (&CAN_Rx_RX[0].rxamr),AMR_1);

CY_SET_REG32((reg32 *) (&CAN_Rx_RX[0].rxacr),ACR_1);

3. 怎样处理总线关闭的情况?

总线关闭的条件是当CAN控制器错误计数器达到255, 也就是说控制器无法在错误发生后恢复。它会触发总线关闭中断服务子程序并且用户可以在中断服务子程序中设置一个标志位。关于配置中断服务子程序的详情, 可以阅读定中断以监视CAN错误事件CAN控制器应该在总线关闭发生时被重启。CAN组件拥有总线关闭后自动重启的特性, 13

13. 总线关闭重启

   pastedImage_1.png

用户也可以参考如下代码片段在固件中重启:

CAN_Start();

CyIntSetVector(CAN_ISR_NUMBER, ISR_CAN);

调用CAN_Stop()不是必须的

4. 怎样动态修改波特率?

使用CAN_SetPreScaler ()CAN_SetTsegSample ()来设置对应的prescalerTsegsjw值。确保在固件中修改波特率时, CAN消息没有被发出或收取。

应该修改Tseg1, Tseg2, SJW, BRP来改变波特率。这些值根据时钟频率和采样点来确定。

对于给定的时钟和波特率如何确定这些值, 可参考组件配置窗口中Timing选项卡里的表格。如 14所示125 Kbps波特率的情况。

14. CAN组件窗口的Timing选项卡

   pastedImage_4.png

14, 对于24 MHz的源时钟和125 Kbps的波特率, 该表格给出了建议的BRPTseg值。根据网络需求和采样点选择值。在 14, 对于采样点81.3, 这些值为: BRP = 11, Tseg1 = 12, Tseg2 = 3, 以及SJW = 3

根据Timing选项卡中的值设置波特率的代码如下

#define BITRATE           (11u) //BRP

#define TSEG1             (12u - 1u) //TSEG1

#define TSEG2             (3u - 1u) //TSEG2

#define SJW               (3u - 1u) //SJW

#define SAMPLING_MODE     (0u) //number of sample point

if (CAN_SetPreScaler(BITRATE) == CYRET_SUCCESS) //Set the BRP value

{

CAN_SetTsegSample(TSEG1,TSEG2,SJW,CAN_SAMPLING_MODE) == CYRET_SUCCESS) //Set TSEG1,TSEG2,SJW and sampling mode.

}

5. 怎样使用CAN_SetPreScaler ()CAN_SetTsegSample ()?

为了设置Tseg1, Tseg2, SJW, CAN_SetTsegSample ()函数传递比期望值小1的参数值。为了设置BRP, 向函数的参数传递传递BRP的值。

举例说明, 设置Tseg1 = 11, Tseg2 = 4, and SJW = 4, 采样模式 = 1 (阅读CAN组件数据手册获取更多详情), 然后传递的参数值如下:

CAN_SetTsegSample(10,3,3,1);

PSoC Creator, 检查在CAN.h文件里是否包含如下使用#defines的宏定义

                        #define CAN_CFG_REG_TSEG1   

#define CAN_CFG_REG_TSEG2      

#define CAN_CFG_REG_SJW

这些使用#defines的宏定义是'Value-1'默认情况下, 是在CAN_Init()函数中, 将这些使用#defines的宏定义传递给CAN_SetTsegSample()函数 (详见CAN.c文件)

6.  CAN通信所需的各种振荡器有哪些不同?

3罗列了不同芯片系列使用的振荡器。

3. 不同芯片可用的振荡器

                                   

振荡器

PSoC 4200M, PSoC 4100M

PSoC 4100 S Plus

PSoC 3PSoC 5LP

IMO

ü  (IMO= 3 MHz, CAN波特率不大于125 Kbps)

WCOIMO

ü 

ü 

外部振荡器

ü 

ü 

ü  (DSI系统时钟)

外部MHz级晶体

ü 

ü 

阅读配置CAN组件的步骤获取详情。

7. 如何识别接收到的消息是一个远程传输请求 (Remote Transmit Request, RTR) 消息?

可以访问CAN0_CAN_RX0_CONTROL寄存器的第21, 来检查RTR消息是否收到。无论何时收到一个RTR消息, 该位会被置1。可参考PSoC 4100M/4200M Family PSoC 4 Architecture TRM中章节3.1.1 CAN0_CAN_RX0_CONTROL的内容。

CAN0_CAN_RX0_CONTROL寄存器被宏CAN_RX_REG定义。因此可以访问该宏:

uint32 reg;

reg= (uint32)CAN_RX_REG;

这样就可以读取该寄存器第21位。

8.    怎样读取已接收消息的识别码?

PSoC 3PSoC 5LP中获得已接收消息的ID

对于扩展型ID

(CY_GET_REG32(CAN_RX_ID_PTR(i)) >> CAN_SET_TX_ID_EXTENDED_MSG_SHIFT)

对于标准型ID

(CY_GET_REG32(CAN_RX_ID_PTR(i)) >> CAN_SET_TX_ID_STANDARD_MSG_SHIFT)

PSoC 4中获得已接收消息的ID

对于扩展型ID

CAN_GET_RX_IDE(i)

对于标准型ID

CAN_GET_RX_ID(i)

9.    怎样判断信箱已接收到消息?

每个信箱都有一个IDPSoC 4, CANn_BUFFER_STATUS寄存器给出了每个信箱的状态 (0:信箱为空;1:信箱中有未读消息)。

缓存器状态寄存器见4

4. CAN缓存器状态寄存器

RxMessageTxMessage缓存器状态

地址: 0x402E0008

可否保持:可保持

7

6

5

4

3

2

1

0

软件访问

R

R

R

R

R

R

R

R

硬件访问

RW

RW

RW

RW

RW

RW

RW

RW

名称

RX7_MSG_AV

RX6_MSG_AV

RX5_MSG_AV

RX4_MSG_AV

RX3_MSG_AV

RX2_MSG_AV

RX1_MSG_AV

RX0_MSG_AV

15

14

13

12

11

10

9

8

软件访问

R

R

R

R

R

R

R

R

硬件访问

RW

RW

RW

RW

RW

RW

RW

RW

名称

RX15_MSG_AV

RX14_MSG_AV

RX13_MSG_AV

RX12_MSG_AV

RX11_MSG_AV

RX10_MSG_AV

RX9_MSG_AV

RX8_MSG_AV

23

22

21

20

19

18

17

16

软件访问

R

R

R

R

R

R

R

R

硬件访问

RW

RW

RW

RW

RW

RW

RW

RW

名称

TX7_REQ_PEND

TX6_REQ_PEND

TX5_REQ_PEND

TX4_REQ_PEND

TX3_REQ_PEND

TX2_REQ_PEND

TX1_REQ_PEND

TX0_REQ_PEND

31

30

29

28

27

26

25

24

软件访问

硬件访问

名称

[31:24]

PSoC 3PSoC 5LP, CAN[0..0]_CSR_BUF_SR寄存器提供了信箱状态, 寄存器详情见5

5. CAN0_CSR_BUF_SR

BUF_SR

Address = 0x4000a008

复位:对于非保持触发器域复位 [reset_all_nonretention]

寄存器:地址

CAN0_CSR_BUF_SR: 0x4000A008

7

6

5

4

3

2

1

0

软件访问:复位

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

硬件访问

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

可否保持

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

名称

rx_msg7

rx_msg6

rx_msg5

rx_msg4

rx_msg3

rx_msg2

rx_msg1

rx_msg0

15

14

13

12

11

10

9

8

软件访问:复位

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

硬件访问

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

可否保持

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

名称

rx_msg15

rx_msg14

rx_msg13

rx_msg12

rx_msg11

rx_msg10

rx_msg9

rx_msg8

23

22

21

20

19

18

17

16

软件访问:复位

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

硬件访问

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

可否保持

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

名称

tx_msg7

tx_msg6

tx_msg5

tx_msg4

tx_msg3

tx_msg2

tx_msg1

tx_msg0

31

30

29

28

27

26

25

24

软件访问:复位

NA:00000000

硬件访问

NA

可否保持

NA

名称

RSVD

10. 是否有CAN Bootloader的例程?

点击此处获取PSoC 5LP CAN Bootloader的例程。在使用PSoC 3PSoC 5LP创建CAN Bootloader时可以看到此工程。

对于PSoC 4, 使用配置为自定义通信方式 (详见Bootloader组件数据手册) PSoC 4 Bootloader组件。查看Bootloader例程中CAN_BOOT.c文件并使用PSoC 4 CAN组件的API

11. PSoC CAN中断是否支持触发DMA?

PSoC 4MPSoC 4L系列不支持CAN中断触发DMAPSoC 4100S Plus系列支持CAN中断触发DMA

12. 怎样链接多个CAN信箱?

当多个消息被接收到时, 当前消息会被覆盖。

为了避免覆盖, 使用信箱的链接标志位 (RX_CMD寄存器的位6) 来链接多个信箱。设置信箱1的链接标志位可链接信箱1和信箱2。设置信箱2的链接标志位可链接信箱2和信箱3, 依次类推。

最简单的链接方式是使用CAN_SET_RX_LINKING(i)的宏, i为对应信箱。

CAN启动后, 可以使用如下宏:

CAN_SET_RX_LINKING(0);

CAN_SET_RX_LINKING(1);

.

.

.

CAN_SET_RX_LINKING(14);

不可对最后一个信箱即第15个信箱设置该位, 因为没有信箱再需要链接。

在链接各信箱之后, 消息将按顺序驻留在个信箱中 (第一个消息在信箱0, 第二个消息在信箱1, 依次类推)。用户可从对应信箱中访问消息。确保所有信箱有相同的AMRACR设置。

为了对CAN_SET_RX_LINKING(i)执行写操作, 命令寄存器的写保护位应先清0CAN_CLEAR_RX_WNPL()用于清0命令寄存器的写保护位, CAN_SET_RX_WNPL()用于将该位置位。

阅读CAN组件数据手册、对应芯片的架构和寄存器TRM获取更多详情。

13. 当信箱被重命名时, CAN_TX_RX_func.c中添加过的用户代码会被删除。应该怎样处理?

当信箱被重命名后, CAN_TX_RX_func.c文件会重新生成并且自定义的代码会无效。

解决方法是在重命名信箱之前备份自定义的代码, 然后:

      1. 重命名信箱
      2. 编译工程。
      3. 放入备份的自定义代码。
      4. 重新编译工程

14. CAN组件是否支持Vector协议栈?

PSoC 3有兼容Vector CAN的组件版本。用户应使用基于Vector提供的PSoC 3驱动使用此Vector CAN组件。详见芯片数据手册PSoC 5LPPSoC 4不支持Vector CAN组件。但在这些芯片应用中, 用户可以建立自己的协议栈。

15. PSoC支持单芯片的双CAN模块吗?

PSoC 3PSoC 5LP以及PSoC 4100S Plus只有一个CAN模块。PSoC 4LPSoC 4M支持双CAN模块。

16. 是否有J1939库的例程?

没有J1939例程。

17. CAN组件带有在线诊断 (On Board Diagnostics, OBD) 库吗?

CAN组件不带OBD

18. 为什么在CAN组件中不能够将CAN ID设置为0x1FFFFFFF?

根据CAN协议, 一个CAN ID7个最重要的位不能全部位隐性, 因此CAN消息ID, 标准型11位识别码范围为0x0000x7EF, 扩展的29位识别码范围可到0x1FBFFFFF。因此CAN组件无法支持0x1FFFFFFFID

19. 如何实现接收超过8字节数据并且不丢失之前CAN缓存中的数据?

详见怎样接多个CAN信箱

20. 是否有用于CAN错误处理的计数器。如果有的话。在计数器计满之后应该怎样做?

是的, CAN 2.0有一个专门的错误计数器。API CAN_GetTXErrorCount()CAN_GetRXErrorCount()分别返回TxRx的错误计数。如果错误计数器的计数达到255, CAN节点将被禁止收发, 即总线关闭错误。在总线关闭错误出现时, 应重启CAN控制器。

21. 为什么尽管CAN_SendMessage只调用了一次, CAN收发却一直在进行?

根据CAN协议, CAN将会发送数据并检查确认字符 (Acknowledgement, ACK)。如果节点未收到任何ACK, 其错误计数器将会增加8并重新发送。该过程将持续至CAN收到ACK或者触发总线关闭错误。因此尽管只调用一次CAN_SendMessage, 但仍然能看到持续的消息。如果不希望消息重发, 可使用单发模式。在此模式下, 即使没有收到ACK, 消息也不会重发。该模式在PSoC 4上支持但是在PSoC 3PSoC 5LP上不支持。

CAN配置窗口使能单发模式见 15

15. CAN配置窗口使能单发模式 (Single Shot Transmission, SST)

pastedImage_39.png

22. 怎样使用CAN消息将PSoC从休眠 (Hibernate) 模式中唤醒?

CAN组件无法将PSoC从休眠模式中唤醒。但是, CAN Rx管脚能够被配置为中断管脚来唤醒芯片:

      1. 右键Rx管脚并选择Configure
      2. Input选项卡。
      3. 选择InterruptFalling edge
      4. Rx管脚上可以看到一个IRQ端子;连接ISR组件到此Rx管脚。

阅读下列关于低功耗模式的应用手册:

当从休眠或其他低功耗模式唤醒芯片过程中, 将会发送一个冗余帧。应该在芯片唤醒后再初始化实际数据的发送。

23. CAN组件是否支持通用数字模块 (Universal Digital Block, UDB) ?

不。CAN组件和UDB的连接不可行。

24. CAN组件是否带有CAN-open?

不。没有带CAN-open库的CAN组件。

25. PSoC是否支持CAN FD?

不。目前, PSoC不支持CAN FD。但是, 赛普拉斯正在考虑将此特性加入汽车级PSoC芯片。

0 点赞
1183 次查看
贡献者