К СВЕДЕНИЮ
-
Контроллер
SPI0
подключен к контактам MOSI:PC0
, MISO:PC1
, CLK:PC2
и CS:PC3
. Доступен на 2-9 вариантах распиновки GPIO-разъема. -
Контроллер
SPI1
подключен к контактам MOSI:PA15
, MISO:PA16
, CLK:PA14
и CS:PA13
. Доступен на 2-6 вариантах распиновки GPIO-разъема.
Скорость передачи данных для контроллеров SPI SoC Allwinner H5 от 3 KHz до 100 MHz.
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 при успешном выполнении, или отрицательное значение в случае ошибки.
Пример использования функций SPI #
Код управляет работой выходного сдвигового регистра 74HC595, подключенного к порту SPI0. Выполняется циклическое смещение высокого логического напряжения на выходных контактах сдвигового регистра ("Карусель").
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "wiringRP.h"
#include "spi.h"
// Глобальные переменные и константы
int spi0_fd, spi1_fd;
const int speed = 50000;
unsigned int step = 1;
uint8_t tx = 0;
uint8_t rx = 0;
void setup() {
// Инициализация библиотек wiringRP
if(setupWiringRP(WRP_MODE_SUNXI) < 0)
exit(EXIT_FAILURE);
// Инициализация пользовательских объектов
spi0_fd = spiSetup(SPI0_BUS, speed);
spi1_fd = spiSetup(SPI1_BUS, speed);
if(spi0_fd < 0 || spi1_fd < 0)
exit(EXIT_FAILURE);
}
void loop() {
// Основной цикл программы
tx = 1 << (step++ % 5);
spiDataRW(spi0_fd, &tx, &rx, 1);
printf("rx: %.2X\n", rx);
delay(250);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
spiRelease(spi0_fd);
spiRelease(spi1_fd);
// Завершение работы библиотек
releaseWiringRP();
exit(0); // выход из программы
}
MAIN_WIRINGRP();