I had some code set up for the DS3234 (SPI) which interrupts every minute and it works fine. I then switched to using the DS3231 (I2C) and had set up the interrupt the same way but couldn't get it to work. I was clearing the control status register (to clear the interrupt flag) in the interrupt routine and that works for SPI. But you can't do that with I2C, presumably because the I2C library uses interrupts?
Anyway, the way to get around it is that for the I2C DS3231, the interrupt routine should set a flag and then a piece of code in the loop() function clears the CSR if that flag is set - the same method could be used for SPI too.
Here's a code snippet to illustrate what I did for the I2C version:
#define LED_PIN 13
volatile short outbit = 0;
volatile unsigned char interrupted = 0;
// Toggle the LED pin for debugging
outbit ^= 1;
// Notify the loop() function that an alarm interrupt has occurred
interrupted = 1;
// Clear the interrupt status flag for the alarms
// so that they can interrupt again
// Write a zero to the Control Status Register
interrupted = 0;