SPI
Интерфейс последовательной периферийной шины (SPI) используется для краткосрочной связи в встроенных системах. Интерфейс был разработан компанией Motorola в конце 80-х годов и стал де-факто стандартом.
Устройства SPI общаются в полнодуплексном режиме, используя архитектуру master-slave с одним мастером. Мастер-устройство инициирует рамку для чтения и записи.
В SPI используются 4 сигнала:
- CLK / SCK: Тактовые импульсы (выход от мастера).
- MOSI / SDO: Выход мастера, вход слейва.
- MISO / SDI: Вход мастера, выход слейва.
- SS / CS: Выбор слейва (активен при низком уровне, выход от мастера).
Несколько устройств-слейвов могут использовать одну и ту же шину SPI (линии SCK, SDO и SDI), и каждое из них выбирается через индивидуальные линии CS на устройстве, когда мастеру нужно общаться с одним устройством; кроме того, каждое устройство может работать на разных скоростях, полярности тактового сигнала и т. д.
Чтобы использовать этот модуль, необходимо учитывать следующее:
-
Подключите устройство SPI, используя функцию spi.attach. Эта функция возвращает экземпляр устройства SPI. Этот экземпляр необходимо сохранить в переменной для дальнейших операций с ним.
device = spi.attach(.....)
-
Используйте экземпляр устройства для выбора устройства. Это выбирает устройство через подключенный к устройству пин CS и настраивает шину (скорость, полярность и т. д.):
device:select()
-
Используйте экземпляр устройства для чтения из устройства / записи в устройство:
device:write(...)
-
Используйте экземпляр устройства для отмены выбора устройства. Это отменяет выбор устройства через подключенный к устройству пин 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: данные для записи, могут быть либо байтом, либо строкой.
Возвращает: прочитанные данные или исключение.