Удаленное управление. SPI. spidev-test

Всем привет, кто тут есть.

Всем, наверняка, известна утилита spidev_test, которой обычно проверяют правильность работы SPI на малине или других железках с линуксами. Скачать ее можно, например, тут.

После скачивания и удачной сборки, можно включить SPI на raspberry (через raspi-config) и замкнуть 2 пина SPI_MOSI и SPI_SOMI (Master Out Slave In и Slave Out Master In) и выполнить то, что собралось в предыдущем шаге.
Тут есть подробнее
Должно получиться что-то типа
./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

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
DE AD BE EF BA AD
F0 0D

Это же самое можно сделать на ferro_remote.
Для начала открою spi
spi = fr.client.spi -- alias
local dev = assert(spi.open(0, 1)) -- откроем устройство 


Теперь нужно передать в устройство какие-то данные. Я возьму кусок, прям из spidev_test
local inbuf = "\xFF\xFF\xFF\xFF\xFF\xFF\x40\x00"..
              "\x00\x00\x00\x95\xFF\xFF\xFF\xFF"..
              "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"..
              "\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x0D"

И далее просто сделаю вызов transfer из таблицы dev

local res = dev:transfer( inbuf )

В res придет уже то, что вернула железка. Если все правильно настроено, то результат должен быть ровно тем же, что и у spidev_test. Для этого добавил функцию hex_dump, которая возьмет строку и выведет ее в красивый вид на консоль.
Итого получилось:
spi = fr.client.spi

function hex_dump(buf)
    for i=1,math.ceil(#buf/16) * 16 do
        if (i-1) % 16 == 0 then 
            io.write(string.format('%08X  ', i-1)) 
        end
        io.write( i > #buf and '   ' or string.format('%02X ', buf:byte(i)) )
        if i %  8 == 0 then 
            io.write(' ') 
        end
        if i % 16 == 0 then 
            io.write( buf:sub(i-16+1, i):gsub('%c','.'), '\n' ) 
        end
    end
end

function main( ) 
    local inbuf = "\xFF\xFF\xFF\xFF\xFF\xFF\x40\x00"..
                  "\x00\x00\x00\x95\xFF\xFF\xFF\xFF"..
                  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"..
                  "\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x0D"
    local dev = assert(spi.open(0, 1))
    local res = dev:transfer( inbuf )
    print( "Input: " )
    hex_dump( inbuf )
    print( "Result:" )
    hex_dump( res )
end 

Это весь код.
Теперь подключимся к агенту, который запущен на малине и посмотрим. Пины разомкнуты:

$ ./lua_client -s 192.168.3.1:12345 -e spidev-test.lua 
Input: 
00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.
Result:
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................

А теперь замкнуты:
$ ./lua_client -s 192.168.3.1:12345 -e spidev-test.lua 
Input: 
00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.
Result:
00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.


Все как и должно быть.
  • 0

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

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.