Wiederholtes Senden, wenn keine Antwort.
This commit is contained in:
parent
d1010330d4
commit
324ce91d67
|
|
@ -56,14 +56,11 @@ int EtherCAT_rt_canopen_sdo_write(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
value >>= 8;
|
||||
}
|
||||
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address, 0x1800, 0xF6,
|
||||
data);
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address,
|
||||
0x1800, 0xF6, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox send - Slave %i did not respond!\n",
|
||||
slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox sending failed on slave %i!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -74,10 +71,8 @@ int EtherCAT_rt_canopen_sdo_write(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
{
|
||||
ec_frame_init_nprd(&frame, master, slave->station_address, 0x808, 8);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox check - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox checking failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -97,10 +92,8 @@ int EtherCAT_rt_canopen_sdo_write(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
|
||||
ec_frame_init_nprd(&frame, master, slave->station_address, 0x18F6, 0xF6);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox receive - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox receiving failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -149,14 +142,11 @@ int EtherCAT_rt_canopen_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
EC_WRITE_U16(data + 9, sdo_index);
|
||||
EC_WRITE_U8 (data + 11, sdo_subindex);
|
||||
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address, 0x1800, 0xF6,
|
||||
data);
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address,
|
||||
0x1800, 0xF6, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox send - Slave %i did not respond!\n",
|
||||
slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox sending failed on slave %i!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -167,10 +157,8 @@ int EtherCAT_rt_canopen_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
{
|
||||
ec_frame_init_nprd(&frame, master, slave->station_address, 0x808, 8);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox check - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox checking failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -190,10 +178,8 @@ int EtherCAT_rt_canopen_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
|
||||
ec_frame_init_nprd(&frame, master, slave->station_address, 0x18F6, 0xF6);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Mailbox receive - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Mailbox receiving failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -405,6 +405,12 @@ int ec_frame_receive(ec_frame_t *frame /**< Gesendeter Rahmen */)
|
|||
/**
|
||||
Sendet einen einzeln Rahmen und wartet auf dessen Empfang.
|
||||
|
||||
Wenn der Working-Counter nicht gesetzt wurde, wird der Rahmen
|
||||
nochmals gesendet.
|
||||
|
||||
\todo Das ist noch nicht schön, da hier zwei Protokollschichten
|
||||
vermischt werden.
|
||||
|
||||
\return 0 bei Erfolg, sonst < 0
|
||||
*/
|
||||
|
||||
|
|
@ -412,32 +418,49 @@ int ec_frame_send_receive(ec_frame_t *frame
|
|||
/**< Rahmen zum Senden/Empfangen */
|
||||
)
|
||||
{
|
||||
unsigned int tries_left;
|
||||
unsigned int timeout_tries_left, response_tries_left;
|
||||
unsigned int tries;
|
||||
|
||||
if (unlikely(ec_frame_send(frame) < 0)) {
|
||||
EC_ERR("Frame sending failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
tries_left = 20;
|
||||
tries = 0;
|
||||
response_tries_left = 10;
|
||||
do
|
||||
{
|
||||
udelay(1);
|
||||
ec_device_call_isr(&frame->master->device);
|
||||
tries_left--;
|
||||
}
|
||||
while (unlikely(!ec_device_received(&frame->master->device)
|
||||
&& tries_left));
|
||||
tries++;
|
||||
if (unlikely(ec_frame_send(frame) < 0)) {
|
||||
EC_ERR("Frame sending failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(!tries_left)) {
|
||||
EC_ERR("Frame timeout!\n");
|
||||
timeout_tries_left = 20;
|
||||
do
|
||||
{
|
||||
udelay(1);
|
||||
ec_device_call_isr(&frame->master->device);
|
||||
timeout_tries_left--;
|
||||
}
|
||||
while (unlikely(!ec_device_received(&frame->master->device)
|
||||
&& timeout_tries_left));
|
||||
|
||||
if (unlikely(!timeout_tries_left)) {
|
||||
EC_ERR("Frame timeout!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(ec_frame_receive(frame) < 0)) {
|
||||
EC_ERR("Frame receiving failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
response_tries_left--;
|
||||
}
|
||||
while (unlikely(!frame->working_counter && response_tries_left));
|
||||
|
||||
if (unlikely(!response_tries_left)) {
|
||||
EC_ERR("No response!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(ec_frame_receive(frame) < 0)) {
|
||||
EC_ERR("Frame receiving failed!\n");
|
||||
return -1;
|
||||
}
|
||||
if (tries > 1) EC_WARN("%i tries necessary...\n", tries);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,11 +204,8 @@ int ec_scan_for_slaves(ec_master_t *master /**< EtherCAT-Master */)
|
|||
ec_frame_init_apwr(&frame, master, slave->ring_position, 0x0010,
|
||||
sizeof(uint16_t), data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Slave %i did not repond while writing station address!\n",
|
||||
i);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Writing station address failed on slave %i!\n", i);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -489,9 +486,8 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
|
|||
memset(data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address, 0x0600,
|
||||
EC_FMMU_SIZE * slave->base_fmmu_count, data);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Resetting FMMUs - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Resetting FMMUs failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -502,9 +498,8 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
|
|||
memset(data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
|
||||
ec_frame_init_npwr(&frame, master, slave->station_address, 0x0800,
|
||||
EC_SYNC_SIZE * slave->base_sync_count, data);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Resetting SMs - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
EC_ERR("Resetting sync managers failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -519,10 +514,8 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
|
|||
ec_frame_init_npwr(&frame, master, slave->station_address,
|
||||
0x0800 + j * EC_SYNC_SIZE, EC_SYNC_SIZE, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Setting sync manager %i - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Setting sync manager %i failed on slave %i!\n",
|
||||
j, slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -548,11 +541,9 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
|
|||
ec_frame_init_npwr(&frame, master, slave->station_address,
|
||||
0x0600 + j * EC_FMMU_SIZE, EC_FMMU_SIZE, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Setting FMMU %i - Slave %i did not respond!\n", j,
|
||||
slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Setting FMMU %i failed on slave %i!\n",
|
||||
j, slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,10 +68,8 @@ int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT-Slave */)
|
|||
ec_frame_init_nprd(&frame, slave->master, slave->station_address,
|
||||
0x0000, 6);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Slave %i did not respond while reading base data!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Reading base datafrom slave %i failed!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -141,13 +139,11 @@ int ec_slave_sii_read(ec_slave_t *slave,
|
|||
EC_WRITE_U16(data + 2, offset);
|
||||
EC_WRITE_U16(data + 4, 0x0000);
|
||||
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address, 0x502, 6,
|
||||
data);
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address,
|
||||
0x502, 6, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("SII-read - Slave %i did not respond!\n", slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("SII-read failed on slave %i!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -160,13 +156,11 @@ int ec_slave_sii_read(ec_slave_t *slave,
|
|||
{
|
||||
udelay(10);
|
||||
|
||||
ec_frame_init_nprd(&frame, slave->master, slave->station_address, 0x502,
|
||||
10);
|
||||
ec_frame_init_nprd(&frame, slave->master, slave->station_address,
|
||||
0x502, 10);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("SII-read status - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Getting SII-read status failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -207,17 +201,12 @@ void ec_slave_state_ack(ec_slave_t *slave,
|
|||
|
||||
EC_WRITE_U16(data, state | EC_ACK);
|
||||
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address, 0x0120,
|
||||
2, data);
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address,
|
||||
0x0120, 2, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) != 0)) {
|
||||
EC_WARN("Could no acknowledge state %02X - Unable to send!\n", state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_WARN("Could not acknowledge state %02X - Slave %i did not"
|
||||
" respond!\n", state, slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_WARN("State %02X acknowledge failed on slave %i!\n",
|
||||
state, slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -229,15 +218,9 @@ void ec_slave_state_ack(ec_slave_t *slave,
|
|||
ec_frame_init_nprd(&frame, slave->master, slave->station_address,
|
||||
0x0130, 2);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) != 0)) {
|
||||
EC_WARN("Could not check state acknowledgement %02X - Unable to"
|
||||
" send!\n", state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_WARN("Could not check state acknowledgement %02X - Slave %i did"
|
||||
" not respond!\n", state, slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_WARN("State %02X acknowledge checking failed on slave %i!\n",
|
||||
state, slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -284,17 +267,12 @@ int ec_slave_state_change(ec_slave_t *slave,
|
|||
|
||||
EC_WRITE_U16(data, state);
|
||||
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address, 0x0120,
|
||||
2, data);
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address,
|
||||
0x0120, 2, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) != 0)) {
|
||||
EC_ERR("Could not set state %02X - Unable to send!\n", state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Could not set state %02X - Slave %i did not respond!\n", state,
|
||||
slave->ring_position);
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Failed to set state %02X on slave %i!\n",
|
||||
state, slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -306,13 +284,8 @@ int ec_slave_state_change(ec_slave_t *slave,
|
|||
ec_frame_init_nprd(&frame, slave->master, slave->station_address,
|
||||
0x0130, 2);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) != 0)) {
|
||||
EC_ERR("Could not check state %02X - Unable to send!\n", state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_ERR("Could not check state %02X - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Failed to check state %02X on slave %i!\n",
|
||||
state, slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -431,17 +404,11 @@ int ec_slave_check_crc(ec_slave_t *slave /**< EtherCAT-Slave */)
|
|||
ec_frame_t frame;
|
||||
uint8_t data[4];
|
||||
|
||||
ec_frame_init_nprd(&frame, slave->master, slave->station_address, 0x0300,
|
||||
4);
|
||||
ec_frame_init_nprd(&frame, slave->master, slave->station_address,
|
||||
0x0300, 4);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_WARN("Reading CRC fault counters failed on slave %i - Could not"
|
||||
" send command!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_WARN("Reading CRC fault counters - Slave %i did not respond!\n",
|
||||
EC_WARN("Reading CRC fault counters failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -455,13 +422,11 @@ int ec_slave_check_crc(ec_slave_t *slave /**< EtherCAT-Slave */)
|
|||
// Reset CRC counters
|
||||
EC_WRITE_U16(data, 0x0000);
|
||||
EC_WRITE_U16(data + 2, 0x0000);
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address, 0x0300,
|
||||
4, data);
|
||||
ec_frame_init_npwr(&frame, slave->master, slave->station_address,
|
||||
0x0300, 4, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
|
||||
if (unlikely(frame.working_counter != 1)) {
|
||||
EC_WARN("Resetting CRC fault counters - Slave %i did not respond!\n",
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_WARN("Resetting CRC fault counters failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue