1. 程式人生 > >Etherlab原始碼解析----同步管理器SM配置(郵箱通訊)

Etherlab原始碼解析----同步管理器SM配置(郵箱通訊)

主站和從站間的郵箱通訊通常使用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, //SM0SM1的值全部來源於從站的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; }

3、配置例項

這裡寫圖片描述