查看: 2423|回复: 6

CANopen学习笔记

[复制链接]
  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2016-11-17 14:45:22 | 显示全部楼层 |阅读模式
    分享到:
    最近在学习EtherCat,用的是德国BeckoffET1100,主要使用CANOPEN协议,
    由于是刚接触CANopen协议,开始有点头大,不知何去何从。
    仔细研究了找到的参考代码研究了2天,发现,其实CANopen协议的本质就是维护一堆变量,不过这堆变量的数目很庞大,需要一一搞明白。
    下面一一道来。
    一、EtherCatMCU通讯
    本质就是SPI通讯,切记。
    1.首先要初始化SPI,如我用的是stm32f407,用的是PA4,5,6,7
    PA4----CS
    PA5----CLK
    PA6----MISO
    PA7----MOSI
    对应的ET1100使用管脚如下:
    PD10---CLK
    PDI1----CS
    PDI2----MISO
    PDI3----MOSI
    如果想使用ET1100的中断管脚,再增加一个IO口,并设置该IO口外部中断即可。
    SPI初始化完成后要对ET1100进行一次写和读操作,确认SPI通讯正常,同时也检测EtherCat可以正常工作。向0x0204地址中写入0x93,然后读取。反复进行,直到写入与读取的值相同为止。然后清除0x0204地址的值。
    同步时钟的输入输出中断可用,可不用。
    同时要启动一个定时器。

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2016-11-17 14:45:52 | 显示全部楼层
    2.ECAT初始化
    调用ECAT_Init()函数。
    详细如下:
    2.1读取0x0004地址的值,确定maximum number of Sync Manager channels,
    2.2读取0x0006地址的值,然后get max address
    2.3读取0x0502地址的值,Get EEPROM loaded information
    2.4disables all Sync Manager channels
    2.5initialize the mailbox handler 主要初始化mailbox相关的变量
    2.5.1接收和发送大小及地址(选用Process Data RAM)
    2.5.2接收和发送队列的相关变量
    2.5.3Pointer to write mailbox buffer
    2.5.4Pointer to repeat mailbox buffer
    2.5.5Pointer to read mailbox buffer
    2.5.6Pointer to store mailbox buffer
    2.5.7Mailbox repeat toggle的flag
    2.5.8Reset Repeat acknowledge bit of SyncManager1
    2.5.9mbx是否running,full,islocked
    2.5.10mbx发送请求store,读写counter


    2.6初始化一些相关变量
    2.7initialize the AL Status register
    2.8initialize the COE
    初始化COE相关的发送标志,与发送数量
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2016-11-17 14:46:22 | 显示全部楼层

    3.CANopen初始化
    调用COE_ObjInit()
    详细如下:
    3.1initialize the Sync Manager Output and input parameter object
    3.2initialize the object dictionary
    加入初始object到堆栈中
    3.3其他相关变量初始化
    3.4timer相关变量初始化
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2016-11-17 14:47:10 | 显示全部楼层
    4.Main loop
    4.1首先是几个模式的判断:FreeRun-Mode,Synchron-Mode,DC-Mode
    通过判断ESC中断,输出接收标志,时钟同步激活3个标志
    4.2如果是FreeRun-Mode,first we have to check, if outputs were received,
    关所有中断,启动SPI通讯,读取0x0220的值,开启所有中断。然后判断是否为输出进程。
    首先通过HW_GetALEventRegister()读取中断事件,详细流程如下:
    HW_GetALEventRegister()-------------------GetInterruptRegister()------------0x220地址的内容
    如果是输出事件,调用PDO_OutputMapping()函数,发送 the address of the Sync Manager Channel 2中的内容。
    如果输出大小为0,启动看门狗,复位。
    关闭ECAT中断。
    ECAT_Application()---------APPL_Application()调用
    判断 the SAFEOP or OP state状态,把发送的数据通过APPL_InputMapping()更新从适合发送的格式,然后发送出去。
    使能ECAT中断。
    判断是否使能timer。
    调用ECAT_Main()函数,首先调用MBX_Main(),检查邮箱是否有新数据存储,然后读取邮箱的数据。如果邮箱被锁,读取邮箱接收地址的值,检测有没有充足的memory,如果没有,报错。如果有memory,把邮箱的长度更新为读取的大小加上邮箱head大小。判断是否发送MBX是否仍为full或发送是否完成,如果是,继续lock mbx,如果完成,解锁,同时,判断接收数据大小是否会产生溢出,分配空间。把接收数据存储到memory,随后,读取0x0804内的状态,判断mbx的buffer是否full,解锁邮箱。调用MBX_MailboxWriteInd(),判断mbxsize,超过最大值,报错,正常情况,如果mbx数据为0或与要写的数据大小不等,把要写的数据改成当前值,同时把发送的数据压入队列。如没完成压入操作,报错。如果以上都不满足,释放mbx的buffer,并把指针复位。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2016-11-17 14:48:01 | 显示全部楼层
    分享完成了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-3-13 10:11
  • 签到天数: 1088 天

    连续签到: 2 天

    [LV.10]以坛为家III

    发表于 2016-11-17 15:20:00 | 显示全部楼层
    EtherCat不是用的以太网的物理层吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2016-11-17 15:24:40 | 显示全部楼层
    是工业以太网,,
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 06:50 , Processed in 0.157475 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.