硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1174|回复: 10
收起左侧

[CAN/FDCAN] canopennode驱动函数

[复制链接]

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2024-10-18 17:09:53 | 显示全部楼层 |阅读模式
请问这个函数CO_CANmodule_process()有用到么  ,原版是这样的,可以不用改么,我看咱们得例子上是改了的
void
CO_CANmodule_process(CO_CANmodule_t* CANmodule) {
    uint32_t err;

    err = ((uint32_t)txErrors << 16) | ((uint32_t)rxErrors << 8) | overflow;

    if (CANmodule->errOld != err) {
        uint16_t status = CANmodule->CANerrorStatus;

        CANmodule->errOld = err;

        if (txErrors >= 256U) {
            /* bus off */
            status |= CO_CAN_ERRTX_BUS_OFF;
        } else {
            /* recalculate CANerrorStatus, first clear some flags */
            status &= 0xFFFF
                      ^ (CO_CAN_ERRTX_BUS_OFF | CO_CAN_ERRRX_WARNING | CO_CAN_ERRRX_PASSIVE | CO_CAN_ERRTX_WARNING
                         | CO_CAN_ERRTX_PASSIVE);

            /* rx bus warning or passive */
            if (rxErrors >= 128) {
                status |= CO_CAN_ERRRX_WARNING | CO_CAN_ERRRX_PASSIVE;
            } else if (rxErrors >= 96) {
                status |= CO_CAN_ERRRX_WARNING;
            }

            /* tx bus warning or passive */
            if (txErrors >= 128) {
                status |= CO_CAN_ERRTX_WARNING | CO_CAN_ERRTX_PASSIVE;
            } else if (txErrors >= 96) {
                status |= CO_CAN_ERRTX_WARNING;
            }

            /* if not tx passive clear also overflow */
            if ((status & CO_CAN_ERRTX_PASSIVE) == 0) {
                status &= 0xFFFF ^ CO_CAN_ERRTX_OVERFLOW;
            }
        }

        if (overflow != 0) {
            /* CAN RX bus overflow */
            status |= CO_CAN_ERRRX_OVERFLOW;
        }

        CANmodule->CANerrorStatus = status;
    }
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-19 09:33:20 | 显示全部楼层
我们那个是做了个CANFD的选择。这个有点区别。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-10-19 11:33:49 | 显示全部楼层
err = ((FDCAN_HandleTypeDef*)((CANopenNodeSTM32*)CANmodule->CANptr)->CANHandle)->Instance->PSR
          & (FDCAN_PSR_BO | FDCAN_PSR_EW | FDCAN_PSR_EP);
请教下,如果是标准库的话  这句话怎么改,后面的我觉得可以复制过来  就这句需要改下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-20 10:33:47 | 显示全部楼层
aqtcwangwy 发表于 2024-10-19 11:33
err = ((FDCAN_HandleTypeDef*)((CANopenNodeSTM32*)CANmodule->CANptr)->CANHandle)->Instance->PSR
     ...

直接操作寄存器PSR即可。你看下你用的这款芯片是这个寄存器不
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-10-21 11:00:49 | 显示全部楼层
还有个问题请教下,我按照你的例程函数写的,为什么会有218和219的数据,还有只发送618没有619,这两条应该是一起发送出去的吧,即使从机没上电也不影响吧
1729479550104.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-21 11:35:59 | 显示全部楼层
aqtcwangwy 发表于 2024-10-21 11:00
还有个问题请教下,我按照你的例程函数写的,为什么会有218和219的数据,还有只发送618没有619,这两条应该 ...

218,219是这个

234.png



回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-10-21 15:44:42 | 显示全部楼层
对  我就想问下你截图里的序号32 和33   是怎么出来的  我一上电就发,我已经把1006设置为0了,不产生同步报文
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-10-21 15:50:15 | 显示全部楼层
我发送SDO的话,主机会发送这两条命令
1729496939692.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-21 15:53:08 | 显示全部楼层
aqtcwangwy 发表于 2024-10-21 15:50
我发送SDO的话,主机会发送这两条命令

我这里有所有截图,你可以看下

BSP视频教程第28期:CANopen协议栈专题,CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法(2023-11-01)
https://forum.anfulai.cn/forum.p ... 1619&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2024-10-22 16:33:54 | 显示全部楼层
这句话CO_TPDOsendRequest(&CO->TPDO[0]); 里面的TPDO[0]为什么是0,这个下标是啥意思
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-23 09:56:52 | 显示全部楼层
aqtcwangwy 发表于 2024-10-22 16:33
这句话CO_TPDOsendRequest(&CO->TPDO[0]); 里面的TPDO[0]为什么是0,这个下标是啥意思

这对应一个结构体数组。是词典工具生成的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 19:00 , Processed in 0.047574 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表