master/slave.c
changeset 142 e933f1adb550
parent 140 b09658e50d6f
child 144 fdc24bf62f80
equal deleted inserted replaced
141:5f76a36cd9b4 142:e933f1adb550
    33 
    33 
    34 void ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
    34 void ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
    35                    ec_master_t *master /**< EtherCAT-Master */
    35                    ec_master_t *master /**< EtherCAT-Master */
    36                    )
    36                    )
    37 {
    37 {
       
    38     unsigned int i;
       
    39 
    38     slave->master = master;
    40     slave->master = master;
    39     slave->base_type = 0;
    41     slave->base_type = 0;
    40     slave->base_revision = 0;
    42     slave->base_revision = 0;
    41     slave->base_build = 0;
    43     slave->base_build = 0;
    42     slave->base_fmmu_count = 0;
    44     slave->base_fmmu_count = 0;
    43     slave->base_sync_count = 0;
    45     slave->base_sync_count = 0;
       
    46     for (i = 0; i < 2; i++) {
       
    47         slave->dl_status_link[i] = 0;
       
    48         slave->dl_status_loop[i] = 0;
       
    49         slave->dl_status_comm[i] = 0;
       
    50     }
    44     slave->ring_position = 0;
    51     slave->ring_position = 0;
    45     slave->station_address = 0;
    52     slave->station_address = 0;
    46     slave->sii_alias = 0;
    53     slave->sii_alias = 0;
    47     slave->sii_vendor_id = 0;
    54     slave->sii_vendor_id = 0;
    48     slave->sii_product_code = 0;
    55     slave->sii_product_code = 0;
   133 */
   140 */
   134 
   141 
   135 int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT-Slave */)
   142 int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT-Slave */)
   136 {
   143 {
   137     ec_command_t command;
   144     ec_command_t command;
       
   145     unsigned int i;
       
   146     uint16_t dl_status;
   138 
   147 
   139     // Read base data
   148     // Read base data
   140     ec_command_init_nprd(&command, slave->station_address, 0x0000, 6);
   149     ec_command_init_nprd(&command, slave->station_address, 0x0000, 6);
   141     if (unlikely(ec_master_simple_io(slave->master, &command))) {
   150     if (unlikely(ec_master_simple_io(slave->master, &command))) {
   142         EC_ERR("Reading base datafrom slave %i failed!\n",
   151         EC_ERR("Reading base data from slave %i failed!\n",
   143                slave->ring_position);
   152                slave->ring_position);
   144         return -1;
   153         return -1;
   145     }
   154     }
   146 
   155 
   147     slave->base_type =       EC_READ_U8 (command.data);
   156     slave->base_type =       EC_READ_U8 (command.data);
   151     slave->base_sync_count = EC_READ_U8 (command.data + 5);
   160     slave->base_sync_count = EC_READ_U8 (command.data + 5);
   152 
   161 
   153     if (slave->base_fmmu_count > EC_MAX_FMMUS)
   162     if (slave->base_fmmu_count > EC_MAX_FMMUS)
   154         slave->base_fmmu_count = EC_MAX_FMMUS;
   163         slave->base_fmmu_count = EC_MAX_FMMUS;
   155 
   164 
       
   165     // Read DL status
       
   166     ec_command_init_nprd(&command, slave->station_address, 0x0110, 2);
       
   167     if (unlikely(ec_master_simple_io(slave->master, &command))) {
       
   168         EC_ERR("Reading DL status from slave %i failed!\n",
       
   169                slave->ring_position);
       
   170         return -1;
       
   171     }
       
   172 
       
   173     dl_status = EC_READ_U16(command.data);
       
   174     for (i = 0; i < 2; i++) {
       
   175         slave->dl_status_link[i] = dl_status & (1 << (4 + i)) ? 1 : 0;
       
   176         slave->dl_status_loop[i] = dl_status & (1 << (8 + i * 2)) ? 1 : 0;
       
   177         slave->dl_status_comm[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
       
   178     }
       
   179 
       
   180     // Read EEPROM data
   156     if (ec_slave_sii_read16(slave, 0x0004, &slave->sii_alias))
   181     if (ec_slave_sii_read16(slave, 0x0004, &slave->sii_alias))
   157         return -1;
   182         return -1;
   158     if (ec_slave_sii_read32(slave, 0x0008, &slave->sii_vendor_id))
   183     if (ec_slave_sii_read32(slave, 0x0008, &slave->sii_vendor_id))
   159         return -1;
   184         return -1;
   160     if (ec_slave_sii_read32(slave, 0x000A, &slave->sii_product_code))
   185     if (ec_slave_sii_read32(slave, 0x000A, &slave->sii_product_code))
   867     ec_eeprom_sync_t *sync;
   892     ec_eeprom_sync_t *sync;
   868     ec_eeprom_pdo_t *pdo;
   893     ec_eeprom_pdo_t *pdo;
   869     ec_eeprom_pdo_entry_t *pdo_entry;
   894     ec_eeprom_pdo_entry_t *pdo_entry;
   870     ec_sdo_t *sdo;
   895     ec_sdo_t *sdo;
   871     ec_sdo_entry_t *sdo_entry;
   896     ec_sdo_entry_t *sdo_entry;
   872     int first;
   897     int first, i;
   873 
   898 
   874     EC_INFO("x-- EtherCAT slave information ---------------\n");
   899     EC_INFO("x-- EtherCAT slave information ---------------\n");
   875 
   900 
   876     if (slave->type) {
   901     if (slave->type) {
   877         EC_INFO("| Vendor \"%s\", Product \"%s\": %s\n",
   902         EC_INFO("| Vendor \"%s\", Product \"%s\": %s\n",
   885     EC_INFO("| Ring position: %i, Station address: 0x%04X\n",
   910     EC_INFO("| Ring position: %i, Station address: 0x%04X\n",
   886             slave->ring_position, slave->station_address);
   911             slave->ring_position, slave->station_address);
   887 
   912 
   888     if (verbosity > 0) // Etwas geschwätziger
   913     if (verbosity > 0) // Etwas geschwätziger
   889     {
   914     {
       
   915         EC_INFO("| Data link status:\n");
       
   916         for (i = 0; i < 2; i++) {
       
   917             EC_INFO("|   Port %i: link %s, loop %s, %s\n", i,
       
   918                     slave->dl_status_link[i] ? "up" : "down",
       
   919                     slave->dl_status_loop[i] ? "closed" : "open",
       
   920                     slave->dl_status_comm[i] ? "comm. establ." : "no comm.");
       
   921         }
       
   922 
   890         EC_INFO("| Base information:\n");
   923         EC_INFO("| Base information:\n");
   891         EC_INFO("|   Type %u, Revision %i, Build %i\n",
   924         EC_INFO("|   Type %u, Revision %i, Build %i\n",
   892                 slave->base_type, slave->base_revision, slave->base_build);
   925                 slave->base_type, slave->base_revision, slave->base_build);
   893         EC_INFO("|   Supported FMMUs: %i, Sync managers: %i\n",
   926         EC_INFO("|   Supported FMMUs: %i, Sync managers: %i\n",
   894                 slave->base_fmmu_count, slave->base_sync_count);
   927                 slave->base_fmmu_count, slave->base_sync_count);