Thanks for all the input from everyone.
I think I've solved the problem now. I turned off the spanning tree protocol on all the ports and have had no problems since. This isn't the same option as SPT fast start. Obviously SPT is there to check for loops, but we haven't got any reduntant links so we should be ok so long as a student doesn't bend a network cable out of one datapoint to another.