SPI应用 用SPI总线读取气压传感器SCP1000的数据

Posted myautomation

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPI应用 用SPI总线读取气压传感器SCP1000的数据相关的知识,希望对你有一定的参考价值。

Using SPI to read a Barometric Pressure Sensor

This example shows how to use the SPI (Serial Peripheral Interface) Communications Library to read data from a SCP1000 Barometric Pressure sensor. Please click here for more information on SPI.

 

Hardware Required  硬件准备

Arduino or Genuino board

SCP1000 Pressure Sensor Breakout Board

hook-up wires

 

Circuit 电路图

技术分享图片                       

image developed using Fritzing. For more circuit examples, see the Fritzing project page

 

Schematic 原理图

 技术分享图片

The SCP1000 barometric pressure sensor can read both air presure and temperature and report them via the SPI connection. For details of the control registers, see the SCP1000 data sheet.

 SCP1000传感器可测量气压和温度,并通过SPI总线与控制器连接

 

Code 程序代码

The code below starts out by setting the SCP1000‘s configuration registers in the setup(). In the main loop, it sets the sensor to read in high resolution mode, meaning that it will return a 19-bit value, for the pressure reading, and 16 bits for the temperature. The actual reading in degrees Celsius is the 16-bit result divided by 20.

使用时首先用setup()SCP1000的配置寄存器进行设置。测量结果包含19位的气压值,16位的温度值。摄氏度等于16位数据除以20。

Then it reads the temperature‘s two bytes. Once it‘s got the temperature, it reads the pressure in two parts. First it reads the highest three bits, then the lower 16 bits. It combines these two into one single long integer by bit shifting the high bits then using a bitwise OR to combine them with the lower 16 bits. The actual pressure in Pascal is the 19-bit result divide by 4.

读取压力值时,先读高3位,再读低16位,然后通过移位组成19位的整数。帕斯卡数等于19位数据除以4。

  1 /*
  2  SCP1000 Barometric Pressure Sensor Display
  3 
  4  Shows the output of a Barometric Pressure Sensor on a
  5  Uses the SPI library. For details on the sensor, see:
  6  http://www.sparkfun.com/commerce/product_info.php?products_id=8161
  7  http://www.vti.fi/en/support/obsolete_products/pressure_sensors/
  8 
  9  This sketch adapted from Nathan Seidle‘s SCP1000 example for PIC:
 10  http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip
 11 
 12  Circuit:  SCP1000与控制板的接线
 13  SCP1000 sensor attached to pins 6, 7, 10 - 13:
 14  DRDY: pin 6   dataReadyPin
 15  CSB: pin 7     chipSelectPin
 16  MOSI: pin 11
 17  MISO: pin 12
 18  SCK: pin 13
 19 
 20  created 31 July 2010
 21  modified 14 August 2010
 22  by Tom Igoe
 23  */
 24 // the sensor communicates using SPI, so include the library:
 25 #include <SPI.h>
 26 
 27 //Sensor‘s memory register addresses:
 28 
 29 const int PRESSURE = 0x1F;      //3 most significant bits of pressure
 30 const int PRESSURE_LSB = 0x20;  //16 least significant bits of pressure
 31 const int TEMPERATURE = 0x21;   //16 bit temperature reading
 32 const byte READ = 0b11111100;     // SCP1000‘s read command  SCP1000的读指令
 33 const byte WRITE = 0b00000010;   // SCP1000‘s write command  SCP1000的写指令
 34 
 35 // pins used for the connection with the sensor
 36 // the other you need are controlled by the SPI library):
 37 const int dataReadyPin = 6;
 38 const int chipSelectPin = 7;
 39 void setup() 
 40 
 41 {
 42   Serial.begin(9600);
 43   // start the SPI library:
 44   SPI.begin();
 45 
 46   // initalize the  data ready and chip select pins:
 47   pinMode(dataReadyPin, INPUT);   //数据准备信号来自传感器
 48   pinMode(chipSelectPin, OUTPUT);   //芯片选择信号来自控制器
 49 
 50   //Configure SCP1000 for low noise configuration:
 51   writeRegister(0x02, 0x2D);
 52   writeRegister(0x01, 0x03);
 53   writeRegister(0x03, 0x02);
 54   // give the sensor time to set up:
 55   delay(100);
 56 }
 57 
 58 
 59 void loop()
 60 
 61  {
 62   //Select High Resolution Mode  
 63   writeRegister(0x03, 0x0A);
 64 
 65   // don‘t do anything until the data ready pin is high:
 66   if (digitalRead(dataReadyPin) == HIGH) 
 67 
 68 {
 69     //Read the temperature data
 70     int tempData = readRegister(0x21, 2);  //2个字节
 71     // convert the temperature to celsius and display it:
 72     float realTemp = (float)tempData / 20.0;   //转换为摄氏温度
 73     Serial.print("Temp[C]=");
 74     Serial.print(realTemp);
 75 
 76 
 77     //Read the pressure data highest 3 bits:
 78     byte  pressure_data_high = readRegister(0x1F, 1);
 79     pressure_data_high &= 0b00000111;    //you only needs bits 2 to 0
 80 
 81     //Read the pressure data lower 16 bits:
 82     unsigned int  pressure_data_low = readRegister(0x20, 2);
 83     //combine the two parts into one 19-bit number:  并转换为帕斯卡
 84     long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4;
 85     // display the temperature:
 86     Serial.println("	Pressure [Pa]=" + String(pressure));
 87   }
 88 }
 89 
 90 //Read from or write to register from the SCP1000:
 91 unsigned int  readRegister(byte thisRegister, int bytesToRead)   //读SCP1000的寄存器
 92 
 93 {
 94   byte inByte = 0;           // incoming byte from the SPI
 95   unsigned int result = 0;   // result to return
 96   Serial.print(thisRegister, BIN);
 97   Serial.print("	");
 98   // SCP1000 expects the register name in the upper 6 bits
 99   // of the byte. So shift the bits left by two bits:
100   thisRegister = thisRegister << 2;
101   // now combine the address and the command into one byte
102   byte dataToSend = thisRegister & READ;   //  READ是读指令0b11111100
103   Serial.println(thisRegister, BIN);
104   // take the chip select low to select the device:
105   digitalWrite(chipSelectPin, LOW);
106   // send the device the register you want to read:
107   SPI.transfer(dataToSend);    //传送寄存器地址
108   // send a value of 0 to read the first byte returned:
109   result = SPI.transfer(0x00);   //传送0x00以得到第1个字节的数据
110   // decrement the number of bytes left to read:
111   bytesToRead--;
112   // if you still have another byte to read:
113   if (bytesToRead > 0) 
114 
115 {
116     // shift the first byte left, then get the second byte:
117     result = result << 8;
118     inByte = SPI.transfer(0x00);
119     // combine the byte you just got with the previous one:
120     result = result | inByte;
121     // decrement the number of bytes left to read:
122     bytesToRead--;
123   }
124   // take the chip select high to de-select:
125   digitalWrite(chipSelectPin, HIGH);
126   // return the result:
127   return (result);
128 }
129 
130 //Sends a write command to SCP1000
131 void writeRegister(byte thisRegister, byte thisValue)    //写SCP1000的寄存器
132 
133 {
134   // SCP1000 expects the register address in the upper 6 bits
135   // of the byte. So shift the bits left by two bits:
136   thisRegister = thisRegister << 2;
137   // now combine the register address and the command into one byte:
138   byte dataToSend = thisRegister | WRITE;  // WRITE是写指令0b00000010
139   // take the chip select low to select the device:
140   digitalWrite(chipSelectPin, LOW);
141   SPI.transfer(dataToSend);    //Send register location
142   SPI.transfer(thisValue);       //Send value to record into register
143   // take the chip select high to de-select:
144   digitalWrite(chipSelectPin, HIGH);
145 }
146 
147  

 

以上是关于SPI应用 用SPI总线读取气压传感器SCP1000的数据的主要内容,如果未能解决你的问题,请参考以下文章

Linux SPI总线 - 概述

Linux SPI总线和设备驱动架构之一:系统概述

STM32F407的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)

BMP280 driver对接单片机I2C或者SPI总线接口

stm32-SPI读取串行FLASH

SPI总线协议