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();


54 просмотров0 комментариев

Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Разделы

Навигация

ВойтиРегистрация