Функции этого раздела предназначены для обмена данными с периферийными устройствами по высокоскоростному синхронному интерфейсу SPI (Serial Peripheral Interface).
К СВЕДЕНИЮ #
Библиотека wiringRP автоматически определяет модель вашей платы для корректной работы с SPI. Скорость передачи данных может достигать 100 МГц.
Доступность SPI-шин на Repka Pi 3 (SoC Allwinner H5):
| Константа | Интерфейс | MOSI | MISO | CLK | CS0 | CS1 | Доступен в вариантах распиновки |
|---|---|---|---|---|---|---|---|
SPI0_BUS |
SPI0 | PC0 (п.19) |
PC1 (п.21) |
PC2 (п.23) |
PC3 (п.24) |
PA3 (п.26) |
2-8 |
SPI1_BUS |
SPI1 | PA15 (п.38) |
PA16 (п.35) |
PA14 (п.40) |
PA13 (п.36) |
2-6 |
Доступность SPI-шин на Repka Pi 4 (SoC Allwinner H6):
| Константа | Интерфейс | MOSI | MISO | CLK | CS0 | CS1 | Доступен в вариантах распиновки |
|---|---|---|---|---|---|---|---|
SPI0_BUS |
SPI0 | PH5 (п.19) |
PH6 (п.21) |
PH4 (п.23) |
PH3 (п.24) |
PH2 (п.26) |
2-9 |
spiSetup()
Инициализирует функцию передачи данных с использованием SPI интерфейса.
Синтаксис
int spiSetup(const int spiBus, const int speed_hz)
Параметры
spiBus- дескриптор порта SPI, доступные значения:SPI0_BUS- порт SPI0.SPI1_BUS- порт SPI1.
speed_hz- Максимальная скорость передачи данных в Гц.
Возврат Файловый дескриптор порта SPI, или отрицательное значение в случае ошибки.
spiRelease()
Высвобождает ресурсы, задействованные функцией передачи данных с использованием SPI интерфейса.
Синтаксис
void spiRelease(int fd)
Параметры
fd- файловый дескриптор порта SPI.
Возврат Ничего.
spiDataRW()
Чтение и запись данных из буферов SPI контроллера в full-duplex режиме обмена данными.
Синтаксис
int spiDataRW(int fd, uint8_t *tx, uint8_t *rx, int len)
Параметры
fd- файловый дескриптор порта SPI.tx- указатель на массив передаваемых байт, еслиNULLпередача данных не выполняется.rx- указатель на массив принимаемых байт, еслиNULLполучение данных не выполняется.len- длина массивовtxиrx.
Возврат 0 при успешном выполнении, или отрицательное значение в случае ошибки.
Пример использования: Loopback-тест шины SPI0 #
Этот код проверяет работоспособность основного интерфейса SPI0. Для теста необходимо соединить проводом-перемычкой пины MOSI и MISO (например, для SPI0 на обеих платах это пины 19 и 21). Программа отправляет данные и тут же их читает. Если отправленные и полученные данные совпадают, значит, интерфейс работает корректно.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "wiringRP.h"
#include "spi.h"
void setup() {
if(setupWiringRP(WRP_MODE_SUNXI) < 0) {
exit(EXIT_FAILURE);
}
printf("--- Тест SPI0 Loopback ---\n");
printf("Убедитесь, что пины MOSI и MISO для SPI0 соединены (например, пин 19 и 21).\n\n");
}
void loop() {
int fd = spiSetup(SPI0_BUS, 1000000); // Инициализируем SPI0 на скорости 1 МГц
if (fd < 0) {
printf("Не удалось инициализировать SPI0. Проверьте вариант распиновки.\n");
delay(5000);
return; // Попробуем снова через 5 секунд
}
uint8_t tx_data[] = {0xAA, 0x55, 0xDE, 0xAD};
uint8_t rx_data[sizeof(tx_data)] = {0};
printf("Отправка данных: 0xAA 0x55 0xDE 0xAD\n");
spiDataRW(fd, tx_data, rx_data, sizeof(tx_data));
printf("Полученные данные: 0x%02X 0x%02X 0x%02X 0x%02X\n",
rx_data[0], rx_data[1], rx_data[2], rx_data[3]);
if (memcmp(tx_data, rx_data, sizeof(tx_data)) == 0) {
printf("Результат: УСПЕХ! Данные совпадают.\n\n");
} else {
printf("Результат: ОШИБКА! Данные не совпадают.\n\n");
}
spiRelease(fd);
delay(5000); // Пауза перед следующим тестом
}
ONDESTROY(){
releaseWiringRP();
exit(0);
}
MAIN_WIRINGRP();