diff --git a/NEWS b/NEWS index c61e0edc23d0f160837886e6f364fe4c6d82f8c2..b8b4fb67c1bb579b4355f7f009a2b308883cca1b 100644 --- a/NEWS +++ b/NEWS @@ -45,6 +45,8 @@ Changes since 1.4.0: methods to let an application transfer SDOs before activating the master (thanks to Stefan Weiser). * Fixed SDO upload segment response (thanks to Christoph Peter). +* Fixed SDO upload segment response for 10 bytes mailbox length (thanks to + Joerg Mohre). * SDO entry access rights are shown in 'ethercat sdos'. * Added 64-bit data access macros to application header. * Added debug level for all masters as a module parameter. Thanks to Erwin diff --git a/master/fsm_coe.c b/master/fsm_coe.c index 366c41c1de950a8383586d8e17438237e3e23a65..0f925e0539766bad2a052e6553255a415eee2d57 100644 --- a/master/fsm_coe.c +++ b/master/fsm_coe.c @@ -1821,7 +1821,6 @@ void ec_fsm_coe_up_seg_response(ec_fsm_coe_t *fsm /**< finite state machine */) uint8_t *data, mbox_prot; size_t rec_size, data_size; ec_sdo_request_t *request = fsm->request; - uint32_t seg_size; unsigned int last_segment; if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) @@ -1899,14 +1898,11 @@ void ec_fsm_coe_up_seg_response(ec_fsm_coe_t *fsm /**< finite state machine */) return; } - last_segment = EC_READ_U8(data + 2) & 0x01; - seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; - if (rec_size > 10) { - data_size = rec_size - 3; /* Header of segment upload is smaller than - normal upload */ - } else { // == 10 - /* seg_size contains the number of trailing bytes to ignore. */ - data_size = rec_size - seg_size; + data_size = rec_size - 3; /* Header of segment upload is smaller than + normal upload */ + if (rec_size == 10) { + uint8_t seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; + data_size -= seg_size; } if (request->data_size + data_size > fsm->complete_size) { @@ -1920,6 +1916,7 @@ void ec_fsm_coe_up_seg_response(ec_fsm_coe_t *fsm /**< finite state machine */) memcpy(request->data + request->data_size, data + 3, data_size); request->data_size += data_size; + last_segment = EC_READ_U8(data + 2) & 0x01; if (!last_segment) { fsm->toggle = !fsm->toggle; ec_fsm_coe_up_prepare_segment_request(fsm);