CAN通信开发过程中比较难得地方

CAN通信开发过程中比较难得地方标准 BSW 模块或 Rte 交互 1 制作 DBC 里面是内部的 制作一个只有一个报文 一个发送报文 一个接收范围报文 的 dbc 文件 然后将该 dbc 加载进 cfg 中去 作为内部通信 can 的报文注 1 内部通信使用 不会往 com 层送 sopport 取消 dbc 配置 2DBC 名字 networks 节点下面 要修改 不然不可以合并 2 然后开始配置 CAN CANM OS ECUC CDD 模块 CANif RTE 3 打开 CAN 通道 BSWmenege 中打开 COMallow

1 在配置预分频系数的时候(CAN控制器)

can控制器

can——cabcontroller中给的预分频系数配置与 can时钟频率 还有波特率有关

配置好这两个,就可以根据系统配置配置好

时钟频率可以在MCU模块中看到,TC275是80Mhz

波特率的配置和 位时间参数的配置有关,要配置好控制器的同步段宽度等一些参数,然后可以根据系统配置完成

这里的位定时参数,需要查看CAN的通信协议11898里面数据链路层定义了位定时参数的相关定义,比如采样位置、TQ梳理、同步跳转宽度等

可以看到位时间为2000ns(2微秒),因为FHSCAN=500,1/500K=2000ns

位时间中有:同步段、相位缓冲段。相位缓冲段1的结束和相位缓冲段2的开始就是采样点(75%-82%)。整个段的长度最小值位10个TQ,最大值位20个TQ。采样宽度就是整个位时段

对应下图中的2个相应配置就是16个tq和4个tq:

第一个段(同步段 synchronization segment)默认为1个TQ,所以controller PROpseg可以设置为11,Controller seg2 可以设置为4个tq (5和10,会导致出错,因为cfg会希望前面一个大于后面一个,具体原因应该是系统决定的)

配置完后分频系数如下进行配置:

2完整配置链路(导入全新的dbc)

配置步骤:

1 CAN(can控制器、can邮箱等)

2 CANif模块 需要进行重新索引

3 pdur和canif强关联

4 COM模块,因为上层没有mapping会报错

5 BSW meneger

6 CANtp模块诊断相关的

7配置CANtrcv模块: 重新索引(一个)

8  OS模块(can中断被改变了,因为CAN控制器没弄好):

9配置Dcm模块(诊断模块中的东西):按照原来的项目配置,然后索引CAN通道

10最后剩下RTE等的问题,需要在DEV中去解决(softdesiner中删除旧的数据,然后再datamapping中mapping将数据信号,将底层的信号(cfg中配置好的信号)弄到应用层(appcomtx等)去使用。以signal group位单位mapping数据。然后再softdesigner中拖动信号组放到应用层去使用,同时迪纳基模块将接口全部添加mainfucion的access)

13 CFG中重新生成,同步,编译

3 找错误的时候 (就是完整链路配置的时候 出现收不到报文)

1 在任意的mainfuction函数 是否能够进来报文 (能进来说明没跑死)

2 can中断进行打断点 (看是否能够进来)不能进来 ,能进来排查其他错误

3 看com看com通道是否被打开了,如果打开了

4 就看can控制器和can收发器是否被打开了

键是熟悉代码,从链路层查找问题。

最后的问题是:cansm模块切换收发器的时候 CAN收发器,没有和控制器索引上,导致无法和can收发器索引上

最后在canoe进行测试,测试报文周期,平均周期等时间                   进行报文测试

4CDD(配置新得一路通讯CAN得时候  用于内部通信 或者 是MCU中两个芯片建立通信)

标准BSW模块或Rte交互

1 制作DBC(里面是内部的),制作一个只有一个报文(一个发送报文,一个接收范围报文)的dbc文件,然后将该dbc加载进cfg中去,作为内部通信can的报文

注:1 内部通信使用,不会往com层送(sopport取消),dbc配置,2 DBC名字(networks节点下面)要修改,不然不可以合并

2 然后开始配置(CAN、CANM、OS、ECUC、CDD模块、CANif、RTE)

3 打开CAN通道(BSW menege中打开,COMallow中加进来新的com通道,Allow之后还需要调一个com请求,一直请求fullcom(一直保持通讯得状态配置,让他一直永远请求fullcom))

4 因为配置一路can需要

注:内部CAN和整车CAN的区别:

1 内部can不要送到com层去

2 内部can没有网管配置,外部不用给唤醒,一直处于活动状态,因此cannm模块和nm模块配置的内部can都删除

3 整车can的passive mode enable的勾选取消,因为如下翻译整车can肯定需要NM节点来唤醒,因此取消勾选。

(该参数决定了网络是否启用被动模式。以下是这段文字的翻译:

如果设置为TRUE,则启用网络的被动模式。被动节点不能发送NM PDU(网络管理协议数据单),因此无法保持网络处于唤醒状态。然而,被动节点可以通过接收其他ECU(电子控制单)的NM PDU来被网络唤醒。

如果设置为FALSEECU将能够通过发送自己的NM PDU来保持网络处于唤醒状态。)

4 内部can的预分频系数,同步段事件,相位缓冲段等的时间配置,由公司内部进行规定(目前就按照整车can的配置)

5  ComM模块中的NM Variant配置

内部通讯CAN需要她一直请求,配置none(然后grobe pass mode 要配置成为ture;  在comgenerate中配置和NM模块中将passivemode配置成ture;并且在NM模块删除内部通信得报文)

6 OS的配置,要将内部通信CAN的优先级拉低 Isl interrupt Priority

7 配置EcuC:

刚刚在dbc中设置了,不发到com模块中去,所以在com模块中不会生成那两个通讯报文

Pdur也不会生成,但是在EcuC中生成了

报文从can模块送到CANif模块就找不到上层了

而EcuC是索引CANif和上层模块的,所以会报错。

我们通讯报文不往常规链路层上层发送,就选择CDD为他的上层

在CANif中配置CDD,CDD就是上层模块自定义

CAN 到CANIF 就到CDD模块了(ECUC可以理解为canif和cdd模块的桥梁)

8 BSW menege模块中去把CAN通道给打开

Allow 内部通信CAN(再bsw menege模块的 auto configuration ECU state handing模块中的Ruler的ESH wakeuptorun 查看action,要allow内部通信can)

Runtopost是管理休眠的

然后再ESH_wakeuptorun中添加一个action,让内部通讯can可以被唤醒后一直保持通信,保持comfullcan的状态(添加一个comM_mode_swich,然后请求模式是BSWM_FULL_COM)

在ESH_RUNtopostrun,暂停管理中,将内部通讯can有关的去掉,有一个自动生成的条件,就是内部通讯can变成nocom的时候i,将其删除,因为该can的状态永远是fullcom

9 将CAN收发器打开,通过EB mcal配置,将cantx和canrx的io口配置正确,以及控制收发的STB引脚(CAN_STB拉低就是standby模式,拉高是nomal模式)。

10 CAN中断配置(OS模块和CAN模块),can中断源(OsIsrInterruptSource 自己计算查看芯片手册,通过使用的哪路can以及计算公式)以及CAN控制器所用的节点,要通过芯片手册配置

CanPhysicalNode、CanIOPort、CanPhysicalNode、CanIOPort(Receive input selection)

11 CDD中写测试代码,接收到数据就,计数器加1  (该部分报文直接链接从)

12 CDD中目前只可以接收道0x100的报文,如下问题

此处比较特殊:因为他不是网管报文,网管报文可以直接creat range,非网管报文,前面的bacsic配置的canfeiltermask确保了所有报文可以进入ccan中断,但是没有进入该函数,目前配置就是将所有报文可以进入该函数。

然后此处的范围由2种配置方法:1 create range

2 id可以用作code使用,然后下面是mask根据receive & mask =mask & code公式同样可获取范围

此处0x00和0x00

12 该通道发送报文:从appctrl中使用canif_transmit函数,发出0x100的报文

    CanInter_Transmit();

5 网络管理的机制(网络状态管理机)

6 网络管理部分的测试(几个时间)

1、KL30上电后,MCU软件会初始化,进入到BSM状态并保持,直到有唤醒源进行唤醒,才会进入到下一个状态

2、当DUT在BSM状态接收到外部唤醒源后,进入到RMS状态

        1)并在T_WakeUp时间内发出第一帧网络管理报文,且第一帧报文只能是NM报文,不能是APP报文;

        2)在发出第一帧NM报文后的T_Start_App_Tx时间内,必须发出APP报文;

        3)在重复报文状态,需要将重复报文状态为置1,如果存在快发就以快发周期(T_ImmediateCycleTime)发送;

        4)在重复报文保持的时间为T_Repeat_Message。 

3、在RMS状态结束后,会出现2种情况;一种是如果检测到有保持源的情况下,他会进入到NOS状态(我们常见的保持源是KL15、IG、NM Msg);另外一种是没有保持源的情况下,他会直接进入到RSS状态;

4、如果在第3步成功进入到NOS状态,这个时候我们的DUT处于正常的工作状态,只要保持源存在,我们会一直保持在NOS状态,NOS状态NM报文以周期T_Nm_MessageCycleTime持续发送;

5、如果在NOS状态接收到重复状态位为1的NM报文,它会再次进入到RMS状态,这时候我们会回到步骤3;

6、如果DUT在NOS中丢失了保持源,它就会停发NM报文并进入RSS状态。

7、如果在RMS状态结束后没有接收到保持源进入到了RSS状态,在这里就会出现3种情况:

        1)接收到保持源,它会进入到NOS状态

        2)接收到重复报文状态位为1的NM报文,它会再次回到RMS状态,DUT会在T_Start_NM_Tx时间内发出NM报文

        3)没有接收到任何报文的话,等待T_Nm_TimeOut超时后,会停发App报文并进入到PBSM状态

8、在PBSM状态中,等待T_Wait_Bus_Sleep时间后,就关闭CAN收发器,并进入到低功耗模式

        以上就是Autosar完整的处理逻辑,并且每一个位置的处理信息和处理点都有详细的描述,整个网络管理跳转状态 也清晰的展示给了大家。

T_Start_NM_Tx      10ms    节点在NOS或者RSS状态进入到RMS状态的最大时间

T_Start_App_Tx     20ms    第一帧NM报文和第一帧APP报文的时间最大偏差

T_ImmediateCycleTime     20ms    快发NM报文周期

T_Nm_MessageCycleTime 100ms  网络管理报文时间周期

T_WakeUp      100ms  KL15或者NM报文唤醒到首帧NM Msg发出的时间最大值

T_ImmediateNm_Times     10  重复报文状态时的快发报文帧数

T_Repeat_Message     1500ms 节点在RMS状态中持续的时间

T_Nm_TimeOut    2000ms 在RSS状态后等待该时间进入到PBSM

T_Wait_Bus_Sleep      2000ms 确保所有的节都停止网路活动

今天的文章 CAN通信开发过程中比较难得地方分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-25 15:17
下一篇 2024-12-25 15:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/96160.html