SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。主要应用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、网络控制器、MCU、数字信号处理器(DSP)以及数字信号解码器之间。

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/spi.h"#define PIN_MISO 16
#define PIN_CS   17
#define PIN_SCK  18
#define PIN_MOSI 19#define SPI_PORT spi0
#define READ_BIT 0x80int32_t t_fine;uint16_t dig_T1;
int16_t dig_T2, dig_T3;
uint16_t dig_P1;
int16_t dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9;
uint8_t dig_H1, dig_H3;
int8_t dig_H6;
int16_t dig_H2, dig_H4, dig_H5;/* The following compensation functions are required to convert from the raw ADC
data from the chip to something usable. Each chip has a different set of
compensation parameters stored on the chip at point of manufacture, which are
read from the chip at startup and used inthese routines.
*/
int32_t compensate_temp(int32_t adc_T) {int32_t var1, var2, T;var1 = ((((adc_T >> 3) - ((int32_t) dig_T1 << 1))) * ((int32_t) dig_T2)) >> 11;var2 = (((((adc_T >> 4) - ((int32_t) dig_T1)) * ((adc_T >> 4) - ((int32_t) dig_T1))) >> 12) * ((int32_t) dig_T3))>> 14;t_fine = var1 + var2;T = (t_fine * 5 + 128) >> 8;return T;
}uint32_t compensate_pressure(int32_t adc_P) {int32_t var1, var2;uint32_t p;var1 = (((int32_t) t_fine) >> 1) - (int32_t) 64000;var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((int32_t) dig_P6);var2 = var2 + ((var1 * ((int32_t) dig_P5)) << 1);var2 = (var2 >> 2) + (((int32_t) dig_P4) << 16);var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((int32_t) dig_P2) * var1) >> 1)) >> 18;var1 = ((((32768 + var1)) * ((int32_t) dig_P1)) >> 15);if (var1 == 0)return 0;p = (((uint32_t) (((int32_t) 1048576) - adc_P) - (var2 >> 12))) * 3125;if (p < 0x80000000)p = (p << 1) / ((uint32_t) var1);elsep = (p / (uint32_t) var1) * 2;var1 = (((int32_t) dig_P9) * ((int32_t) (((p >> 3) * (p >> 3)) >> 13))) >> 12;var2 = (((int32_t) (p >> 2)) * ((int32_t) dig_P8)) >> 13;p = (uint32_t) ((int32_t) p + ((var1 + var2 + dig_P7) >> 4));return p;
}uint32_t compensate_humidity(int32_t adc_H) {int32_t v_x1_u32r;v_x1_u32r = (t_fine - ((int32_t) 76800));v_x1_u32r = (((((adc_H << 14) - (((int32_t) dig_H4) << 20) - (((int32_t) dig_H5) * v_x1_u32r)) +((int32_t) 16384)) >> 15) * (((((((v_x1_u32r * ((int32_t) dig_H6)) >> 10) * (((v_x1_u32r *((int32_t) dig_H3))>> 11) + ((int32_t) 32768))) >> 10) + ((int32_t) 2097152)) *((int32_t) dig_H2) + 8192) >> 14));v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t) dig_H1)) >> 4));v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);return (uint32_t) (v_x1_u32r >> 12);
}static inline void cs_select() {asm volatile("nop \n nop \n nop");gpio_put(PIN_CS, 0);  // Active lowasm volatile("nop \n nop \n nop");
}static inline void cs_deselect() {asm volatile("nop \n nop \n nop");gpio_put(PIN_CS, 1);asm volatile("nop \n nop \n nop");
}static void write_register(uint8_t reg, uint8_t data) {uint8_t buf[2];buf[0] = reg & 0x7f;  // remove read bit as this is a writebuf[1] = data;cs_select();spi_write_blocking(SPI_PORT, buf, 2);cs_deselect();sleep_ms(10);
}static void read_registers(uint8_t reg, uint8_t *buf, uint16_t len) {// For this particular device, we send the device the register we want to read// first, then subsequently read from the device. The register is auto incrementing// so we don't need to keep sending the register we want, just the first.reg |= READ_BIT;cs_select();spi_write_blocking(SPI_PORT, &reg, 1);sleep_ms(10);spi_read_blocking(SPI_PORT, 0, buf, len);cs_deselect();sleep_ms(10);
}/* This function reads the manufacturing assigned compensation parameters from the device */
void read_compensation_parameters() {uint8_t buffer[26];read_registers(0x88, buffer, 24);dig_T1 = buffer[0] | (buffer[1] << 8);dig_T2 = buffer[2] | (buffer[3] << 8);dig_T3 = buffer[4] | (buffer[5] << 8);dig_P1 = buffer[6] | (buffer[7] << 8);dig_P2 = buffer[8] | (buffer[9] << 8);dig_P3 = buffer[10] | (buffer[11] << 8);dig_P4 = buffer[12] | (buffer[13] << 8);dig_P5 = buffer[14] | (buffer[15] << 8);dig_P6 = buffer[16] | (buffer[17] << 8);dig_P7 = buffer[18] | (buffer[19] << 8);dig_P8 = buffer[20] | (buffer[21] << 8);dig_P9 = buffer[22] | (buffer[23] << 8);dig_H1 = buffer[25];read_registers(0xE1, buffer, 8);dig_H2 = buffer[0] | (buffer[1] << 8);dig_H3 = (int8_t) buffer[2];dig_H4 = buffer[3] << 4 | (buffer[4] & 0xf);dig_H5 = (buffer[5] >> 4) | (buffer[6] << 4);dig_H6 = (int8_t) buffer[7];
}static void bme280_read_raw(int32_t *humidity, int32_t *pressure, int32_t *temperature) {uint8_t buffer[8];read_registers(0xF7, buffer, 8);*pressure = ((uint32_t) buffer[0] << 12) | ((uint32_t) buffer[1] << 4) | (buffer[2] >> 4);*temperature = ((uint32_t) buffer[3] << 12) | ((uint32_t) buffer[4] << 4) | (buffer[5] >> 4);*humidity = (uint32_t) buffer[6] << 8 | buffer[7];
}int main() {stdio_init_all();printf("Hello, bme280! Reading raw data from registers via SPI...\n");// This example will use SPI0 at 0.5MHz.spi_init(SPI_PORT, 500 * 1000);gpio_set_function(PIN_MISO, GPIO_FUNC_SPI);gpio_set_function(PIN_SCK, GPIO_FUNC_SPI);gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);// Chip select is active-low, so we'll initialise it to a driven-high stategpio_init(PIN_CS);gpio_set_dir(PIN_CS, GPIO_OUT);gpio_put(PIN_CS, 1);// See if SPI is working - interrograte the device for its I2C ID number, should be 0x60uint8_t id;read_registers(0xD0, &id, 1);printf("Chip ID is 0x%x\n", id);read_compensation_parameters();write_register(0xF2, 0x1); // Humidity oversampling register - going for x1write_register(0xF4, 0x27);// Set rest of oversampling modes and run mode to normalint32_t humidity, pressure, temperature;while (1) {bme280_read_raw(&humidity, &pressure, &temperature);// These are the raw numbers from the chip, so we need to run through the// compensations to get human understandable numberspressure = compensate_pressure(pressure);temperature = compensate_temp(temperature);humidity = compensate_humidity(humidity);printf("Humidity = %.2f%%\n", humidity / 1024.0);printf("Pressure = %dPa\n", pressure);printf("Temp. = %.2fC\n", temperature / 100.0);sleep_ms(1000);}return 0;
}

me280温度压力传感器

[Raspberry Pi Pico] SPI相关推荐

  1. 树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元

    整理 | 郑丽媛 来源 | CSDN(ID:CSDNnews) 昨天,树莓派搞了个大动作:推出了首款微控制器开发板 Raspberry Pi Pico!该开发板基于树莓派开发的全新芯片--RP2040 ...

  2. RASPBERRY PI PICO 树莓派PICO开发板双核高性能低功耗RP2040芯片

    ▌01 RASPBERRY PICO 1.简介 RaspBerry Pi Pico是一款低价格.高性能的微控制器电路板,具有丰富灵活的数字接口,主要特点包括有: RP2040 microcontrol ...

  3. 树莓派竟出微控制器了!Raspberry Pi Pico 只需 4 美元!

    [CSDN 编者按]树莓派进军微控制器市场了!而这场改革的开始只需 4 美元? 整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 昨天,树莓派搞了个大动作:推出了首款微控制器开发板 Ra ...

  4. Raspberry——Pi Pico和Pico W对比

    简介:在2020年6月30日,Raspberry Pi发布了Pico W,这是一块搭载了英飞凌CYW43439模块的单片机开发板,支持IEEE 802.11 b/g/n无线LAN和蓝牙5.2. 1.整 ...

  5. 如何安装WIZnet库到Raspberry Pi PICO

    在您开始在Raspberry Pi PICO上使用WIZnet的以太网解决方案之前,在使用它之前需要几步的安装步骤. 连接WIZnet产品与Raspberry Pi PICO -如果您正在使用WIZn ...

  6. 物联网开发笔记(69)- 使用Micropython开发树莓派pico开发板raspberry pi pico之控制晶联JLX172104G-590液晶模块

    一.目的 这一节我们学习如何使用我们的树莓派pico开发板raspberry pi pico来控制晶联JLX172104G-590液晶模块. 二.环境 Win10 + 树莓派pico开发板raspbe ...

  7. 树莓派-Raspberry Pi Pico RP2040 使用大全(硬件接口功能、传感器模块等)

    树莓派-RP2040 主板实物图 主板引脚图 Thonny开发IDE工具 查看帮助信息 GPIO 输出 GPIO 输入 GPIO 中断 ADC(模数转换) PWM(脉宽调制) WDT看门狗 RTC实时 ...

  8. RASPBERRY PI PICO 开发板 基础测试

    ▌01 PI PICO 颜色名 十六进制颜色值 颜色 Coral #FF7F50 rgb(255, 127, 80) 1.安装与上载程序 在 RASPBERRY PI PICO 树莓派PICO开发板双 ...

  9. 在 Windows 中编程 Raspberry Pi Pico 的初学者指南

    在 Windows 中编程 Raspberry Pi Pico 的初学者指南 在本教程中,我们将了解如何在 Windows 系统中安装和设置用于编程 Raspberry Pi Pico 的 Visua ...

最新文章

  1. stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验
  2. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
  3. DuckHunter Attacks
  4. python和软件自动化_软件测试和自动化测试
  5. wince下的蓝牙串口通信
  6. [Java] Overrid 方法重写
  7. django 不用自带的mysql_21_django配置使用mysql数据库的两种方式
  8. linux tcp 监控,Zabbix 监控tcp连接的状态
  9. php上传虚假图片,解决PHP上传多个图片并校验的代码问题
  10. 一步一步使用标c编写跨平台图像处理库_让一个图像变成反向图像
  11. 开放 Rake 打包项目
  12. 两年前端历程回顾的思考与总结
  13. CheckBoxList 只能选2个选项
  14. md文件 markdown打开工具(typora)
  15. 电脑桌面云便签如何导入导出便签内容数据?
  16. 国内图像处理相关期刊
  17. Rosalind Java| Translating RNA into Protein
  18. 单层MoS2和WS2晶体/Zn(Ⅱ)-PDA诱导合成二维连续稳定ZIF-8膜/新型大孔的二维结晶聚酰亚胺COFs(PI-COFs)
  19. 吐血之作 | 流系统Spark/Flink/Kafka/DataFlow端到端一致性实现对比
  20. Adobe Photoshop Lightroom Classic 中文版

热门文章

  1. Pro SQL Server 2008 Mirroring
  2. 数据仓库系列文章一:浅谈数仓设计
  3. linux 桌面环境比较 (2013-10-25)
  4. AWD平台搭建及遇到的问题分析
  5. python 腾讯视频签到_Python处理腾讯视频
  6. excel VBA快递查询
  7. grread使用例子 lisp_Autolisp编程心得
  8. 50070无法访问的问题的排除
  9. linux 系统命令被后门修改_Linux、Windows权限维持常用后门学习总结
  10. python3基础系列之六【输入输出file方法】