master/fsm_sii.c
changeset 505 bc443ca0077f
parent 435 779a18d12e6c
child 594 07dd2a7df66e
equal deleted inserted replaced
504:63d11bdfe3df 505:bc443ca0077f
   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");