主站和从站间的邮箱通信通常使用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;
}