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); |