Rahmen jetzt zustandslos.
This commit is contained in:
parent
324ce91d67
commit
59be77d01d
|
|
@ -59,7 +59,7 @@ int EtherCAT_rt_canopen_sdo_write(ec_slave_t *slave, /**< EtherCAT-Slave */
|
|||
ec_frame_init_npwr(&frame, master, slave->station_address,
|
||||
0x1800, 0xF6, data);
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) {
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Mailbox sending failed on slave %i!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -311,12 +311,7 @@ int EtherCAT_rt_domain_xio(ec_domain_t *domain /**< Dom
|
|||
}
|
||||
|
||||
if (unlikely(ec_frame_receive(frame) < 0)) {
|
||||
EC_ERR("Receive error!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(frame->state != ec_frame_received)) {
|
||||
EC_WARN("Process data command not received!\n");
|
||||
EC_ERR("Receiving process data failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
#define EC_FUNC_HEADER \
|
||||
frame->master = master; \
|
||||
frame->state = ec_frame_ready; \
|
||||
frame->index = 0; \
|
||||
frame->working_counter = 0;
|
||||
|
||||
|
|
@ -258,10 +257,6 @@ int ec_frame_send(ec_frame_t *frame /**< Rahmen zum Senden */)
|
|||
EC_DBG("ec_frame_send\n");
|
||||
}
|
||||
|
||||
if (unlikely(frame->state != ec_frame_ready)) {
|
||||
EC_WARN("Frame not in \"ready\" state!\n");
|
||||
}
|
||||
|
||||
command_size = frame->data_length + EC_COMMAND_HEADER_SIZE
|
||||
+ EC_COMMAND_FOOTER_SIZE;
|
||||
frame_size = command_size + EC_FRAME_HEADER_SIZE;
|
||||
|
|
@ -284,8 +279,6 @@ int ec_frame_send(ec_frame_t *frame /**< Rahmen zum Senden */)
|
|||
EC_DBG("Sending command index 0x%X\n", frame->index);
|
||||
}
|
||||
|
||||
frame->state = ec_frame_sent;
|
||||
|
||||
// Zeiger auf Socket-Buffer holen
|
||||
data = ec_device_prepare(&frame->master->device);
|
||||
|
||||
|
|
@ -336,11 +329,6 @@ int ec_frame_receive(ec_frame_t *frame /**< Gesendeter Rahmen */)
|
|||
uint8_t command_type, command_index;
|
||||
ec_device_t *device;
|
||||
|
||||
if (unlikely(frame->state != ec_frame_sent)) {
|
||||
EC_ERR("Frame was not sent!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
device = &frame->master->device;
|
||||
|
||||
if (!(received_length = ec_device_received(device))) return -1;
|
||||
|
|
@ -388,8 +376,6 @@ int ec_frame_receive(ec_frame_t *frame /**< Gesendeter Rahmen */)
|
|||
return -1;
|
||||
}
|
||||
|
||||
frame->state = ec_frame_received;
|
||||
|
||||
// Empfangene Daten in Kommandodatenspeicher kopieren
|
||||
memcpy(frame->data, data, data_length);
|
||||
data += data_length;
|
||||
|
|
|
|||
|
|
@ -16,23 +16,6 @@
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE - EC_FRAME_HEADER_SIZE \
|
||||
- EC_COMMAND_HEADER_SIZE \
|
||||
- EC_COMMAND_FOOTER_SIZE)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Status eines EtherCAT-Rahmens.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
ec_frame_ready, ec_frame_sent, ec_frame_received
|
||||
}
|
||||
ec_frame_state_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
EtherCAT-Rahmen-Typ
|
||||
*/
|
||||
|
|
@ -44,9 +27,9 @@ typedef enum
|
|||
ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */
|
||||
ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */
|
||||
ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */
|
||||
ec_frame_type_brd = 0x07, /**< Broadcast read */
|
||||
ec_frame_type_bwr = 0x08, /**< Broadcast write */
|
||||
ec_frame_type_lrw = 0x0C /**< Logical read/write */
|
||||
ec_frame_type_brd = 0x07, /**< Broadcast read */
|
||||
ec_frame_type_bwr = 0x08, /**< Broadcast write */
|
||||
ec_frame_type_lrw = 0x0C /**< Logical read/write */
|
||||
}
|
||||
ec_frame_type_t;
|
||||
|
||||
|
|
@ -90,7 +73,6 @@ typedef struct
|
|||
ec_address_t address; /**< Adresse des/der Empfänger */
|
||||
unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen
|
||||
Daten */
|
||||
ec_frame_state_t state; /**< Zustand des Kommandos */
|
||||
uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde
|
||||
(wird vom Master beim Senden gesetzt). */
|
||||
uint16_t working_counter; /**< Working-Counter */
|
||||
|
|
|
|||
|
|
@ -24,6 +24,11 @@
|
|||
#define EC_FMMU_SIZE 16 /**< Größe einer FMMU-Konfigurationsseite */
|
||||
#define EC_MAX_FMMUS 16 /**< Maximale Anzahl FMMUs pro Slave */
|
||||
|
||||
#define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE \
|
||||
- EC_FRAME_HEADER_SIZE \
|
||||
- EC_COMMAND_HEADER_SIZE \
|
||||
- EC_COMMAND_FOOTER_SIZE) /**< Maximale Datengröße */
|
||||
|
||||
#define EC_MASTER_MAX_DOMAINS 10 /**< Maximale Anzahl Domänen eines Masters */
|
||||
|
||||
#ifndef NULL
|
||||
|
|
|
|||
|
|
@ -164,24 +164,23 @@ int ec_scan_for_slaves(ec_master_t *master /**< EtherCAT-Master */)
|
|||
unsigned int i;
|
||||
unsigned char data[2];
|
||||
|
||||
if (master->slaves || master->slave_count)
|
||||
EC_WARN("Slave scan already done!\n");
|
||||
ec_master_clear_slaves(master);
|
||||
if (master->slaves || master->slave_count) {
|
||||
EC_ERR("Slave scan already done!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Determine number of slaves on bus
|
||||
|
||||
ec_frame_init_brd(&frame, master, 0x0000, 4);
|
||||
if (unlikely(ec_frame_send_receive(&frame) < 0)) return -1;
|
||||
|
||||
if (unlikely(ec_frame_send_receive(&frame))) return -1;
|
||||
master->slave_count = frame.working_counter;
|
||||
EC_INFO("Found %i slaves on bus.\n", master->slave_count);
|
||||
|
||||
if (!master->slave_count) return 0;
|
||||
|
||||
if (!(master->slaves = (ec_slave_t *) kmalloc(master->slave_count
|
||||
* sizeof(ec_slave_t),
|
||||
GFP_KERNEL))) {
|
||||
EC_ERR("Could not allocate memory for bus slaves!\n");
|
||||
* sizeof(ec_slave_t),
|
||||
GFP_KERNEL))) {
|
||||
EC_ERR("Could not allocate memory for slaves!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -204,7 +203,7 @@ 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)) {
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Writing station address failed on slave %i!\n", i);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -486,7 +485,7 @@ 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)) {
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Resetting FMMUs failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
|
|
@ -498,7 +497,7 @@ 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)) {
|
||||
if (unlikely(ec_frame_send_receive(&frame))) {
|
||||
EC_ERR("Resetting sync managers failed on slave %i!\n",
|
||||
slave->ring_position);
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Reference in New Issue