On the BT900 I am using a ADC Vref of 3.3V but my ADC range doesn't go higher than 28xx. Shouldn't the range be 0 - 4095 since it is a 12-bit ADC?

By default the BT900 ADC output is scaled to mimic the BL600 in order to ensure that the same raw value is returned when reading the same input voltage; the BL600 has a 10-bit ADC and uses a 1.2V Vref. This behavior is controlled by configuration register (at+cfg) 2301. The default setting for this register is 0. To realize the full 12-bit resolution, referenced to the externally applied AVCC, configuration register 2301 needs to be == 2. On the BT900 issue the following command in Interactive Mode: AT+CFG 2301 2 Or use the following function in your smart BASIC script: NvCfgKeySet(2301,2)