Skip to content

How to use : Полное руководство

Alex Petrov edited this page Aug 5, 2017 · 7 revisions

Основные фичи:

  1. Бит ориентированный интерфейс, т.е. идея состоит в том, чтобы можно было посылать число бит не кратное 8 (некоторые чипы имеют специфическое командное слово, передаваемое по SPI, которое может состоять из 6 или 7 бит и т.п.).
  2. Поддержка всех возможных вариантов порядка байт (LE - little endian (мл. байты в конце, т.е. 0 байт старший), BE - big endian, противоположность LE) и бит (MSB, LSB First , при MSB первый бит старший, при LSB - наоборот)
  3. Добавление настраиваемого числа экстра клоков после передачи данных пока активен CS (для внутренней синхронизации для некоторых чипов и датчиков.
  4. Два варианта SPI (см. ниже) Hard & Soft
  5. Настройка модуля через CPU (для софт SPI)

Сам проект поддерживает два варианта (но наиболее полно готов quick_spi_soft.v):

  1. Софт SPI для случая, когда SPI запускается на кристаллах с процессорным ядром (Xilinx 7-серия, Cyclone V и т.п.) Софт SPI файлы: quick_spi_soft.v (модуль), C++ код: QuickSPI.h QuickSpi.cpp. Необходимо добавить С-порт для интеграции с Linux Kernel

  2. Хард SPI для случаев, когда SPI не имеет процессорного ядра, но когда необходимо работать по такому SPI c кристаллами типа Spartan 6, Cyclone III - IV и т.п. Хард SPI файлы: quick_spi_hard.v (модуль).

Использование Hard SPI сводится к подцеплению 6 линий () этого модуля и параметризацию модуля в коде, ничего сложного.

Использование Soft SPI:

QuickSPI spi;
spi.setBaseAddress(reinterpret_cast<void*>(0x43C30000));
spi.setCPOL(0);
spi.setCPHA(0);
spi.setDivider(2);
spi.setSlave(0);
spi.setRead(true);
spi.setOutgoingElementSize(16);
spi.setIncomingElementSize(9);
spi.setNumOutgoingElements(1);
spi.setNumWriteExtraToggles(5);

unsigned char outgoingBuffer[2] = {1,15};
spi.writeBits(16, outgoingBuffer, 0);
spi.startTransaction();

unsigned char incomingBuffer[2] = {0};
spi.readBits(9, incomingBuffer);

Описание интерфейса:

size_t QuickSPI::getControlSize();
Метод возвращает размер блока управления.

size_t QuickSPI::getBufferSize();
Метод возвращает текущий размер буфера (одинаковый как для буфера чтения, так и для буфера записи).

size_t QuickSPI::getWriteBufferStart();
Метод возвращает индекс начала буфера записи.

size_t QuickSPI::getWriteBufferEnd();
Метод возвращает индекс конца буфера записи.

size_t QuickSPI::getReadBufferStart();
Метод возвращает индекс начала буфера чтения.

size_t QuickSPI::getReadBufferEnd();
Метод возвращает индекс конца буфера чтения.

void* QuickSPI::getMemory();
Метод возвращает указатель на первый байт памяти.

void* QuickSPI::getWriteBuffer();
Метод возвращает указатель на первый байт буфера записи.

void* QuickSPI::getReadBuffer();
Метод возвращает указатель на первый байт буфера чтения.

unsigned char QuickSPI::getCPOL() const;
Метод возвращает значение полярности клока (0 или 1).

void QuickSPI::setCPOL(unsigned char pmCPOL);
Метод задает значение полярности клока (0 или 1).

unsigned char QuickSPI::getCPHA() const;
Метод возвращает значение фазы клока (0 или 1).

void QuickSPI::setCPHA(unsigned char pmCPHA);
Метод задает значение фазы клока (0 или 1).

bool QuickSPI::getBurst() const;
Метод возвращает текущий статус burst режима (true - активен, false - неактивен).

void QuickSPI::setBurst(bool pmBurst);
Метод активирует, либо деактивирует burst режим (true - активен, false - неактивен).

bool QuickSPI::getRead() const;
Метод возвращает текущий статус чтения.

void QuickSPI::setRead(bool pmRead);
Метод активирует, либо деактивирует чтение (true - активно, false - неактивно).

unsigned char QuickSPI::getSlave() const;
Метод возвращает текущий slave номер.

void QuickSPI::setSlave(unsigned char pmSlave);
Метод задает текущий slave номер (от 0 до 255).

unsigned char QuickSPI::getDivider() const;
Метод возвращает текущий делитель клока.

void QuickSPI::setDivider(unsigned char pmDivider);
Метод задает текущий делитель клока.

unsigned short QuickSPI::getIncomingElementSize() const;
Метод возвращает текущий размер элемента входящего потока данных.

void QuickSPI::setIncomingElementSize(unsigned short pmIncomingElementSize);
Метод задает текущий размер элемента входящего потока данных.

unsigned short QuickSPI::getOutgoingElementSize() const;
Метод возвращает текущий размер элемента исходящего потока данных.

void QuickSPI::setOutgoingElementSize(unsigned short pmOutgoingElementSize);
Метод задает текущий размер элемента исходящего потока данных.

unsigned short QuickSPI::getNumIncomingElements() const;
Метод возвращает заданное количество элементов входящего потока данных. 

void QuickSPI::setNumIncomingElements(unsigned short pmNumIncomingElements);
Метод задает количество элементов входящего потока данных.

unsigned short QuickSPI::getNumOutgoingElements() const;
Метод возвращает заданное количество элементов исходящего потока данных. 

void QuickSPI::setNumOutgoingElements(unsigned short pmNumOutgoingElements);
Метод задает количество элементов исходящего потока данных.

unsigned short QuickSPI::getNumReadExtraToggles() const;
Метод возвращает заданное количество дополнительных переключений после чтения элемента.

void QuickSPI::setNumReadExtraToggles(unsigned short pmNumReadExtraToggles);
Метод задает количество дополнительных переключений клока после чтения элемента.

unsigned short QuickSPI::getNumWriteExtraToggles() const;
Метод возвращает количество дополнительных переключений клока после записи элемента.

void QuickSPI::setNumWriteExtraToggles(unsigned short pmNumWriteExtraToggles);
Метод задает количество дополнительных переключений клока после записи элемента.

void QuickSPI::setIRQReceived(bool pmIRQReceived);
Служебный метод уведомляющий данный экземпляр класса о приеме IRQ.

void* QuickSPI::getBaseAddress() const;
Метод возвращает указатель на область памяти размеченную под AXI.

void QuickSPI::setBaseAddress(void* pmBaseAddress);
Метод задает базовый адрес (адрес области памяти размеченной под AXI).

size_t QuickSPI::computeNumBytesIncludingBitRemainder(size_t numBits);
Метод принимает на вход количество бит и возвращает количество байт которое требуется для аккомодации всех бит.

size_t QuickSPI::computeNumBytesExcludingBitRemainder(size_t numBits);
Метод принимает на вход количество бит и возвращает количество целых байт игнорируя остаток.

size_t QuickSPI::computeBitRemainder(size_t numBits);
Метод принимает на вход количество бит и возвращает остаток(количество бит в последнем нецелом байте).

void QuickSPI::copyBits(
    size_t numBits,
    const void* source,
    void* destination,
    size_t sourceStartBit,
    size_t destinationStartBit);
Метод копирует биты из одной области памяти в другую.

void QuickSPI::readBits(size_t numBits, void* buffer, size_t startBit);
Метод копирует биты из буфера чтения.

void QuickSPI::writeBits(size_t numBits, const void* buffer, size_t startBit);
Метод копирует биты в буфер записи.

void QuickSPI::reverseByteOrder(size_t numBytes, const void* source, void* destination);
Метод изменяет порядок байт (с little-endian на big-endian и наоборот).

void QuickSPI::reverseBitOrder(
    size_t numBits,
    const void* source,
    void* destination,
    size_t sourceStartBit,
    size_t destinationStartBit);
Метод изменяет порядок бит (с LSB на MSB и наоборот).

size_t QuickSPI::computeNumIncomingBytes() const;
Метод возвращает количество байт способное вместить количество бит во входящем потоке данных.

size_t QuickSPI::computeNumOutgoingBytes() const;
Метод возвращает количество байт способное вместить количество бит в исходящем потоке данных.

void QuickSPI::startTransaction();
Метод запускает модуль.

void QuickSPI::syncMemory();
Служебный метод синхронизирующий локальную и AXI память.