0

I have two Jetson Nano devices that need to exchange data over SPI protocol. It is my first and only project with Jetson Nano, so I am completely new to the SPI or anything regarding low-level coding.

In the project, I want to use Daisy Chain to communicate, for starters I have used only two devices to test the data communication between them.

Using the following link on page 4, I made one a slave. https://www.nxp.com/files-static/training_pdf/26821_68HC08_SPI_WBT.pdf What it says is that in order to select one device as a slave you need to connect SS to ground to make it low. So I have connected pin 24 (SPI_1_CS0) to pin 20 which is ground. For the master, I have put pin 24 (SPI_1_CS0) to pin 2 (5.0 VDC). I intended to set it high for it to become the master.

I have used /opt/nvidia/jetson-io/jetson-io.py to configure the pins. After running sudo modprobe spidev the pins were configured.

Output of ls /dev/spi* is

/dev/spidev0.0 /dev/spidev0.1 /dev/spidev1.0 /dev/spidev1.1

After running the following code on the slave I received useless data. Since slave mode should have been activated, I should not be able to read data unless Master is sending some.

import spidev
import time

spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 250000

def read_spi(channel):
  spidata = spi.xfer2([0,(8+channel)<<4,0])
  return ((spidata[1] & 3) << 8) + spidata[2]

def readData():
    spidata = spi.readbytes(8)
    return spidata


try:
  while True:
    #channelData = read_spi(0)
    channelData = readData()
    print (channelData)
    time.sleep(.1)

except KeyboardInterrupt:
  spi.close()

channelData can be received with the other function. But it does not make the result any different.

[20, 206, 54, 93, 19, 151, 211, 199]
[84, 10, 89, 184, 126, 82, 49, 78]
[189, 32, 110, 143, 231, 226, 76, 116]
[102, 56, 174, 123, 186, 145, 148, 161]
[105, 254, 152, 155, 88, 147, 191, 174]
[38, 221, 219, 179, 161, 102, 107, 31]
[101, 141, 98, 80, 20, 254, 25, 50]
[88, 0, 0, 44, 197, 73, 32, 49]
[107, 60, 44, 230, 91, 56, 172, 4]
[21, 156, 120, 165, 99, 137, 245, 204]
[15, 34, 164, 215, 255, 187, 34, 86]
[18, 215, 67, 227, 234, 1, 237, 142]
[71, 124, 36, 238, 86, 240, 105, 189]
[29, 27, 63, 232, 239, 40, 189, 61]
[5, 217, 209, 14, 96, 24, 181, 97]
[158, 121, 125, 93, 224, 125, 97, 129]
[75, 92, 95, 183, 47, 14, 111, 164]

Do I need more configuration to be done if I want to make one a slave or am I doing something wrong with the coding?

Any links or code example is appreciated.

1 Answers1

0

Do you use Nvidia Jetson Nano custom board? Or custom board from other vendor? If you are using Nano devkit, please see the pin out below:

enter image description here

Picture is from this website.

spidev node location correction.

There are 2 SPI channels: SPI0 and SPI1. Interesting thing is SPI0 is located at /dev/spidev1 and SPI1 is at /dev/spidev2.x. Please see their device tree setting. Depends on how you wire SPI, if you are using SPI0 and CS/SS is connected to Pin24, use /dev/spidev1.0; if CS/SS is connected pin 26, use /dev/spidev1.1 instead.

device tree correction

Do you have a chance to modify your device tree? If you are certain of the wire connection correctness , then check device tree setting. As I know, Jetson Nano is not allowed to change SPI slave by any command. The only way is tweak the device tree.

I found a possible solution on github. See here

cwyark
  • 26
  • 2
  • I was able to modify the device tree. Do you know about spidev library? Although I did try different configurations I keep reading random data. – Çağlar Yıldız Aug 03 '22 at 06:50
  • Can you try "no cs" mode on both SPI side? (https://github.com/doceme/py-spidev/blob/a5d82b88bd1c95c9f9ec46e9f7afe08c3323e625/spidev_module.c#L1296) CS pin is active low, not sure if your CS pin has the correct behavior. – cwyark Aug 03 '22 at 08:01
  • I don't know how c works. From what I can understand is I will add the following snippet ```spi.no_cs = True # or false``` – Çağlar Yıldız Aug 05 '22 at 13:00