Hi,
I'm trying to read data from a Honeywell RSC pressure sensor. I've got the bare bones done below (there are calibrations etc. that need to be read and integrated still) but I'm finding it necessary to put delays in between SPI.transfers to get any values, and it then seems to matter a lot what exactly those delays are. It also doesn't get any values the first time it runs the loop after the setup section. There doesn't seem to be any timings for the SPI communication in the datasheet though.
Can anyone give me a bit of help please?
Many thanks
This is the pressure reading part:
void loop() {
///////////////////////////////////////////////////////////////////////////////////////////////
//Read Pressure
digitalWrite(CSADC, LOW);
//delay(100);
SPI.transfer(68); //write to register 1
delay(10);
SPI.transfer(4); //pressure mode
delay(10);
SPI.transfer(0x08); //start conversion
//delay(10);
int p1 = SPI.transfer(0);
//delay(10);
int p2 = SPI.transfer(0);
//delay(100);
int p3 = SPI.transfer(0);
digitalWrite(CSADC, HIGH);
long p4 = p1 * 65536 + p2 * 256 + p3;
float RSCpress = 20*(-1.0+p4/8388608.0);
Serial.print("p1 = "); Serial.println(p1);
Serial.print("p2 = "); Serial.println(p2);
Serial.print("p3 = "); Serial.println(p3);
Serial.print("p4 = "); Serial.println(p4);
Serial.print("RSCpress = "); Serial.println(RSCpress, 10);
Serial.println("");
//digitalWrite(CSADC, HIGH);
///////////////////////////////////////////////////////////////////////////////////////////////
delay(1000);
//4. Command the ADC to take a temperature reading, and store this reading.
//5. Give Delay (Example: if sample rate is 330SPS delay for 3.03 ms [1/330 s]).
//6. Command the ADC to take a pressure reading, and store this reading.
//7. Apply the compensation formulae to the temperature and pressure readings in order to calculate a pressure value.
//8. Repeat steps 4, 5 and 6 in a loop to take additional readings.
}
This is the full code (what I've done of it so far - there should be enough so far to get pressure readings, just not compensated ones though):
#include <SPI.h>
int DRDY = 4;
int CSEE = 6;
int CSADC = 8;
void setup() {
pinMode (CSEE, OUTPUT);
digitalWrite(CSEE, HIGH);
pinMode (CSADC, OUTPUT);
digitalWrite(CSADC, HIGH);
pinMode (DRDY, INPUT_PULLUP);
//digitalWrite(DRDY, HIGH);
//set data rate for serial monitor
Serial.begin(115200);
// initialize SPI:
//CS_EE and CS_ADC must never be simultaneously low.
//EEPROM operates in SPI mode 0 where CPOL = 0 and CPHA = 0 (0,0) and mode 3 where CPOL = 1 and CPHA = 1 (1,1).
SPI.begin();
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE0));
///////////////////////////////////////////////////////////////////////////////////////////////
//1. Read the ADC settings and the compensation values from EEPROM.
digitalWrite(CSEE, LOW);
//prange
SPI.transfer16(795);
float prange;
union u_tag {
byte b[4];
float fval;
} u;
u.b[0] = SPI.transfer(0);
u.b[1] = SPI.transfer(0);
u.b[2] = SPI.transfer(0);
u.b[3] = SPI.transfer(0);
prange = u.fval;
Serial.print("prange = "); Serial.println(prange, 10);
//pminimum
float pminimum;
union v_tag {
byte b[4];
float fval;
} v;
v.b[0] = SPI.transfer(0);
v.b[1] = SPI.transfer(0);
v.b[2] = SPI.transfer(0);
v.b[3] = SPI.transfer(0);
pminimum = v.fval;
Serial.print("pminimum = "); Serial.println(pminimum, 10);
//punits
byte pu1 = SPI.transfer(0);
byte pu2 = SPI.transfer(0);
byte pu3 = SPI.transfer(0);
byte pu4 = SPI.transfer(0);
byte pu5 = SPI.transfer(0);
char punits[] = {pu1, pu2, pu3, pu4, pu5};
Serial.print("punits = "); Serial.println(punits);
//pref
char pref = SPI.transfer(0);
digitalWrite(CSEE, HIGH);
digitalWrite(CSEE, LOW);
//ADC config
SPI.transfer16(829);
unsigned int ADCconfig1 = SPI.transfer(0); //start reading byte 61 (ADC config settings)
SPI.transfer(0);
unsigned int ADCconfig2 = SPI.transfer(0);
SPI.transfer(0);
unsigned int ADCconfig3 = SPI.transfer(0);
SPI.transfer(0);
unsigned int ADCconfig4 = SPI.transfer(0);
digitalWrite(CSEE, HIGH);
//POLYNOMIAL COEFFICIENTS - 130 to 145
SPI.transfer16(898); //start reading byte 130 (Polynomial Coefficients)
//Span coefficients 210 to 225
//Shape coefficients 290 to 305
///////////////////////////////////////////////////////////////////////////////////////////////
//2. Initialize the ADC converter using the settings provided in EEPROM.
//The ADC interface operates in SPI mode 1 where CPOL = 0 and CPHA = 1.
//To program a configuration register, the host sends a WREG command [0100 RRNN], where ‘RR’ is the register number and ‘NN’ is the number of bytes to be written –1.
//config reg 1 should be 4 for pressure sensing, or 6 for temperature sensing
SPI.endTransaction();
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE1));
SPI.begin();
digitalWrite(CSEE, HIGH);
digitalWrite(CSADC, LOW);
SPI.transfer(6); //reset ADC
SPI.transfer(67); //write 4 bytes starting at reg 0
SPI.transfer(ADCconfig1);
SPI.transfer(ADCconfig2);
SPI.transfer(ADCconfig3);
SPI.transfer(ADCconfig4);
digitalWrite(CSADC, HIGH);
///////////////////////////////////////////////////////////////////////////////////////////////
//Read Temperature
digitalWrite(CSADC, LOW);
//delay(100);
SPI.transfer(68); //write to register 1
delay(100);
SPI.transfer(6); //temperature mode
delay(100);
SPI.transfer(0x08); //start conversion
//delay(100);
int t1 = SPI.transfer(0);
//delay(100);
int t2 = SPI.transfer(0);
delay(100);
int t3 = SPI.transfer(0);
digitalWrite(CSADC, HIGH);
int t4 = t1 * 256 + t2;
int t5 = t4 >> 2;
float RSCtemp = t5 * 0.03125;
Serial.print("t1 = "); Serial.println(t1);
Serial.print("t2 = "); Serial.println(t2);
Serial.print("t4 = "); Serial.println(t4);
Serial.print("t5 = "); Serial.println(t5);
Serial.print("RSCtemp = "); Serial.println(RSCtemp);
//digitalWrite(CSADC, HIGH);
///////////////////////////////////////////////////////////////////////////////////////////////
delay (200);
//3. Adjust the ADC sample rate if desired.
}
void loop() {
///////////////////////////////////////////////////////////////////////////////////////////////
//Read Pressure
digitalWrite(CSADC, LOW);
//delay(100);
SPI.transfer(68); //write to register 1
delay(10);
SPI.transfer(4); //pressure mode
delay(10);
SPI.transfer(0x08); //start conversion
//delay(10);
int p1 = SPI.transfer(0);
//delay(10);
int p2 = SPI.transfer(0);
//delay(100);
int p3 = SPI.transfer(0);
digitalWrite(CSADC, HIGH);
long p4 = p1 * 65536 + p2 * 256 + p3;
float RSCpress = 20*(-1.0+p4/8388608.0);
Serial.print("p1 = "); Serial.println(p1);
Serial.print("p2 = "); Serial.println(p2);
Serial.print("p3 = "); Serial.println(p3);
Serial.print("p4 = "); Serial.println(p4);
Serial.print("RSCpress = "); Serial.println(RSCpress, 10);
Serial.println("");
//digitalWrite(CSADC, HIGH);
///////////////////////////////////////////////////////////////////////////////////////////////
delay(1000);
//4. Command the ADC to take a temperature reading, and store this reading.
//5. Give Delay (Example: if sample rate is 330SPS delay for 3.03 ms [1/330 s]).
//6. Command the ADC to take a pressure reading, and store this reading.
//7. Apply the compensation formulae to the temperature and pressure readings in order to calculate a pressure value.
//8. Repeat steps 4, 5 and 6 in a loop to take additional readings.
}