CRC errors are generated when the data sent to the target (or host) is not received properly. The data is transmitted in blocks. At the end of each block, a CRC is appended that is sort of a checksum of the data in that block. The target(or host) checks the data received, generates a pseudo CRC and compares the two. If it doesn't match, the data in the blocks is corrupted.
This could be caused by defective cables, cables that are too long, cables running parallel to each other, high speed unshielded cables from a HDD running next to cables going to the ODD, cables routed too close to an electrically noisy card or power supply, etc. Anything that affects the data transfer, including drivers or other peripherals.