SPI

SPI

Интерфейс последовательной периферийной шины (SPI) используется для краткосрочной связи в встроенных системах. Интерфейс был разработан компанией Motorola в конце 80-х годов и стал де-факто стандартом.

Устройства SPI общаются в полнодуплексном режиме, используя архитектуру master-slave с одним мастером. Мастер-устройство инициирует рамку для чтения и записи.

В SPI используются 4 сигнала:

  • CLK / SCK: Тактовые импульсы (выход от мастера).
  • MOSI / SDO: Выход мастера, вход слейва.
  • MISO / SDI: Вход мастера, выход слейва.
  • SS / CS: Выбор слейва (активен при низком уровне, выход от мастера).

Несколько устройств-слейвов могут использовать одну и ту же шину SPI (линии SCK, SDO и SDI), и каждое из них выбирается через индивидуальные линии CS на устройстве, когда мастеру нужно общаться с одним устройством; кроме того, каждое устройство может работать на разных скоростях, полярности тактового сигнала и т. д.

Чтобы использовать этот модуль, необходимо учитывать следующее:

  1. Подключите устройство SPI, используя функцию spi.attach. Эта функция возвращает экземпляр устройства SPI. Этот экземпляр необходимо сохранить в переменной для дальнейших операций с ним.

    device = spi.attach(.....)
  2. Используйте экземпляр устройства для выбора устройства. Это выбирает устройство через подключенный к устройству пин CS и настраивает шину (скорость, полярность и т. д.):

    device:select()
  3. Используйте экземпляр устройства для чтения из устройства / записи в устройство:

    device:write(...)
  4. Используйте экземпляр устройства для отмены выбора устройства. Это отменяет выбор устройства через подключенный к устройству пин CS и отключает устройство от шины.

    instance:deselect()

spi.pins([table])

Список пинов, назначенных портам SPI. Прежде чем использовать любую функцию модуля SPI, вы можете изменить назначенные пины с помощью функции spi.setpins.

Аргументы:

  • table: если true, список пинов возвращается в виде таблицы Lua, если false — список пинов выводится в консоль.

Возвращает:

  • если table равно false: ничего или исключение.

  • если table равно true: таблицу Lua со списком пинов или исключение. Эта таблица является массивом таблиц. Каждая запись соответствует порту SPI. Каждый порт предоставляет следующие поля:

    • id: идентификатор порта SPI.
    • miso: номер GPIO, назначенный сигналу miso.
    • mosi: номер GPIO, назначенный сигналу mosi.
    • clk: номер GPIO, назначенный сигналу clk.
/ > spi.pins()
SPI2: miso=GPIO12 mosi=GPIO13 clk=GPIO14 
SPI3: miso=GPIO19 mosi=GPIO23 clk=GPIO18 

spi.setpins(id, miso, mosi, clk)

Установите пины, назначенные порту SPI. Используйте эту функцию, если вам нужно изменить начальные назначения.

Аргументы:

  • id: идентификатор единицы SPI. Используйте spi.SPIx, определенный для этой цели.
  • miso: номер GPIO, назначенный сигналу miso. Используйте любую константу pio.GPIOxx для этого.
  • mosi: номер GPIO, назначенный сигналу mosi. Используйте любую константу pio.GPIOxx для этого.
  • clk: номер GPIO, назначенный сигналу clk. Используйте любую константу pio.GPIOxx для этого.

Возвращает: ничего.

spi = spi.attach(id, mode, cs, speed, data bits, mode number, [flags])

Подключите устройство SPI.

Аргументы:

  • id: идентификатор единицы SPI. Используйте spi.SPIx, определенный для этой цели.

  • mode: режим SPI, может быть spi.MASTER (мастер) или spi.SLAVE (раб).

  • cs: пин выбора микросхемы устройства, например gpio.GPIO5. Если cs равно 0, используется пин выбора микросхемы по умолчанию для этого блока SPI.

  • speed: скорость модуля SPI, выраженная в герцах.

  • data bits: может быть 8, 16 или 32 бита.

  • mode number: целое число от 0 до 3, в соответствии со следующей таблицей:

    mode number polarity phase
    0 0 0
    1 0 1
    2 1 0
    3 1 1
  • flags (необязательно): битовая маска, составленная из следующих констант

  • spi.READ: подключить устройство SPI только для чтения (используется только MISO)

  • spi.WRITE: подключить устройство SPI только для записи (используется только MOSI)

  • значение по умолчанию spi.READ | spi.WRITE: подключить устройство SPI для чтения и записи (используются MISO и MOSI)

Возвращает: экземпляр устройства SPI или исключение. Этот экземпляр необходимо сохранить в переменной для дальнейших операций с ним.

-- Attach a SPI device using SPI2 as master, 1 Mhz speed, 8 bits
-- using GPIO5 as CS, number mode 0
device = spi.attach(spi.SPI2, spi.MASTER, pio.GPIO5, 1000000, 8, 0)

instance:select()

Выбор устройства SPI.

Аргументы: нет. Возвращает: нет.

-- Attach a SPI device using SPI2 as master, 1 Mhz speed, 8 bits
-- using GPIO5 as CS, number mode 0
device = spi.attach(spi.SPI2, spi.MASTER, pio.GPIO5, 1000000, 8, 0)

-- Select
device:select()

-- Do something
...
...

instance:deselect()

Отмена выбора устройства SPI.

Аргументы: нет. Возвращает: нет.

-- Attach a SPI device using SPI2 as master, 1 Mhz speed, 8 bits
-- using GPIO5 as CS, number mode 0
device = spi.attach(spi.SPI2, spi.MASTER, pio.GPIO5, 1000000, 8, 0)

-- Select
device:select()

-- Do something
...
...

-- Deselect
device:deselect()

instance:write(data1, [data2], … [datan])

Запись данных в устройство SPI.

Аргументы:

  • data1 до datan: данные для записи, могут быть либо байтом, либо строкой.

Возвращает: ничего или исключение.

-- Attach a SPI device using SPI2 as master, 1 Mhz speed, 8 bits
-- using GPIO5 as CS, number mode 0
device = spi.attach(spi.SPI2, spi.MASTER, pio.GPIO5, 1000000, 8, 0)

-- Select
device:select()

-- Do something
device:write("Hello, Lua RTOS!")

-- Deselect
device:deselect()

readed_data = instance:readwrite(data1, [data2], … [datan])

Записать и прочитать данные из устройства SPI.

Аргументы:

  • data1 до datan: данные для записи, могут быть либо байтом, либо строкой.

Возвращает: прочитанные данные или исключение.