diff -r 9f4ea66d89a3 -r 9bf603942791 master/slave.c --- a/master/slave.c Thu Feb 23 09:58:50 2006 +0000 +++ b/master/slave.c Thu Feb 23 13:38:54 2006 +0000 @@ -432,6 +432,61 @@ /*****************************************************************************/ +/** + Gibt die Zählerstände der CRC-Fault-Counter aus und setzt diese zurück. + + \return 0 bei Erfolg, sonst < 0 +*/ + +int ec_slave_check_crc(ec_slave_t *slave /**< EtherCAT-Slave */) +{ + ec_frame_t frame; + uint8_t data[4]; + uint16_t crc[2]; + + ec_frame_init_nprd(&frame, slave->master, slave->station_address, 0x0300, + 4); + + if (unlikely(ec_frame_send_receive(&frame))) { + printk(KERN_WARNING "EtherCAT: Reading CRC fault counters failed" + " on slave %i - Could not send command!\n", + slave->ring_position); + return -1; + } + + if (unlikely(frame.working_counter != 1)) { + printk(KERN_WARNING "EtherCAT: Reading CRC fault counters -" + " Slave %i did not respond!\n", slave->ring_position); + return -1; + } + + crc[0] = frame.data[0] | (frame.data[1] << 8); + crc[1] = frame.data[2] | (frame.data[3] << 8); + + // No CRC faults. + if (!crc[0] && !crc[1]) return 0; + + printk(KERN_INFO "EtherCAT: CRC faults on slave %i. A: %i, B: %i\n", + slave->ring_position, crc[0], crc[1]); + + // Reset CRC counters + memset(data, 0x00, 4); + ec_frame_init_npwr(&frame, slave->master, slave->station_address, 0x0300, + 4, data); + + if (unlikely(ec_frame_send_receive(&frame))) return -1; + + if (unlikely(frame.working_counter != 1)) { + printk(KERN_ERR "EtherCAT: Resetting CRC fault counters - Slave" + " %i did not respond!\n", slave->ring_position); + return -1; + } + + return 0; +} + +/*****************************************************************************/ + /* Emacs-Konfiguration ;;; Local Variables: *** ;;; c-basic-offset:4 ***