ET9300-EtherCAT从站协议栈应用指南——第三弹,硬件抽象层预览

本节比较的无聊,全程纸上谈兵,粗略的介绍了一下硬件抽象层需要对接的函数。
总的来说,硬件抽象层的实现需要包含如下功能

  • ESC读写访问
  • 定时器(1ms base)
  • 每隔1ms调用一次定时中断服务函数(仅当timer 中断支持的时候,ECAT_TIMER_INT 置为1)
  • 调用指定的中断服务函数(仅当支持同步的时候)
    – PDI 中断(仅当支持AL_EVENT,AL_EVENT_SUPPORTED置为1)
    – SYNC0 中断 (仅当 支持DC的时候,DC_SUPPORTED置为1)

宏定义

ecat_def.h中定义了一些与硬件相关的宏

宏定义描述
EL9800_HW针对到手即用的特定硬件
PIC24针对到手即用的特定硬件
PIC18针对到手即用的特定硬件
MCI_HW??
FC1100_HW针对到手即用的特定硬件
CONTROLLER_16BIT运行协议栈的控制器是16位的
CONTROLLER_32BIT运行协议栈的控制器是32位的
ESC_16BIT_ACCESS对ESC的访问16Bit对齐
ESC_32BIT_ACCESS对ESC的访问32Bit对齐
MBX_16BIT_ACCESS对邮箱的访问16Bit对齐
BIG_ENDIAN_16BITuC对外部存储按照16bit访问,且工作在大端,置此位
BIG_ENDIAN_FORMATuC工作在大端,置此位

中断服务函数

void ECAT_CheckTimer (void)

该函数需要每隔 1 毫秒从定时器 ISR(ECAT_TIMER_INT = 1)调用一次。如果不支持定时器中断,则会在 1 毫秒后自动调用该函数(基于提供的定时器)。

void PDI_Isr (void)

该函数需要从 PDI ISR 调用。为支持 PDI 中断处理,还需要将 "AL_EVENT_ENABLED "设为 1。

void Sync0_Isr (void), void Sync1_Isr (void)

该函数需要从SYNC 0 ISR 调用。Sync0 中断由 ESC 的 DC 单元产生。目前默认情况下不支持将 Sync0 信号映射到 PDI 中断。要支持DC同步,需要设置 “DC_SUPPORTED”。

该函数需要从 Sync1 ISR 调用。Sync1 中断由 ESC 的 DC 单元产生。目前默认情况下不支持将 Sync1 信号映射到 PDI 中断。要支持DC同步,需要设置 “DC_SUPPORTED”。

ENABLE_ESC_INT DISABLE_ESC_INT

开启和关闭上述4个中断源

接口函数、宏

UINT16 HW_Init(void)

初始化,请求资源

void HW_Release(void)

释放资源

UINT16 HW_GetALEventRegister(void)

获取AL Event 寄存器 (0x220-0x221).前两个字节

UINT16 HW_GetALEventRegister_Isr(void)

如果需要从中断服务例程访问 ESC 的特殊函数,则应执行此函数;否则,此函数定义为 HW_GetALEventRegister。获取 AL 事件寄存器(0x220-0x221)的前两个字节。

void HW_SetLed(UINT8 RunLed,UINT8 ErrLed)

设置LED

void HW_RestartTarget(void)

复位硬件,该函数只有BOOTSTRAPMODE_SUPPORTED设置为1的时候才被需要

UINT32 HW_GetTimer(void)

读取硬件定时器的当前寄存器值。如果没有硬件定时器,函数将返回多媒体定时器的计数器值。定时器 tick 值(增量/毫秒)在 "ECAT_TIMER_INC_P_MS "中定义。如果不支持定时器中断(“ECAT_TIMER_INT” = 0),则需要使用该函数计算总线周期时间。

void HW_ClearTimer(void)

清除定时器值

UINT16 HW_EepromReload (void)

如果主站触发了 EEPROM 重载请求,则调用该函数。只有在支持 模拟EEPROM 且未设置功能指针 "pAPPL_EEPROM_Reload "时才需要。如果配置了完整的模拟EEPROM(寄存器 0x502,bit6 为 1),则不会调用重载功能,也无需执行该功能。

弃用API

5.10以前的协议栈才会用到的APi
void HW_ResetALEventMask(UINT16 intMask)
void HW_SetALEventMask(UINT16 intMask)
void HW_DisableSyncManChannel(UINT8 channel)
void HW_EnableSyncManChannel (UINT8 channel)
TSYNCMAN * HW_GetSyncMan(UINT8 channel)

读写访问

读写DPRAM区域,看函数名称和形参应该就可以看出意义,所以不解释了
void HW_EscRead(MEM_ADDR *pData, UINT16 Address, UINT16 Len )
void HW_EscWrite(MEM_ADDR *pData, UINT16 Address, UINT16 Len )
void HW_EscReadIsr(MEM_ADDR *pData, UINT16 Address, UINT16 Len )
void HW_EscWriteIsr(MEM_ADDR *pData, UINT16 Address, UINT16 Len )

void HW_EscReadDWord(UINT32 DWordValue, UINT16 Address)
void HW_EscWriteDWord(UINT32 DWordValue, UINT16 Address)
void HW_EscReadDWordIsr(UINT32 DWordValue, UINT16 Address)
void HW_EscWriteDWordIsr(UINT32 DWordValue, UINT16 Address)

void HW_EscReadWord(UINT16 WordValue, UINT16 Address)
void HW_EscWriteWord(UINT16 WordValue, UINT16 Address)
void HW_EscReadWordIsr(UINT16 WordValue, UINT16 Address)
void HW_EscWriteWordIsr(UINT16 WordValue, UINT16 Address)

void HW_EscReadByte(UINT8 ByteValue, UINT16 Address)
void HW_EscWriteByte (UINT8 ByteValue, UINT16 Address)
void HW_EscReadByteIsr(UINT8 ByteValue, UINT16 Address)
void HW_EscWriteByteIsr(UINT8 ByteValue, UINT16 Address)

void HW_EscReadMbxMem(MEM_ADDR *pData, UINT16 Address, UINT16 Len )
void HW_EscWriteMbxMem(MEM_ADDR *pData, UINT16 Address, UINT16 Len )

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝地亚狂想曲

送我一瓶农夫山泉?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值