Работа с шиной SPI

Функции этого раздела предназначены для обмена данными с периферийными устройствами по высокоскоростному синхронному интерфейсу 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();

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

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

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

Навигация

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