主站狀態機在檢測到從站個數發生變化時,會進行對從站的重新掃描,在此期間,主站需要提起從站中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中的所有信息。