I wrote an Arduino (328P) sketch that puts the RTC in square wave output mode, and reads the BSY bit repeatedly and has D8 follow the state of that bit. The square wave goes low at the beginning of a second. So a two-channel scope shows the relationship of D8 to the square wave, and will show where in the second the conversion occurs. Guess what I found. My RTC, clearly marked DS3231SN, is in fact a DS3231M, which does its conversion every second. So there's no need for me to trigger a conversion for this chip at all. If I ever get a real SN part, I can run the code on it and see what happens. Or if someone has one, they're welcome to run it too. By the way, the other way you know you have an M is that it only does a 1Hz square wave. You can do whatever you want with the RS1 and RS2 bits, but you still only get 1Hz on an M.
/*
This sketch sets D8 high while the DS3231 BSY bit is high. It can
be used to detect whether a chip marked DS3231SN is in fact a
DS3231M. The SN will take D8 high once every 64 seconds, whereas
the M will take it high once per second if powered by Vcc, or once
every 10 seconds if running on the coin cell.
In addition, there is an option to attempt to increase the square wave
output from 1Hz to 1KHz by adjusting the RS1 bit. The SN will make
that change, but the M will stay at 1Hz.
At 1Hz, a two-channel scope can be used to see the relationship of the
BSY period to the beginning of a second (the square wave goes low at the
beginning of each second).
*/
#include <Wire.h>
byte BSY;
byte Control, Status; // RTC registers
void setup() {
pinMode(8,OUTPUT);
Wire.begin();
delay(2000);
Wire.beginTransmission(0x68); // read Control and Status registers
Wire.write(0x0E); // and clear alarm enables and flags
Wire.endTransmission();
Wire.requestFrom(0x68, 2);
// Clear /EOSC, RS2, RS1, A2E, A1E. Set BBSQW, INTCN. (SQW freq = 1Hz)
Control = (Wire.read() & 0b01100100) | 0b01000100;
// Clear /EOSC, RS2, A2E, A1E. Set BBSQW, RS1, INTCN. (SQW freq = 1KHz)
// Control = (Wire.read() & 0b01101100) | 0b01001100;
// Clear OSF, EN32k, A2F, A1F
Status = Wire.read() & 0b01110100;
updateReg(0x0E); // update Control
updateReg(0x0F); // update Status
Control &= 0b11111011; // enable squarewave 1Hz or 1KHz
updateReg(0x0E);
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x0F);
Wire.endTransmission();
Wire.requestFrom(0x68, 1);
BSY = Wire.read() & 4;
if (BSY) digitalWrite (8,HIGH);
else digitalWrite (8,LOW);
}
void updateReg(byte addr) {
Wire.beginTransmission(0x68);
Wire.write(addr);
if(addr == 0x0E) Wire.write(Control); // enable alarm1
else if(addr == 0x0F) Wire.write(Status); // clear alarm flags
Wire.endTransmission();
}