主站状态机在检测到从站个数发生变化时,会进行对从站的重新扫描,在此期间,主站需要提起从站中EEPROM中的SII信息,获取SII信息整体需要两个步骤:
1.确认从站SII信息的大小;
2.将SII信息进行提取;
主站对于从站的EEPROM是无法直接获取内容的,因此需要使用寄存器间接的将EEPROM信息进行提取,如下:
0x502~0x503 对SII读写的一些配置
0x504~0x507 对EEPROM地址的寻址
0x508~0x50B 对应EEPROM地址的设置值或获取值
这样的话,只要设置好对应的参数,就可以获取设置EEPROM中数据,也就是提取SII信息操作的基础。
struct ec_fsm_sii
{
ec_slave_t *slave; /**< slave the FSM runs on */
ec_datagram_t *datagram; /**< datagram used in the state machine */
unsigned int retries; /**< retries upon datagram timeout */
void (*state)(ec_fsm_sii_t *); /**< SII state function */
uint16_t word_offset; /**< input: word offset in SII */
ec_fsm_sii_addressing_t mode; /**< reading via APRD or NPRD */
uint8_t value[4]; /**< raw SII value (32bit) */
unsigned long jiffies_start; /**< Start timestamp. */
uint8_t check_once_more; /**< one more try after timeout */
};
以上的SII状态机就是./master/fsm_sii.h/sc_fsm_sii结构;
那么,对于SII信息,他的结构中前4Byte中,前两个Byte存放的是类别类型信息和制造商特定位,后两个Byte存放的是该目录项的数据大小,因此基于数据大小信息可以不断获取下一个SII信息的目录项,直到找到0xFFFF,也就意味着SII信息的结束,然后还是基于SII状态机获取SII中的所有信息。