本节比较的无聊,全程纸上谈兵,粗略的介绍了一下硬件抽象层需要对接的函数。
总的来说,硬件抽象层的实现需要包含如下功能
- 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_16BIT | uC对外部存储按照16bit访问,且工作在大端,置此位 |
BIG_ENDIAN_FORMAT | uC工作在大端,置此位 |
中断服务函数
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 )