Master-Slave Communication Between Two Jetson Nano over SPI

Run the slave first. Also make sure your have modify the device tree as slave mode.

1 Like

Hii @ShaneCCC ,
Loopback test run fine on Jetson nano as master device
I have tried loopback test on Jetson nano as slave device

Command :

./spidev_test -D/dev/spidev1.0 -s18000000 -n100 -g30 -p4

Output :

[ 1108.050910] spi-tegra124-slave 7000d600.spi: pm runtime failed, e = -22
can’t set spi mode: Invalid argu[ 1108.057740] audit: type=1701 audit(1600599739.923:6): auid=4294967295 uid=0 gid=0 ses=4294967295 pid=4733 comm="sp6
ment
Aborted

how to verify Jetson nano as slave device.

Thank You.

Hii @ShaneCCC
here I don’t understand what parameters are wrong, program returns 22 i.e. invalid arguments. can you please tell me where is the actual problem. I’m changing speed and other parameters but the result is always same

Thank You.

Did you modify the device tree for SPI slave mode?

Hii @ShaneCCC ,
Thank you for quick reply.
Yes, I have modified the device tree for slave mode.
I think device is set to slave mode so for loopback it didn’t get the clock frequency because on hardware I had short MISO & MOSI. & its only hardware connection i do.

Thank You.

Did you configure those PINs by jetson-io?

Confirm below command.
sudo cat /sys/kernel/debug/tegra_pinctrl_reg | grep -i spi

nvidia@nvidia-desktop:~$ sudo cat /sys/kernel/debug/tegra_pinctrl_reg | grep -i spi
[sudo] password for nvidia:
Bank: 1 Reg: 0x70003050 Val: 0x0000e044 -> spi1_mosi_pc0
Bank: 1 Reg: 0x70003054 Val: 0x0000e044 -> spi1_miso_pc1
Bank: 1 Reg: 0x70003058 Val: 0x0000e044 -> spi1_sck_pc2
Bank: 1 Reg: 0x7000305c Val: 0x0000e048 -> spi1_cs0_pc3
Bank: 1 Reg: 0x70003060 Val: 0x0000e048 -> spi1_cs1_pc4
Bank: 1 Reg: 0x70003064 Val: 0x00006044 -> spi2_mosi_pb4
Bank: 1 Reg: 0x70003068 Val: 0x00006044 -> spi2_miso_pb5
Bank: 1 Reg: 0x7000306c Val: 0x00006044 -> spi2_sck_pb6
Bank: 1 Reg: 0x70003070 Val: 0x00006044 -> spi2_cs0_pb7
Bank: 1 Reg: 0x70003074 Val: 0x00006044 -> spi2_cs1_pdd0
Bank: 1 Reg: 0x70003078 Val: 0x0000e015 -> spi4_mosi_pc7
Bank: 1 Reg: 0x7000307c Val: 0x0000e015 -> spi4_miso_pd0
Bank: 1 Reg: 0x70003080 Val: 0x0000e015 -> spi4_sck_pc5
Bank: 1 Reg: 0x70003084 Val: 0x0000e015 -> spi4_cs0_pc6

Hii @ShaneCCC ,

root@b2qt-jetson-nano-emmc:~#  cat /sys/kernel/debug/tegra_pinctrl_reg | grep -i spi                                                                  
Bank: 1 Reg: 0x70003050 Val: 0x0000e004 -> spi1_mosi_pc0
Bank: 1 Reg: 0x70003054 Val: 0x0000e044 -> spi1_miso_pc1
Bank: 1 Reg: 0x70003058 Val: 0x0000e004 -> spi1_sck_pc2
Bank: 1 Reg: 0x7000305c Val: 0x0000e009 -> spi1_cs0_pc3
Bank: 1 Reg: 0x70003060 Val: 0x0000e015 -> spi1_cs1_pc4
Bank: 1 Reg: 0x70003064 Val: 0x00006004 -> spi2_mosi_pb4
Bank: 1 Reg: 0x70003068 Val: 0x00006044 -> spi2_miso_pb5
Bank: 1 Reg: 0x7000306c Val: 0x00006044 -> spi2_sck_pb6
Bank: 1 Reg: 0x70003070 Val: 0x0000600a -> spi2_cs0_pb7
Bank: 1 Reg: 0x70003074 Val: 0x00006015 -> spi2_cs1_pdd0
Bank: 1 Reg: 0x70003078 Val: 0x0000e015 -> spi4_mosi_pc7
Bank: 1 Reg: 0x7000307c Val: 0x0000e015 -> spi4_miso_pd0
Bank: 1 Reg: 0x70003080 Val: 0x0000e015 -> spi4_sck_pc5
Bank: 1 Reg: 0x70003084 Val: 0x0000e015 -> spi4_cs0_pc6
Bank: 1 Reg: 0x70003088 Val: 0x00002040 -> qspi_sck_pee0
Bank: 1 Reg: 0x7000308c Val: 0x00002000 -> qspi_cs_n_pee1
Bank: 1 Reg: 0x70003090 Val: 0x00002040 -> qspi_io0_pee2
Bank: 1 Reg: 0x70003094 Val: 0x00002040 -> qspi_io1_pee3
Bank: 1 Reg: 0x70003098 Val: 0x00002040 -> qspi_io2_pee4
Bank: 1 Reg: 0x7000309c Val: 0x00002040 -> qspi_io3_pee5
Bank: 0 Reg: 0x70000b70 Val: 0x00000001 -> drive_qspi_comp_control
Bank: 0 Reg: 0x70000b78 Val: 0x00000001 -> drive_qspi_lpbk_control
Bank: 0 Reg: 0x70000a78 Val: 0x00808000 -> drive_qspi_comp

Thank You.

Hii @ShaneCCC, Does loopback successfully run on slave ?

Hii @ShaneCCC ,
spidev_test.c is not working with 2 jetson nano one as master and other as slave, will you elaborate the process to run the test.

SPI_MASTER device log :

root@b2qt-jetson-nano-emmc:~# ./spidev_test -D/dev/spidev1.0 -s18000000 -n100 -g30 -p4                                                                
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
root@b2qt-jetson-nano-emmc:~#

SPI_SLAVE device log :

root@b2qt-jetson-nano-emmc:~# ./spidev_test -D/dev/spidev1.0 -s18000000 -n100 -g30 -p4                                                                
[  738.768389] tegra-dvfs: rate 408000000 too high for dvfs on sbc2
[  738.774437] spi-tegra124-slave 7000d600.spi: clk_prepare failed: -22
[  738.780885] spi-tegra124-slave 7000d600.spi: pm runtime failed, e = -22
can't set spi mode: Invalid argu[  738.789928] audit: type=1701 audit(1600599370.519:3): auid=4294967295 uid=0 gid=0 ses=4294967295 pid=4696 comm="sp6
ment
Aborted

why one device not wait for another device to run the command .
what to do ?

Thank You.

If the configuration is correct the slave mode will wait master to send data.

Thanks

Hii @ShaneCCC ,
After observing the verbose output, i know that can't set spi mode: Invalid argument this is error. so I’m confused which mode I need to set like master/slave mode or cpol/cphase mode or read only/write only mode.

I think my master works fine bcoz in output i observed that master is sending data but slave is not able to receive it.

root@b2qt-jetson-nano-emmc:~# ./spidev_test -D /dev/spidev1.0 -s1000000 -n10 -g10 -p4 -zzz
using device: /dev/spidev1.0
setting spi mode for read,write
setting spi bpw
setting max speed for rd/wr
spi mode: 0
bits per word: 8 bytes per word: 1
max speed: 1000000 Hz (1000 KHz)
no. runs: 10
Using seed:0x5f675722
loop count = 0 
transfer packet size should be from 12 to 131072
loop count = 1 
transfer packet size should be from 12 to 131072
loop count = 2 
transfer packet size should be from 12 to 131072
loop count = 3 
transfer packet size should be from 12 to 131072
loop count = 4 
transfer packet size should be from 12 to 131072
loop count = 5 
transfer packet size should be from 12 to 131072
loop count = 6 
transfer packet size should be from 12 to 131072
loop count = 7 
transfer packet size should be from 12 to 131072
loop count = 8 
transfer packet size should be from 12 to 131072
loop count = 9 
transfer packet size should be from 12 to 131072
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
====== Transfer stats ====
Transmit:
       total: 0B (0KiB 0MiB)
       total: 0P 
       ioerr: 0B (0KiB 0MiB)
       ioerr: 0P
 Rate:
  wire total: -1B/s (0KB/s)
       total: -1B/s (0KB/s)
  wire total: -1P/s
       total: -1P/s
Receive:
       total: 0B (0KiB 0MiB)
       total: 0P 
        good: 0B (0KiB 0MiB)
        good: 0P
       ioerr: 0P
     dataerr: 0P
 Rate:
        good: -1B/s (0KB/s)
        good: -1P/s
 packet drop: -1/10000

  Total time: 0.000124s

If you have any idea about that mode error help me. I’m also looking into it.
from log can you tell me is my master device working fine.

Thank You.

Hii @ShaneCCC ,

root@b2qt-jetson-nano-emmc:~# ./spidev_test -D /dev/spidev1.0 -s150000 -g512 -b32 -H -p0 -n1 -zzz -t
Disabling receive
using device: /dev/spidev1.0
setting spi mode for read,write
setting spi bpw
setting max speed for rd/wr
spi mode: 1
bits per word: 32 bytes per word: 4
max speed: 150000 Hz (150 KHz)
no. runs: 1
Using seed:0x5f676553
loop count = 0 
using sequential pattern ....
transfer bytes [512]
0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 
0020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 
0030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 
0040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 
0050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 
0060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 
0070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 
0080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 
0090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F 
00A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF 
00B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF 
00C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF 
00D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF 
00E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF 
00F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE 00 
0100: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 
0110: 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 
0120: 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 
0130: 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 
0140: 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 
0150: 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 
0160: 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 
0170: 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 
0180: 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 
0190: 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 
01A0: A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 
01B0: B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 
01C0: C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 
01D0: D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 
01E0: E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 
01F0: F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE 00 01 
/dev/spidev1.0: TEST PASSED 
====== Transfer stats ====
Transmit:
       total: 512B (0KiB 0MiB)
       total: 1P 
       ioerr: 0B (0KiB 0MiB)
       ioerr: 0P
 Rate:
  wire total: -1B/s (0KB/s)
       total: -1B/s (0KB/s)
  wire total: -1P/s
       total: -1P/s

  Total time: 0.028486s

I ran this test on master as its receive was disable so according to this can i confirm that my master configuration is fine and slave is the one causing problem.

Thank You.

Hii @ShaneCCC ,
I have perform so many permutation and combination of the commands but spi slave gives same error every time i.e. can't set spi mode: Invalid argument

Thank You.

Please dump the device tree to check.
Will gen the extraced_proc.dts file to check.
And what is your BSP version. cat /etc/nv_tegra_release

sudo dtc -I fs -O dts -o extracted_proc.dts /proc/device-tree

Hii @ShaneCCC ,

We are using L4T 32.4.3.
Below file contains the output of the command :
extracted_proc.dts (287.7 KB)

Thank You.

What the command shows with below command.

sudo cat /sys/kernel/debug/tegra-gpio

Did you connect to spi@7000d600 pin 16/18/22/37 ?

1 Like

Hii @ShaneCCC ,

We have used a custom board. And we have made changes to the pinmux to set the 104/108/106/110 as SPI pins.

This is the output of the command :

Name:Bank:Port CNF OE OUT IN INT_STA INT_ENB INT_LVL
 A: 0:0 64 40 40 04 00 00 000000
 B: 0:1 00 00 00 00 00 00 000000
 C: 0:2 08 08 08 00 00 00 000000
 D: 0:3 00 00 00 00 00 00 000000
 E: 1:0 0d 00 00 00 00 00 000000
 F: 1:1 00 00 00 00 00 00 000000
 G: 1:2 08 00 00 00 00 00 000000
 H: 1:3 bd 19 00 20 00 00 000000
 I: 2:0 07 07 01 00 00 00 000000
 J: 2:1 60 00 00 40 00 00 000000
 K: 2:2 00 00 00 00 00 00 000000
 L: 2:3 00 00 00 00 00 00 000000
 M: 3:0 00 00 00 00 00 00 000000
 N: 3:1 00 00 00 00 00 00 000000
 O: 3:2 00 00 00 00 00 00 000000
 P: 3:3 00 00 00 00 00 00 000000
 Q: 4:0 00 00 00 00 00 00 000000
 R: 4:1 00 00 00 00 00 00 000000
 S: 4:2 a0 a0 00 00 00 00 000000
 T: 4:3 01 01 00 00 00 00 000000
 U: 5:0 00 00 00 00 00 00 000000
 V: 5:1 02 02 02 00 00 00 000000
 W: 5:2 00 00 00 00 00 00 000000
 X: 5:3 78 08 08 70 00 60 606000
 Y: 6:0 06 00 00 06 00 00 000000
 Z: 6:1 0f 08 00 06 00 04 000400
AA: 6:2 00 00 00 00 00 00 000000
BB: 6:3 01 00 00 01 00 00 000000
CC: 7:0 92 80 80 12 00 12 121200
DD: 7:1 00 00 00 00 00 00 000000
EE: 7:2 00 00 00 00 00 00 000000
FF: 7:3 00 00 00 00 00 00 000000

after making some changes in device tree of slave it shows

transfer ioctl error: -1

Thank You.

Could you just try internal loopback test. Just connect the MOSI<->MISO

Hii @ShaneCCC ,

Output of loopback test :

root@b2qt-jetson-nano-emmc:~# ./spidev_test -D/dev/spidev1.0 -s18000000 -n10 -g30 -p4
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
transfer ioctl error: -1
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
root@b2qt-jetson-nano-emmc:~#

below is dmesg logs :

[Sep20 10:53] spidev spi1.0: setup 8 bpw, ~cpol, ~cpha, 33000000Hz
[  +0.000034] spidev spi1.0: setup mode 0, 8 bits/w, 33000000 Hz max --> 0
[  +0.000004] spidev spi1.0: spi mode 0
[  +0.000008] spidev spi1.0: setup 8 bpw, ~cpol, ~cpha, 33000000Hz
[  +0.000017] spidev spi1.0: setup mode 0, 8 bits/w, 33000000 Hz max --> 0
[  +0.000004] spidev spi1.0: 8 bits per word
[  +0.000008] spidev spi1.0: setup 8 bpw, ~cpol, ~cpha, 18000000Hz
[  +0.000014] spidev spi1.0: setup mode 0, 8 bits/w, 18000000 Hz max --> 0
[  +0.000067] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000005] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.008285] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007449] spi_master spi1: failed to transfer one message from queue
[  +0.008939] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000005] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007806] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007507] spi_master spi1: failed to transfer one message from queue
[  +0.006790] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000018] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007758] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007465] spi_master spi1: failed to transfer one message from queue
[  +0.006847] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000004] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007752] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007530] spi_master spi1: failed to transfer one message from queue
[  +0.007663] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000050] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.008157] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007911] spi_master spi1: failed to transfer one message from queue
[  +0.007972] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000053] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.008068] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007471] spi_master spi1: failed to transfer one message from queue
[  +0.006593] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000004] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007786] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007586] spi_master spi1: failed to transfer one message from queue
[  +0.006779] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000017] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007721] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007547] spi_master spi1: failed to transfer one message from queue
[  +0.006635] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000011] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007755] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007584] spi_master spi1: failed to transfer one message from queue
[  +0.006772] spi-tegra124-slave 7000d600.spi: RxTx len:30 bpw:8 0us 18000000Hz
[  +0.000017] spi-tegra124-slave 7000d600.spi: Cannot set requested clk freq 18000000
[  +0.007799] spi-tegra124-slave 7000d600.spi: spi can not start transfer, err -22
[  +0.007472] spi_master spi1: failed to transfer one message from queue

Thank You.

Hii @ShaneCCC ,
what else can I try to make it working.

Thank You.