Etherlab原始碼解析----同步管理器SM配置(郵箱通訊)
阿新 • • 發佈:2019-01-27
主站和從站間的郵箱通訊通常使用SM0和SM1,IGH Etherlab在控制從站進入preop之前需要配置從站的SM0和SM1暫存器。
1、SM暫存器
SM0配置暫存器的起始地址為0x800,SM1配置暫存器的起始地址為0x808,每個通道使用8個位元組。
2、執行配置
Etherlab在掃描從站時,或者啟用master以後,都要控制從站從init切換到preop狀態,執行狀態切換之前將執行Fsm_slave_config.c中的ec_fsm_slave_config_enter_mbox_sync()函式,配置從站的SM0和SM1暫存器。
void ec_fsm_slave_config_enter_mbox_sync(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
......
EC_SLAVE_DBG (slave, 1, "Configuring mailbox sync managers...\n");
if (slave->requested_state == EC_SLAVE_STATE_BOOT) {
ec_sync_t sync;
......
} else if (slave->sii.sync_count >= 2) { // mailbox configuration provided
ec_datagram_fpwr(datagram, slave->station_address, 0x0800 ,
EC_SYNC_PAGE_SIZE * slave->sii.sync_count);
ec_datagram_zero(datagram);
for (i = 0; i < 2; i++) {
ec_sync_page(&slave->sii.syncs[i], i, //SM0和SM1的值全部來源於從站的EEPROM,在掃描從站時獲取。
slave->sii.syncs[i].default_length,
NULL , // use default sync manager configuration
0, // no PDO xfer
datagram->data + EC_SYNC_PAGE_SIZE * i);
}
slave->configured_rx_mailbox_offset =
slave->sii.syncs[0].physical_start_address;
slave->configured_rx_mailbox_size =
slave->sii.syncs[0].default_length;
slave->configured_tx_mailbox_offset =
slave->sii.syncs[1].physical_start_address;
slave->configured_tx_mailbox_size =
slave->sii.syncs[1].default_length;
} else { // no mailbox sync manager configurations provided
......
}
fsm->take_time = 1;
fsm->retries = EC_FSM_RETRIES;
fsm->state = ec_fsm_slave_config_state_mbox_sync;
}