Перейти к основному содержимому

SPI

к сведению
  • Контроллер 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();