Удаленное управление. 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 ���������������.
Все как и должно быть.