# STM32duino & SPI

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

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

![Схема подключения кота к сети](/files/hfrJXbMlbPuVwumQZ7Xz)

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

* Нажмите «Файл», затем «Примеры > 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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://voltbro.gitbook.io/vbcores/ustarevshee-oborudovanie/programming/stm32duino-programming-hints/stm32duino-and-spi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
