Wiederholtes Senden, wenn keine Antwort.

This commit is contained in:
Florian Pose 2006-02-28 09:09:08 +00:00
parent d1010330d4
commit 324ce91d67
4 changed files with 101 additions and 136 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;
}