> For the complete documentation index, see [llms.txt](https://voltbro.gitbook.io/vbcores/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://voltbro.gitbook.io/vbcores/ustarevshee-oborudovanie/programming/stm32duino-programming-hints/stm32duino-and-spi.md).

# STM32duino & SPI

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

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

![Схема подключения кота к сети](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FPqesD8m8JyfEgelenufl%2FGY-BMP280-SPI_bb.png?alt=media\&token=cd329882-5baa-4fc2-9def-f7395744afa5)

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

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

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

```arduino
#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);
```

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

```arduino
#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);
```

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

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

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

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

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

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

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

{% hint style="info" %}
Эта функция задает величину делителя тактовой частоты SPI - интерфейса. Поэкспериментируйте с этим параметром, пока не добьетесь приема правильных данных.&#x20;
{% endhint %}

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

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

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