Перейти к основному содержимому

Включение SPI • Драйвер spidev

Руководство иллюстрирует использование порта SPI0 микросхемы СКИФ с драйвером spidev. Пример применим только к отладочному модулю ELV-SMARC-CB r2.10.3 с установленным ELV-MC03-SMARC r1.1.

Для конфигурации DTS для других модулей необходимо руководствоватся схемой электрической на выбранный модуль и учитывать схему подключения процессора к периферийным устройствам.

Добавить в файл DTS описание spidev

На разъем XP6 отладочного модуля выведены два CS (CS0 и CS1) а также сигналы CLK, MOSI, MISO.

  • CS0 - Используется для общения с микросхемой w25q128jw.
  • CS1 - Свободен.
  1. Скачать необходимую версию buildroot с сайта.

  2. Распаковать и перейти в папку mcom03-defconfig-src.

  3. Распаковать архив ./buildroot/dl/linux/linux-mcom03-5.10.y-br1.tar.gz в произвольную папку. Далее по тексту эта папка обозначена CUSTOM_LINUX_PATH.

  4. В файле CUSTOM_LINUX_PATH/linux-headers-mcom03-5.10.y/arch/arm64/boot/dts/elvees/mcom03-elvmc03smarc-r1.0-elvsmarccb-r2.10.dts, в блок &spi0{ ... } добавить:

    spidev: spidev@1{
    status = "okay";
    compatible = "spidev";
    reg = <1>;
    #address-cells = <1>;
    #size-cells = <0>;
    spi-max-frequency = <500000>;
    };
  5. Сохранить изменения.

  6. Создать файл ./buildroot/local.mk.

  7. Прописать в него LINUX_OVERRIDE_SRCDIR = <CUSTOM_LINUX_PATH>/linux-headers-mcom03-5.10.y.

    Подробнее

  8. Применить defconfig ./docker-build.sh make mcom03_defconfig

  9. Войти в menuconfig ./docker-build.sh make menuconfig

  10. Добавить spidev_test: Target packages → Debugging, profiling and benchmark → [*] spidev_test.

  11. Сохранить конфигурацию и выйти.

  12. Запустить сборку

    ./docker-build.sh make

    Либо пересобрать только ядро

    ./docker-build.sh 'linux-rebuild && make'
  13. Записать полученный образ buildroot/output/images/rootfs.tar.gz на uSD.

  14. Запустить модуль и проверить наличие файла вида /dev/spidevX.Y

Тестирование интерфейса

spidev_test

  1. Соединить контакты MISO и MOSI.

    Распиновка разъема GPIO HEADER на отладочной плате
    Фото GPIO HEADER
  2. Запуск приложения:

    spidev_test -D /dev/spidevX.Y
    Вывод команды
    spi mode: 0x0
    bits per word: 8
    max speed: 500000 Hz (500 KHz)
    RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    F0 0D
  3. Для проверки работоспособности создайте файл test.bin и внести в него любые данные:

    echo "1234-hello-from-spi-000123" > test.bin
  4. Запуск теста:

    spidev_test -D /dev/spidevX.Y -i test.bin -o result.bin
  5. Должен появиться файл result.bin содержимое которого идентично test.bin.

    cat result.bin
    1234-hello-from-spi-000123

Python-пример

  1. На плате создать текстовый файл spi-test.py.

  2. Скопировать в него код:

    import argparse
    import spidev

    def freq_test(spi):
    send = bytearray(b"hello world")
    good_result = "hello world"

    kHz = 1000
    MHz = 1000000

    speeds = [
    10 * kHz,
    30 * kHz,
    100 * kHz,
    300 * kHz,
    1 * MHz,
    3 * MHz,
    10 * MHz,
    30 * MHz,
    40 * MHz,
    50 * MHz,
    ]

    print("{:<15} {:<30}".format("Speed, Hz", "error_cnt"))

    for speed in speeds:
    i = 0
    error_cnt = 0

    while i < 10:
    ret = spi.xfer(send, speed, 0, 8)
    ret = "".join(chr(e) for e in ret)
    if ret != good_result:
    error_cnt += 1
    i += 1
    print("{:<15} {:<30}".format(speed, error_cnt))

    def main():
    parser = argparse.ArgumentParser(
    description="Script for SPI loopback test on different speeds. "
    "Required to connect MISO and MOSI by one wire. "
    )

    parser.add_argument(
    "-p",
    "--port",
    default="/dev/spidev2.0",
    help="Spidev device (/dev/spidevX.Y)",
    )

    args = parser.parse_args()

    spi_bus = int(args.port.replace("/dev/spidev", '')[0])
    spi_device = int(args.port.replace("/dev/spidev", '')[-1])

    spi = spidev.SpiDev()
    spi.open(spi_bus, spi_device)
    freq_test(spi)


    if __name__ == '__main__':
    main()
  3. Запуск примера:

    python spi-test.py -p /dev/spidevX.Y
    Результат теста
    Speed, Hz       error_cnt
    10000 0
    30000 0
    100000 0
    300000 0
    1000000 0
    3000000 0
    10000000 0
    30000000 0
    40000000 0
    50000000 0