STM32duino & SPI

Подсоедините датчик к отладочной плате по следующей схеме:

VCC             5V
GND             GND
SCL(SCK)        PA5
SDA(MOSI)       PA7
CSB(CS)         PA4
SDO(MISO)       PA6

Теперь откроем тестовый скетч:

  • Нажмите «Файл», затем «Примеры > Adafruit BMP280 Library > bmp280test».

Чтобы выбрать интерфейс SPI и настроить использование правильных ножек микроконтроллера, найдите следующие строки:

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

и приведите их к виду:

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   PA4

//Adafruit_BMP280 bmp; // I2C
Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

Обратите внимание - мы передаем библиотеке BMP280 только имя ножки PA4, с которой связан сигнал ChipSelect. Все остальные сигналы - MOSI, MISO, SCK - по умолчанию связаны с ножками аппаратного блока SPI ( об этом говорит комментарий « // hardware SPI » ). В случае Arduino Uno это ножки D11, D12, D13 соответственно, в случае VB32F4V50 - это PA7, PA6, PA5, которые связаны с периферийным блоком SPI1. Использование аппаратного SPI практически всегда предпочтительно, поскольку освобождает ядро микроконтроллера от необходимости «вручную» выводить на ножки необходимые сигналы, экономя большУю часть процессорного времени.

Мы готовы загружать скетч! Нажмите кнопку «загрузить», дождитесь окончания компиляции и загрузки, откройте Монитор порта. В нем вы должны увидеть примерно следующее:

Temperature = 24.08 *C
Pressure = 99341.86 Pa
Approx altitude = 166.43 m

Если датчик не присылает данные, или присылает явно не корректные - например, показывает высоту 3 км, или температуру воздуха -30 *С, попробуйте предпринять следующие шаги:

Вызовите из setup() функцию SPI.setClockDivider(divider):

  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  SPI.setClockDivider(SPI_CLOCK_DIV16); // нужная функция
  
  //if (!bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID)) {
  if (!bmp.begin()) {

Эта функция задает величину делителя тактовой частоты SPI - интерфейса. Поэкспериментируйте с этим параметром, пока не добьетесь приема правильных данных.

Иногда предыдущий совет не приносит результата, в этом случае можно попробовать изменить параметры компиляции скетча:

  • Нажмите «Инструменты > Optimize: ... > Debug (-g)»

Если и это не помогает - хреново, чо.

Last updated