Why SPI@c260000 in slave mode keep reporting error on AGX Xavier?

Hi, now i set the spi@c260000 as slave mode, but when i use spidev_test to test ,it always report error.
**0 - pinmux setting **

devmem2 0x0c302048 w 0x00000444
devmem2 0x0c302050 w 0x00000444
devmem2 0x0c302028 w 0x00000444
devmem2 0x0c302038 w 0x00000448

And i open the menuconfig of spi debug

1 - my dts setting

spi1: spi@c260000 {
	    compatible = "nvidia,tegra186-spi-slave";	//zp change
		reg = <0x0 0x0c260000 0x0 0x10000>;
		interrupts = <0 37 0x04>;
		#address-cells = <1>;
		#size-cells = <0>;
		iommus = <&smmu TEGRA_SID_GPCDMA_0>;
		dma-coherent;
		dmas = <&gpcdma 16>, <&gpcdma 16>;
		dma-names = "rx", "tx";
		spi-max-frequency = <65000000>;
		nvidia,clk-parents = "pll_p", "osc";
		clocks = <&bpmp_clks TEGRA194_CLK_SPI2>,
			<&bpmp_clks TEGRA194_CLK_PLLAON>,
			<&bpmp_clks TEGRA194_CLK_OSC>;
		clock-names = "spi", "pll_p", "osc";
		resets = <&bpmp_resets TEGRA194_RESET_SPI2>;
		reset-names = "spi";
		status = "okay";
		
        spi@0 {
	    	compatible = "spidev";
	        reg = <0>;
	        spi-max-frequency = <65000000>;
	    
	        controller-data {
	            nvidia,enable-hw-based-cs;
				nvidia,rx-clk-tap-delay = <0x11>;
				nvidia,tx-clk-tap-delay = <0x0>;
	         };
	    
	    };
	};

it generates a device node /dev/spidev1.0

2 - FPGA pin connect xavier SPI2(spi1@c260000) pins

"FPGA"   ->     "AGX Xavier"
cs       ->       SPI2_CS0_N
CLK      ->     SPI2_CLK
MOSI     ->     SPI2_MISO
MISO    ×××     SPI2_MOSI   (no connection, only connect fpga's MOSI to Xavier's SPI2_MISO) 

3 - use the spidev_test tool to test

root@dev-desktop:~/lab#./spidev_test_shaneCCC -D /dev/spidev1.0 -s12500000 -g60 -b8 -zzz -O -H
using device: /dev/spidev1.0
setting spi mode for read,write
setting spi bpw
setting max speed for rd/wr
spi mode: 3
bits per word: 8 bytes per word: 1
max speed: 12500000 Hz (12500 KHz)
no. runs: 1
Using seed:0x61136f21
loop count = 0
using sequential pattern ....
transfer bytes [60]
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
transfer: Return actual transfer length: 60
receive bytes [60]
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 00 00 00 00 00 00 00 00 00 00 00 00
"
mismatch index 1
^^^ 00 00 00 00 00 00 00 00 00 00 00 transfer: received packet size:60 len:60 stat:-6
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
"
====== Transfer stats ====
Transmit:
       total: 60B (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
Receive:
       total: 60B (0KiB 0MiB)
       total: 1P
        good: 0B (0KiB 0MiB)
        good: 0P
       ioerr: 0P
     dataerr: 1P
 Rate:
        good: -1B/s (0KB/s)
        good: -1P/s
 packet drop: -1/10000

  Total time: 0.194392s

4 - dmesg

root@dev-desktop:~/lab# dmesg | grep spi
[    0.816244] iommu: Adding device 3210000.spi to group 11
[    0.816607] iommu: Adding device c260000.spi to group 12
[    1.959626] spi-tegra114 3210000.spi: Prod settings list not initialized
[    1.960283] spi-tegra114 3210000.spi: prod settings failed with error -22
[    1.960637] spi-tegra114 3210000.spi: registered master spi0
[    1.960744] spi spi0.0: setup 8 bpw, ~cpol, ~cpha, 33000000Hz
[    1.960765] spi spi0.0: setup mode 0, 8 bits/w, 33000000 Hz max --> 0
[    1.961029] spi-tegra114 3210000.spi: registered child spi0.0
[    1.961078] spi spi0.1: setup 8 bpw, ~cpol, ~cpha, 33000000Hz
[    1.961099] spi spi0.1: setup mode 0, 8 bits/w, 33000000 Hz max --> 0
[    1.961365] spi-tegra114 3210000.spi: registered child spi0.1
[    1.961714] spi-tegra124-slave c260000.spi: rx-trigger:0 clock-always-on:0
[    1.962614] spi-tegra124-slave c260000.spi: registered master spi1
[    1.962813] spi spi1.0: setup 8 bpw, ~cpol, ~cpha, 65000000Hz
[    1.962936] spi spi1.0: setup mode 0, 8 bits/w, 65000000 Hz max --> 0
[    1.963273] spi-tegra124-slave c260000.spi: registered child spi1.0
[    6.566059] spidev: module is already loaded
[    6.596672] spidev: module is already loaded
[    6.689455] spidev: module is already loaded


[12664.068100] spidev spi1.0: setup 8 bpw, cpol, cpha, 65000000Hz
[12664.068521] spidev spi1.0: setup mode 3, 8 bits/w, 65000000 Hz max --> 0
[12664.068531] spidev spi1.0: spi mode 3
[12664.068707] spidev spi1.0: setup 8 bpw, cpol, cpha, 65000000Hz
[12664.069000] spidev spi1.0: setup mode 3, 8 bits/w, 65000000 Hz max --> 0
[12664.069008] spidev spi1.0: 8 bits per word
[12664.069127] spidev spi1.0: setup 8 bpw, cpol, cpha, 12500000Hz
[12664.069257] spidev spi1.0: setup mode 3, 8 bits/w, 12500000 Hz max --> 0
[12664.070750] spi-tegra124-slave c260000.spi: RxTx len:60 bpw:8 0us 12500000Hz
[12664.070800] spi-tegra124-slave c260000.spi: The def 0x13f00000 and written 0x33f01827
[12664.070869] spi-tegra124-slave c260000.spi: TxFIFO[0] 00 01 02 03
[12664.070875] spi-tegra124-slave c260000.spi: TxFIFO[1] 04 05 06 07
[12664.070881] spi-tegra124-slave c260000.spi: TxFIFO[2] 08 09 0a 0b
[12664.070887] spi-tegra124-slave c260000.spi: TxFIFO[3] 0c 0d 0e 0f
[12664.070893] spi-tegra124-slave c260000.spi: TxFIFO[4] 10 11 12 13
[12664.070898] spi-tegra124-slave c260000.spi: TxFIFO[5] 14 15 16 17
[12664.070904] spi-tegra124-slave c260000.spi: TxFIFO[6] 18 19 1a 1b
[12664.070911] spi-tegra124-slave c260000.spi: TxFIFO[7] 1c 1d 1e 1f
[12664.070938] spi-tegra124-slave c260000.spi: TxFIFO[8] 20 21 22 23
[12664.070956] spi-tegra124-slave c260000.spi: TxFIFO[9] 24 25 26 27
[12664.070977] spi-tegra124-slave c260000.spi: TxFIFO[10] 28 29 2a 2b
[12664.070995] spi-tegra124-slave c260000.spi: TxFIFO[11] 2c 2d 2e 2f
[12664.071010] spi-tegra124-slave c260000.spi: TxFIFO[12] 30 31 32 33
[12664.071021] spi-tegra124-slave c260000.spi: TxFIFO[13] 34 35 36 37
[12664.071045] spi-tegra124-slave c260000.spi: TxFIFO[14] 38 39 3a 3b
[12664.071076] spi_master spi1: Before PIO EN
[12664.071101] spi_master spi1:   CMD[33f01827]:  Sl M3 CS0 [HHHH] MSB MSb Rx Tx Pa 8b TRANS[00ff003c]:BSY I:255 B:60
                FIFO[00320001]:RxF:0 TxE:50 Err[] RxSTA[E] TxSTA[]DMA[00000000]:    RxTr:0 TxTr:0 B:59
[12664.261732] spi_master spi1: @isr
[12664.261784] spi_master spi1:   CMD[33f01827]:  Sl M3 CS0 [HHHH] MSB MSb Rx Tx Pa 8b TRANS[40ff003c]:RDY I:255 B:60
                FIFO[07c00004]:RxF:15 TxE:64 Err[] RxSTA[] TxSTA[E]DMA[00000000]:    RxTr:0 TxTr:0 B:59
[12664.262584] spi-tegra124-slave c260000.spi: RxFIFO[0] 00 00 00 00
[12664.262599] spi-tegra124-slave c260000.spi: RxFIFO[1] 00 00 00 00
[12664.262610] spi-tegra124-slave c260000.spi: RxFIFO[2] 00 00 00 00
[12664.262711] spi-tegra124-slave c260000.spi: RxFIFO[3] 00 00 00 00
[12664.262720] spi-tegra124-slave c260000.spi: RxFIFO[4] 00 00 00 00
[12664.262763] spi-tegra124-slave c260000.spi: RxFIFO[5] 00 00 00 00
[12664.262770] spi-tegra124-slave c260000.spi: RxFIFO[6] 00 00 00 00
[12664.262777] spi-tegra124-slave c260000.spi: RxFIFO[7] 00 00 00 00
[12664.262785] spi-tegra124-slave c260000.spi: RxFIFO[8] 00 00 00 00
[12664.262792] spi-tegra124-slave c260000.spi: RxFIFO[9] 00 00 00 00
[12664.262800] spi-tegra124-slave c260000.spi: RxFIFO[10] 00 00 00 00
[12664.262808] spi-tegra124-slave c260000.spi: RxFIFO[11] 00 00 00 00
[12664.262816] spi-tegra124-slave c260000.spi: RxFIFO[12] 00 00 00 00
[12664.262841] spi-tegra124-slave c260000.spi: RxFIFO[13] 00 00 00 00
[12664.262873] spi-tegra124-slave c260000.spi: RxFIFO[14] 00 00 00 00
[12664.262892] spi-tegra124-slave c260000.spi: Profile: size=60B time-from-spi-int=1078510ns

I’m not sure if the problem(cant receive the spi data) is due to my configuration, please help

Best wishes

Could you connect the SPI0 to do the device loopback test to confirm it.

thank you for your fast answer.
That’s maybe not very easy.
can you see any porblem from my configuration?

The configure looks fine didn’t found error.

Hi shaneCCC
FPGA change the pin as MOSI send to my MOSI, and now , use your spidev_test can receive the data, but it still report error - TEST FAILED -1, why?

root@dev-desktop:~/lab# ./spidev_test_shaneCCC -D /dev/spidev1.0 -s12500000 -g60 -b8 -zzz -H
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: 8 bytes per word: 1
max speed: 12500000 Hz (12500 KHz)
no. runs: 1
Using seed:0x6114a04c
loop count = 0
using sequential pattern ....
transfer bytes [60]
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
transfer: Return actual transfer length: 60
receive bytes [60]
0000: 20 21 06 30 16 55 01 80 01 80 01 80 01 80 01 80
0010: 01 80 01 80 01 80 01 80 01 80 01 80 01 80 01 80
0020: 01 80 01 80 01 80 01 80 01 80 01 80 01 80 01 80
0030: 01 80 01 80 01 80 00 66 31 8C 61 80
mismatch index 0
^^^ 20 21 06 30 16 55 01 80 01 80 01 transfer: received packet size:60 len:60 stat:-6
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
====== Transfer stats ====
Transmit:
       total: 60B (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
Receive:
       total: 60B (0KiB 0MiB)
       total: 1P
        good: 0B (0KiB 0MiB)
        good: 0P
       ioerr: 0P
     dataerr: 1P
 Rate:
        good: -1B/s (0KB/s)
        good: -1P/s
 packet drop: -1/10000

  Total time: 0.082209s

And dmesg


[ 2424.267831] spidev spi1.0: setup 8 bpw, ~cpol, cpha, 65000000Hz
[ 2424.268308] spidev spi1.0: setup mode 1, 8 bits/w, 65000000 Hz max --> 0
[ 2424.268379] spidev spi1.0: spi mode 1
[ 2424.268555] spidev spi1.0: setup 8 bpw, ~cpol, cpha, 65000000Hz
[ 2424.268899] spidev spi1.0: setup mode 1, 8 bits/w, 65000000 Hz max --> 0
[ 2424.268907] spidev spi1.0: 8 bits per word
[ 2424.268957] spidev spi1.0: setup 8 bpw, ~cpol, cpha, 12500000Hz
[ 2424.269207] spidev spi1.0: setup mode 1, 8 bits/w, 12500000 Hz max --> 0
[ 2424.270894] spi-tegra124-slave c260000.spi: RxTx len:60 bpw:8 0us 12500000Hz
[ 2424.270940] spi-tegra124-slave c260000.spi: The def 0x13f00000 and written 0x13f01827
[ 2424.270959] spi-tegra124-slave c260000.spi: TxFIFO[0] 00 01 02 03
[ 2424.270966] spi-tegra124-slave c260000.spi: TxFIFO[1] 04 05 06 07
[ 2424.270971] spi-tegra124-slave c260000.spi: TxFIFO[2] 08 09 0a 0b
[ 2424.270977] spi-tegra124-slave c260000.spi: TxFIFO[3] 0c 0d 0e 0f
[ 2424.270983] spi-tegra124-slave c260000.spi: TxFIFO[4] 10 11 12 13
[ 2424.270989] spi-tegra124-slave c260000.spi: TxFIFO[5] 14 15 16 17
[ 2424.270995] spi-tegra124-slave c260000.spi: TxFIFO[6] 18 19 1a 1b
[ 2424.271001] spi-tegra124-slave c260000.spi: TxFIFO[7] 1c 1d 1e 1f
[ 2424.271059] spi-tegra124-slave c260000.spi: TxFIFO[8] 20 21 22 23
[ 2424.271066] spi-tegra124-slave c260000.spi: TxFIFO[9] 24 25 26 27
[ 2424.271072] spi-tegra124-slave c260000.spi: TxFIFO[10] 28 29 2a 2b
[ 2424.271078] spi-tegra124-slave c260000.spi: TxFIFO[11] 2c 2d 2e 2f
[ 2424.271084] spi-tegra124-slave c260000.spi: TxFIFO[12] 30 31 32 33
[ 2424.271090] spi-tegra124-slave c260000.spi: TxFIFO[13] 34 35 36 37
[ 2424.271096] spi-tegra124-slave c260000.spi: TxFIFO[14] 38 39 3a 3b
[ 2424.271127] spi_master spi1: Before PIO EN
[ 2424.271157] spi_master spi1:   CMD[13f01827]:  Sl M1 CS0 [HHHH] MSB MSb Rx Tx Pa 8b TRANS[00ff003c]:BSY I:255 B:60
                FIFO[00320001]:RxF:0 TxE:50 Err[] RxSTA[E] TxSTA[]DMA[00000000]:    RxTr:0 TxTr:0 B:59
[ 2424.476905] spi_master spi1: @isr
[ 2424.476956] spi_master spi1:   CMD[13f01827]:  Sl M1 CS0 [HHHH] MSB MSb Rx Tx Pa 8b TRANS[40ff003c]:RDY I:255 B:60
                FIFO[07c00004]:RxF:15 TxE:64 Err[] RxSTA[] TxSTA[E]DMA[00000000]:    RxTr:0 TxTr:0 B:59
[ 2424.477108] spi-tegra124-slave c260000.spi: RxFIFO[0] 20 21 06 30
[ 2424.477122] spi-tegra124-slave c260000.spi: RxFIFO[1] 16 55 01 80
[ 2424.477131] spi-tegra124-slave c260000.spi: RxFIFO[2] 01 80 01 80
[ 2424.477138] spi-tegra124-slave c260000.spi: RxFIFO[3] 01 80 01 80
[ 2424.477146] spi-tegra124-slave c260000.spi: RxFIFO[4] 01 80 01 80
[ 2424.477153] spi-tegra124-slave c260000.spi: RxFIFO[5] 01 80 01 80
[ 2424.477160] spi-tegra124-slave c260000.spi: RxFIFO[6] 01 80 01 80
[ 2424.477168] spi-tegra124-slave c260000.spi: RxFIFO[7] 01 80 01 80
[ 2424.477175] spi-tegra124-slave c260000.spi: RxFIFO[8] 01 80 01 80
[ 2424.477182] spi-tegra124-slave c260000.spi: RxFIFO[9] 01 80 01 80
[ 2424.477190] spi-tegra124-slave c260000.spi: RxFIFO[10] 01 80 01 80
[ 2424.477262] spi-tegra124-slave c260000.spi: RxFIFO[11] 01 80 01 80
[ 2424.477270] spi-tegra124-slave c260000.spi: RxFIFO[12] 01 80 01 80
[ 2424.477287] spi-tegra124-slave c260000.spi: RxFIFO[13] 01 80 00 66
[ 2424.477313] spi-tegra124-slave c260000.spi: RxFIFO[14] 31 8c 61 80
[ 2424.477323] spi-tegra124-slave c260000.spi: Profile: size=60B time-from-spi-int=343761ns

I think your connect test isn’t about the loopback test.
Does the receive data is correct?
Could you try below command and issue FPGA to send data to try.

sudo ./spidev_test -D /dev/spidev1.0 -s8000000 -g60 -b8 -H -p0 -n1 -r

Hi shaneCCC
1: yes now ,i receive data is correct
2:i try the below command

root@dev-desktop:~/lab# ./spidev_test_shaneCCC -D /dev/spidev1.0 -s12500000 -g60 -b8 -H -p0 -n1 -r
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
root@dev-desktop:~/lab#

root@dev-desktop:~/lab# ./spidev_test_shaneCCC -D /dev/spidev1.0 -s12500000 -g60 -b8 -H -p0 -n1 -r -zzz
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: 8 bytes per word: 1
max speed: 12500000 Hz (12500 KHz)
no. runs: 1
Using seed:0x6114aef4
loop count = 0
transfer: Return actual transfer length: 60
receive bytes [60]
0000: 20 21 06 30 16 55 01 80 01 80 01 80 01 80 01 80
0010: 01 80 01 80 01 80 01 80 01 80 01 80 01 80 01 80
0020: 01 80 01 80 01 80 01 80 01 80 01 80 01 80 01 80
0030: 01 80 01 80 01 80 00 66 31 8C 61 80
mismatch index 0
^^^ 20 21 06 30 16 55 01 80 01 80 01 transfer: received packet size:60 len:60 stat:-6
/dev/spidev1.0: TEST FAILED !!!!! (status:-1)
====== Transfer stats ====
Receive:
       total: 60B (0KiB 0MiB)
       total: 1P
        good: 0B (0KiB 0MiB)
        good: 0P
       ioerr: 0P
     dataerr: 1P
 Rate:
        good: -1B/s (0KB/s)
        good: -1P/s
 packet drop: -1/10000

  Total time: 0.040154s

3: i want to write a spidev_test.c 's demo
now in app i use the ioctl(fd, SPI_IOC_MESSAGE(1), &tr); ,
it will report error spi_master spi1: failed to transfer one message from queue.

root@dev-desktop:~/lab# ./spidev_test_slave -H
spi mode: 3
bits per word: 8
max speed: 12500000 Hz (12500 KHz)
[ 6999.031380] spi_master spi1: failed to transfer one message from queue

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00

So which ioctl do you use to realize the -r function?

-r for slave device receive data only, didn’t send data.

yes, i know,
i want to know
1: which ioctl you use in transfer
2: case ‘r’: mode |= ?(what), SPI2 only need read

thank you shaneCCC