equal
deleted
inserted
replaced
103 */ |
103 */ |
104 |
104 |
105 void ec_fsm_sii_write(ec_fsm_sii_t *fsm, /**< finite state machine */ |
105 void ec_fsm_sii_write(ec_fsm_sii_t *fsm, /**< finite state machine */ |
106 ec_slave_t *slave, /**< slave to read from */ |
106 ec_slave_t *slave, /**< slave to read from */ |
107 uint16_t offset, /**< offset to read from */ |
107 uint16_t offset, /**< offset to read from */ |
108 uint16_t *value, /**< pointer to 2 bytes of data */ |
108 const uint16_t *value, /**< pointer to 2 bytes of data */ |
109 ec_fsm_sii_addressing_t mode /**< addressing scheme */ |
109 ec_fsm_sii_addressing_t mode /**< addressing scheme */ |
110 ) |
110 ) |
111 { |
111 { |
112 fsm->state = ec_fsm_sii_start_writing; |
112 fsm->state = ec_fsm_sii_start_writing; |
113 fsm->slave = slave; |
113 fsm->slave = slave; |
166 } |
166 } |
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); |
|
172 fsm->retries = EC_FSM_RETRIES; |
171 fsm->retries = EC_FSM_RETRIES; |
173 fsm->state = ec_fsm_sii_read_check; |
172 fsm->state = ec_fsm_sii_read_check; |
174 } |
173 } |
175 |
174 |
176 /*****************************************************************************/ |
175 /*****************************************************************************/ |
182 |
181 |
183 void ec_fsm_sii_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
182 void ec_fsm_sii_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
184 { |
183 { |
185 ec_datagram_t *datagram = fsm->datagram; |
184 ec_datagram_t *datagram = fsm->datagram; |
186 |
185 |
187 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
186 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
188 ec_master_queue_datagram(fsm->slave->master, datagram); |
187 return; |
189 return; |
|
190 } |
|
191 |
188 |
192 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
189 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
193 fsm->state = ec_fsm_sii_error; |
190 fsm->state = ec_fsm_sii_error; |
194 EC_ERR("Failed to receive SII read datagram from slave %i.\n", |
191 EC_ERR("Failed to receive SII read datagram from slave %i" |
195 fsm->slave->ring_position); |
192 " (datagram state %i).\n", |
|
193 fsm->slave->ring_position, datagram->state); |
196 return; |
194 return; |
197 } |
195 } |
198 |
196 |
199 if (datagram->working_counter != 1) { |
197 if (datagram->working_counter != 1) { |
200 fsm->state = ec_fsm_sii_error; |
198 fsm->state = ec_fsm_sii_error; |
213 break; |
211 break; |
214 case EC_FSM_SII_NODE: |
212 case EC_FSM_SII_NODE: |
215 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
213 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
216 break; |
214 break; |
217 } |
215 } |
218 ec_master_queue_datagram(fsm->slave->master, datagram); |
216 |
219 fsm->retries = EC_FSM_RETRIES; |
217 fsm->retries = EC_FSM_RETRIES; |
220 fsm->state = ec_fsm_sii_read_fetch; |
218 fsm->state = ec_fsm_sii_read_fetch; |
221 } |
219 } |
222 |
220 |
223 /*****************************************************************************/ |
221 /*****************************************************************************/ |
229 |
227 |
230 void ec_fsm_sii_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) |
228 void ec_fsm_sii_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) |
231 { |
229 { |
232 ec_datagram_t *datagram = fsm->datagram; |
230 ec_datagram_t *datagram = fsm->datagram; |
233 |
231 |
234 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
232 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
235 ec_master_queue_datagram(fsm->slave->master, datagram); |
233 return; |
236 return; |
|
237 } |
|
238 |
234 |
239 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
235 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
240 fsm->state = ec_fsm_sii_error; |
236 fsm->state = ec_fsm_sii_error; |
241 EC_ERR("Failed to receive SII check/fetch datagram from slave %i.\n", |
237 EC_ERR("Failed to receive SII check/fetch datagram from slave %i" |
242 fsm->slave->ring_position); |
238 " (datagram state %i).\n", |
|
239 fsm->slave->ring_position, datagram->state); |
243 return; |
240 return; |
244 } |
241 } |
245 |
242 |
246 if (datagram->working_counter != 1) { |
243 if (datagram->working_counter != 1) { |
247 fsm->state = ec_fsm_sii_error; |
244 fsm->state = ec_fsm_sii_error; |
277 break; |
274 break; |
278 case EC_FSM_SII_NODE: |
275 case EC_FSM_SII_NODE: |
279 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
276 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 10); |
280 break; |
277 break; |
281 } |
278 } |
282 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
283 fsm->retries = EC_FSM_RETRIES; |
279 fsm->retries = EC_FSM_RETRIES; |
284 return; |
280 return; |
285 } |
281 } |
286 |
282 |
287 #if 0 |
283 #if 0 |
312 ec_datagram_npwr(datagram, fsm->slave->station_address, 0x502, 8); |
308 ec_datagram_npwr(datagram, fsm->slave->station_address, 0x502, 8); |
313 EC_WRITE_U8 (datagram->data, 0x01); // enable write access |
309 EC_WRITE_U8 (datagram->data, 0x01); // enable write access |
314 EC_WRITE_U8 (datagram->data + 1, 0x02); // request write operation |
310 EC_WRITE_U8 (datagram->data + 1, 0x02); // request write operation |
315 EC_WRITE_U32(datagram->data + 2, fsm->offset); |
311 EC_WRITE_U32(datagram->data + 2, fsm->offset); |
316 memcpy(datagram->data + 6, fsm->value, 2); |
312 memcpy(datagram->data + 6, fsm->value, 2); |
317 ec_master_queue_datagram(fsm->slave->master, datagram); |
313 |
318 fsm->retries = EC_FSM_RETRIES; |
314 fsm->retries = EC_FSM_RETRIES; |
319 fsm->state = ec_fsm_sii_write_check; |
315 fsm->state = ec_fsm_sii_write_check; |
320 } |
316 } |
321 |
317 |
322 /*****************************************************************************/ |
318 /*****************************************************************************/ |
327 |
323 |
328 void ec_fsm_sii_write_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
324 void ec_fsm_sii_write_check(ec_fsm_sii_t *fsm /**< finite state machine */) |
329 { |
325 { |
330 ec_datagram_t *datagram = fsm->datagram; |
326 ec_datagram_t *datagram = fsm->datagram; |
331 |
327 |
332 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
328 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
333 ec_master_queue_datagram(fsm->slave->master, datagram); |
329 return; |
334 return; |
|
335 } |
|
336 |
330 |
337 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
331 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
338 fsm->state = ec_fsm_sii_error; |
332 fsm->state = ec_fsm_sii_error; |
339 EC_ERR("Failed to receive SII write datagram for slave %i.\n", |
333 EC_ERR("Failed to receive SII write datagram for slave %i" |
340 fsm->slave->ring_position); |
334 " (datagram state %i).\n", |
|
335 fsm->slave->ring_position, datagram->state); |
341 return; |
336 return; |
342 } |
337 } |
343 |
338 |
344 if (datagram->working_counter != 1) { |
339 if (datagram->working_counter != 1) { |
345 fsm->state = ec_fsm_sii_error; |
340 fsm->state = ec_fsm_sii_error; |
351 fsm->cycles_start = datagram->cycles_sent; |
346 fsm->cycles_start = datagram->cycles_sent; |
352 fsm->check_once_more = 1; |
347 fsm->check_once_more = 1; |
353 |
348 |
354 // issue check/fetch datagram |
349 // issue check/fetch datagram |
355 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 2); |
350 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x502, 2); |
356 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
357 fsm->retries = EC_FSM_RETRIES; |
351 fsm->retries = EC_FSM_RETRIES; |
358 fsm->state = ec_fsm_sii_write_check2; |
352 fsm->state = ec_fsm_sii_write_check2; |
359 } |
353 } |
360 |
354 |
361 /*****************************************************************************/ |
355 /*****************************************************************************/ |
366 |
360 |
367 void ec_fsm_sii_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */) |
361 void ec_fsm_sii_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */) |
368 { |
362 { |
369 ec_datagram_t *datagram = fsm->datagram; |
363 ec_datagram_t *datagram = fsm->datagram; |
370 |
364 |
371 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
365 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
372 ec_master_queue_datagram(fsm->slave->master, datagram); |
366 return; |
373 return; |
|
374 } |
|
375 |
367 |
376 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
368 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
377 fsm->state = ec_fsm_sii_error; |
369 fsm->state = ec_fsm_sii_error; |
378 EC_ERR("Failed to receive SII write check datagram from slave %i.\n", |
370 EC_ERR("Failed to receive SII write check datagram from slave %i" |
379 fsm->slave->ring_position); |
371 " (datagram state %i).\n", |
|
372 fsm->slave->ring_position, datagram->state); |
380 return; |
373 return; |
381 } |
374 } |
382 |
375 |
383 if (datagram->working_counter != 1) { |
376 if (datagram->working_counter != 1) { |
384 fsm->state = ec_fsm_sii_error; |
377 fsm->state = ec_fsm_sii_error; |
398 } |
391 } |
399 fsm->check_once_more = 0; |
392 fsm->check_once_more = 0; |
400 } |
393 } |
401 |
394 |
402 // issue check/fetch datagram again |
395 // issue check/fetch datagram again |
403 ec_master_queue_datagram(fsm->slave->master, datagram); |
|
404 fsm->retries = EC_FSM_RETRIES; |
396 fsm->retries = EC_FSM_RETRIES; |
405 return; |
397 return; |
406 } |
398 } |
407 |
399 |
408 if (EC_READ_U8(datagram->data + 1) & 0x40) { |
400 if (EC_READ_U8(datagram->data + 1) & 0x40) { |