There could be many reasons why: bad cable, hard coded on one end and auto on the other, or bad port on either device.
Check the interface configuration on both sides. If you only have access to one side, and it's set to auto, try changing to whatever it's negotiating at while changing the duplex. (If it's negotiated at 100/half, try hard coding at 100/full.) If your side is hard coded, try changing to auto to help the other side negotiate properly. If neither of those work, try a different cable.