167 |
167 |
168 EC_WRITE_U8 (datagram->data, 0x00); // read-only access |
168 EC_WRITE_U8 (datagram->data, 0x00); // read-only access |
169 EC_WRITE_U8 (datagram->data + 1, 0x01); // request read operation |
169 EC_WRITE_U8 (datagram->data + 1, 0x01); // request read operation |
170 EC_WRITE_U16(datagram->data + 2, fsm->offset); |
170 EC_WRITE_U16(datagram->data + 2, fsm->offset); |
171 ec_master_queue_datagram(fsm->slave->master, datagram); |
171 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
172 fsm->retries = EC_FSM_RETRIES; |
172 fsm->state = ec_fsm_sii_read_check; |
173 fsm->state = ec_fsm_sii_read_check; |
173 } |
174 } |
174 |
175 |
175 /*****************************************************************************/ |
176 /*****************************************************************************/ |
176 |
177 |
181 |
182 |
182 void ec_fsm_sii_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
183 void ec_fsm_sii_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
183 { |
184 { |
184 ec_datagram_t *datagram = fsm->datagram; |
185 ec_datagram_t *datagram = fsm->datagram; |
185 |
186 |
186 if (datagram->state != EC_DATAGRAM_RECEIVED |
187 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
187 || datagram->working_counter != 1) { |
188 ec_master_queue_datagram(fsm->slave->master, datagram); |
188 EC_ERR("SII: Reception of read datagram failed.\n"); |
189 return; |
189 fsm->state = ec_fsm_sii_error; |
190 } |
|
191 |
|
192 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
193 fsm->state = ec_fsm_sii_error; |
|
194 EC_ERR("Failed to receive SII read datagram from slave %i.\n", |
|
195 fsm->slave->ring_position); |
|
196 return; |
|
197 } |
|
198 |
|
199 if (datagram->working_counter != 1) { |
|
200 fsm->state = ec_fsm_sii_error; |
|
201 EC_ERR("Reception of SII read datagram failed - slave %i did not" |
|
202 " respond.\n", fsm->slave->ring_position); |
190 return; |
203 return; |
191 } |
204 } |
192 |
205 |
193 fsm->cycles_start = datagram->cycles_sent; |
206 fsm->cycles_start = datagram->cycles_sent; |
194 fsm->check_once_more = 1; |
207 fsm->check_once_more = 1; |
201 case EC_FSM_SII_NODE: |
214 case EC_FSM_SII_NODE: |
202 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
215 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
203 break; |
216 break; |
204 } |
217 } |
205 ec_master_queue_datagram(fsm->slave->master, datagram); |
218 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
219 fsm->retries = EC_FSM_RETRIES; |
206 fsm->state = ec_fsm_sii_read_fetch; |
220 fsm->state = ec_fsm_sii_read_fetch; |
207 } |
221 } |
208 |
222 |
209 /*****************************************************************************/ |
223 /*****************************************************************************/ |
210 |
224 |
215 |
229 |
216 void ec_fsm_sii_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) |
230 void ec_fsm_sii_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) |
217 { |
231 { |
218 ec_datagram_t *datagram = fsm->datagram; |
232 ec_datagram_t *datagram = fsm->datagram; |
219 |
233 |
220 if (datagram->state != EC_DATAGRAM_RECEIVED |
234 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
221 || datagram->working_counter != 1) { |
235 ec_master_queue_datagram(fsm->slave->master, datagram); |
222 EC_ERR("SII: Reception of check/fetch datagram failed.\n"); |
236 return; |
223 fsm->state = ec_fsm_sii_error; |
237 } |
|
238 |
|
239 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
240 fsm->state = ec_fsm_sii_error; |
|
241 EC_ERR("Failed to receive SII check/fetch datagram from slave %i.\n", |
|
242 fsm->slave->ring_position); |
|
243 return; |
|
244 } |
|
245 |
|
246 if (datagram->working_counter != 1) { |
|
247 fsm->state = ec_fsm_sii_error; |
|
248 EC_ERR("Reception of SII check/fetch datagram failed - slave %i did" |
|
249 " not respond\n", fsm->slave->ring_position); |
224 return; |
250 return; |
225 } |
251 } |
226 |
252 |
227 // check "busy bit" |
253 // check "busy bit" |
228 if (EC_READ_U8(datagram->data + 1) & 0x81) { |
254 if (EC_READ_U8(datagram->data + 1) & 0x81) { |
252 case EC_FSM_SII_NODE: |
278 case EC_FSM_SII_NODE: |
253 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
279 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
254 break; |
280 break; |
255 } |
281 } |
256 ec_master_queue_datagram(fsm->slave->master, datagram); |
282 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
283 fsm->retries = EC_FSM_RETRIES; |
257 return; |
284 return; |
258 } |
285 } |
259 |
286 |
260 #if 0 |
287 #if 0 |
261 EC_DBG("SII rec: %02X %02X %02X %02X - %02X %02X %02X %02X\n", |
288 EC_DBG("SII rec: %02X %02X %02X %02X - %02X %02X %02X %02X\n", |
286 EC_WRITE_U8 (datagram->data, 0x01); // enable write access |
313 EC_WRITE_U8 (datagram->data, 0x01); // enable write access |
287 EC_WRITE_U8 (datagram->data + 1, 0x02); // request write operation |
314 EC_WRITE_U8 (datagram->data + 1, 0x02); // request write operation |
288 EC_WRITE_U32(datagram->data + 2, fsm->offset); |
315 EC_WRITE_U32(datagram->data + 2, fsm->offset); |
289 memcpy(datagram->data + 6, fsm->value, 2); |
316 memcpy(datagram->data + 6, fsm->value, 2); |
290 ec_master_queue_datagram(fsm->slave->master, datagram); |
317 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
318 fsm->retries = EC_FSM_RETRIES; |
291 fsm->state = ec_fsm_sii_write_check; |
319 fsm->state = ec_fsm_sii_write_check; |
292 } |
320 } |
293 |
321 |
294 /*****************************************************************************/ |
322 /*****************************************************************************/ |
295 |
323 |
299 |
327 |
300 void ec_fsm_sii_write_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
328 void ec_fsm_sii_write_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
301 { |
329 { |
302 ec_datagram_t *datagram = fsm->datagram; |
330 ec_datagram_t *datagram = fsm->datagram; |
303 |
331 |
304 if (datagram->state != EC_DATAGRAM_RECEIVED |
332 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
305 || datagram->working_counter != 1) { |
333 ec_master_queue_datagram(fsm->slave->master, datagram); |
306 EC_ERR("SII: Reception of write datagram failed.\n"); |
334 return; |
307 fsm->state = ec_fsm_sii_error; |
335 } |
|
336 |
|
337 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
338 fsm->state = ec_fsm_sii_error; |
|
339 EC_ERR("Failed to receive SII write datagram for slave %i.\n", |
|
340 fsm->slave->ring_position); |
|
341 return; |
|
342 } |
|
343 |
|
344 if (datagram->working_counter != 1) { |
|
345 fsm->state = ec_fsm_sii_error; |
|
346 EC_ERR("Reception of SII write datagram failed - slave %i did not" |
|
347 " respond.\n", fsm->slave->ring_position); |
308 return; |
348 return; |
309 } |
349 } |
310 |
350 |
311 fsm->cycles_start = datagram->cycles_sent; |
351 fsm->cycles_start = datagram->cycles_sent; |
312 fsm->check_once_more = 1; |
352 fsm->check_once_more = 1; |
313 |
353 |
314 // issue check/fetch datagram |
354 // issue check/fetch datagram |
315 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 2); |
355 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 2); |
316 ec_master_queue_datagram(fsm->slave->master, datagram); |
356 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
357 fsm->retries = EC_FSM_RETRIES; |
317 fsm->state = ec_fsm_sii_write_check2; |
358 fsm->state = ec_fsm_sii_write_check2; |
318 } |
359 } |
319 |
360 |
320 /*****************************************************************************/ |
361 /*****************************************************************************/ |
321 |
362 |
325 |
366 |
326 void ec_fsm_sii_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */) |
367 void ec_fsm_sii_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */) |
327 { |
368 { |
328 ec_datagram_t *datagram = fsm->datagram; |
369 ec_datagram_t *datagram = fsm->datagram; |
329 |
370 |
330 if (datagram->state != EC_DATAGRAM_RECEIVED |
371 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
331 || datagram->working_counter != 1) { |
372 ec_master_queue_datagram(fsm->slave->master, datagram); |
332 EC_ERR("SII: Reception of write check datagram failed.\n"); |
373 return; |
333 fsm->state = ec_fsm_sii_error; |
374 } |
|
375 |
|
376 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
377 fsm->state = ec_fsm_sii_error; |
|
378 EC_ERR("Failed to receive SII write check datagram from slave %i.\n", |
|
379 fsm->slave->ring_position); |
|
380 return; |
|
381 } |
|
382 |
|
383 if (datagram->working_counter != 1) { |
|
384 fsm->state = ec_fsm_sii_error; |
|
385 EC_ERR("Reception of SII write check datagram failed - slave %i did" |
|
386 " not respond.\n", fsm->slave->ring_position); |
334 return; |
387 return; |
335 } |
388 } |
336 |
389 |
337 if (EC_READ_U8(datagram->data + 1) & 0x82) { |
390 if (EC_READ_U8(datagram->data + 1) & 0x82) { |
338 // still busy... timeout? |
391 // still busy... timeout? |
346 fsm->check_once_more = 0; |
399 fsm->check_once_more = 0; |
347 } |
400 } |
348 |
401 |
349 // issue check/fetch datagram again |
402 // issue check/fetch datagram again |
350 ec_master_queue_datagram(fsm->slave->master, datagram); |
403 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
404 fsm->retries = EC_FSM_RETRIES; |
351 return; |
405 return; |
352 } |
406 } |
353 |
407 |
354 if (EC_READ_U8(datagram->data + 1) & 0x40) { |
408 if (EC_READ_U8(datagram->data + 1) & 0x40) { |
355 EC_ERR("SII: Write operation failed!\n"); |
409 EC_ERR("SII: Write operation failed!\n"); |