/* 在超时时间内、设置EEprom 状态机忙位busy→idle、APRD方法
* @param[in] context = context struct
* 上下文结构体
* @param[in] aiadr = auto increment address of slave
* 从站自增地址
* @param[in] timeout = Timeout in us.
* 超时时间[单位:us(微秒)]
* @return retval
* 返回值
* 1:Reg0x0502.15 EEprom 状态机忙位busy→idle
* 0:Reg0x0502.15 EEprom 状态机忙位busy不变
*/
uint16 ecx_eeprom_waitnotbusyAP(ecx_contextt *context, uint16 aiadr,uint16 *estat, int timeout)
{
int wkc, /* 工作计数器 */
cnt = 0;/* 执行回数-1:参数的超时时间为首次睡眠时间 */
uint16 retval = 0;/* 返回值 */
osal_timert timer;/* 定时器:记录时间精确到us(微秒) */
osal_timer_start(/* 通过以超时时间[单位:us(微秒)]来启动计时器,设置停止时刻 */
&timer, /* 定时器:记录时间精确到us(微秒) */
timeout);/* 超时时间[单位:us(微秒)] */
do
{
if (cnt++)/* 只执行一次 */
{
/* 睡眠函数,休眠到要求的时间(指定的延迟时间[单位:usec]) */
osal_usleep(
EC_LOCALDELAY/* eeprom准备循环的延迟时间[单位:us(微秒)]=200us */);
}
*estat = 0;/* Reg0x0502:0x0503 EEPROM Control/Status */
/*
0x0502:0x0503.0 ECAT write enable: ECAT帧写使能
0: Write requests are disabled:写请求无效
1: Write requests are enabled This bit is always 1 if PDI has EEPROM control. :使能写请求
0x0502:0x0503[4:1] Reserved, write 0 保留
0x0502:0x0503.5 EEPROM emulation:
0: Normal operation (I²C interface used)
1: PDI emulates EEPROM (I²C not used)
0x0502:0x0503.6
Supported number of EEPROM read bytes: 支持读字节数
0: 4 Bytes :4个字节
1: 8 Bytes:8个字节
0x0502:0x0503.7
0x0502[7]:EEPROM_SIZE
Selected EEPROM Algorithm: EEPROM地址范围
0: 1 address byte (1KBit – 16KBit EEPROMs) :1个地址字节(1KB~16KB)
1: 2 address bytes (32KBit – 4 MBit EEPROMs):2个地址字节(32KB~4M)
0x0502:0x0503.8
读命令位: Read
读写操作时含义不同
当写时:0:无操作,1:开始读操作
当读时:0:无读操作,1:读操作进行中
0x0502:0x0503.9
写命令位: Write
读写操作时含义不同
当写时:0:无操作,1:开始写操作
当读时:0:无写操作,1:写操作进行中
0x0502:0x0503.10
重载命令位: Reload
读写操作时含义不同
当写时:0:无操作,1:开始重载操作
当读时:0:无重载操作,1:重载操作进行中
0x0502:0x0503.11
Checksum Error at in ESC Configuration Area: ESC配置区校验
0: Checksum ok :校验和正确
1: Checksum error :校验和错误
0x0502:0x0503.12
EEPROM loading status: 器件信息校验
0: EEPROM loaded, device information ok : 器件信息正确
1: EEPROM not loaded, device information not available : 从EEPROM装载器件信息错误
(EEPROM loading in progress or finished with a failure)
0x0502:0x0503.13
Error Acknowledge/Command: 命令应答
0: No error :无错误
1: Missing EEPROM acknowledge or invalid command EEPROM emulation only:
PDI writes 1 if a temporary failure has occurred. :EEPROM无应答,或命令无效
0x0502:0x0503.14
Error Write Enable: 写使能错误
0: No error:无错误
1: Write Command without Write enable:请求写命令时无写使能
0x0502:0x0503.15
Busy:忙位
0: EEPROM Interface is idle:EEPROM接口空闲
1: EEPROM Interface is busy:EEPROM接口忙
*/
wkc=/* 工作计数器 */
ecx_APRD(// 自增式物理读(APRD) Auto increment physical read
context->port,/* 端口(port) */
aiadr,/* 从站自增地址 */
ECT_REG_EEPSTAT, // EEPROM Control/Status EEP控制/EEP状态 EEPROM控制和状态寄存器[0x0502:0x0503]
sizeof(*estat),/* Reg0x0502:0x0503 EEPROM Control/Status */
estat, /* Reg0x0502:0x0503 EEPROM Control/Status */
EC_TIMEOUTRET);/* 发送帧(tx frame)返回到接收(rx)的超时时间[单位:us(微秒)]=2000 */
*estat = etohs(/* 大小端转换操作宏 uint16 */
*estat);/* Reg0x0502:0x0503 EEPROM Control/Status */
}
while (((wkc/* 工作计数器 */ <= 0)
|| ((*estat /* Reg0x0502:0x0503 EEPROM Control/Status */
& EC_ESTAT_BUSY) > 0)) /* EEprom 状态机忙位为busy */
&& (osal_timer_is_expired(/* 比较当前时间和定时器停止时间,判断定时器是否超时 */
&timer/* 定时器:记录时间精确到us(微秒) */) == FALSE)); /* wait for eeprom ready *//* 等待 EEPROM 准备就绪 */
if ((*estat/* Reg0x0502.15 */
& EC_ESTAT_BUSY) == 0)/* EEprom 状态机忙位为idle */
{
retval = 1;/* 返回值 1:Reg0x0502.15 EEprom 状态机忙位busy→idle */
}
return retval;/* 返回值 */
}