完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在学习EtherCat,用的是德国Beckoff的ET1100,主要使用CANOPEN协议, 由于是刚接触CANopen协议,开始有点头大,不知何去何从。 仔细研究了找到的参考代码研究了2天,发现,其实CANopen协议的本质就是维护一堆变量,不过这堆变量的数目很庞大,需要一一搞明白。 下面一一道来。 一、EtherCat与MCU通讯 本质就是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地址的值。 同步时钟的输入输出中断可用,可不用。 同时要启动一个定时器。 |
|
相关推荐
|
|
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相关的发送标志,与发送数量 |
|
|
|
|
|
3.CANopen初始化
调用COE_ObjInit() 详细如下: 3.1initialize the Sync Manager Output and input parameter object 3.2initialize the object dictionary 加入初始object到堆栈中 3.3其他相关变量初始化 3.4timer相关变量初始化 |
|
|
|
|
|
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,并把指针复位。 |
|
|
|
|
|
您好!我最近在弄这个东西,我想请问下有没有碰到这个情况:从站正常工作中时,突然断电,立刻再次开电。会出现PHY连接不上的情况。这种有没有碰到过???
|
|
|
|
|
|
479 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
229 浏览 0 评论
334 浏览 0 评论
165 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
496 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 15:49 , Processed in 0.757816 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号