Удаленное управление. 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 ���������������.


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

Комментарии:

Для написания комментариев необходимо зарегистрироваться