你好,我们自己设计的Jetson AGX Orin板载上spi1接口连接了一块adis16465 imu模块,之前在jetpack5.1.2上是正常工作的,但最近我们升级到Jetpack6.2上之后 imu的数据读取出现了问题。/sys/bus/iio/devices/iio下的六轴数据的字段读取的都是异常值,且sampling_frequency无法设置固定频率。
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.497000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.499000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.504000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
-4836039
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
-4279755
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
263455059
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
0
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
-3395523
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
-4466998
我怀疑这可能跟spi驱动有关,并且打了关于spi cs的补丁后并没有正常工作:
@@ -871,6 +883,9 @@
command1 &= ~SPI_CS_SW_VAL;
}
+ tspi->use_hw_based_cs = true;
+ command1 &= ~(SPI_CS_SW_HW | SPI_CS_SW_VAL);
+
if (!tspi->prod_list) {
if (tspi->last_used_cs != spi->chip_select) {
if (cdata && cdata->tx_clk_tap_delay)
我甚至在jetpack6.2上移植了jetpack5.1.2的spi-tegra114驱动但还是有问题,能帮忙看下问题可能跟哪些因素有关吗?
我通过spidev-test 回环测试 spi1发送接收都是正常的。
因为板载不太方便测量spi的接口的数据波形,后续我将想办法飞线测量信号。
Hi zzbsky,
Yes, I would suggest you measuring the signal from scope to check if their level are correct. (1.8V or 3.3V)
Is there any error showing in dmesg?
Please share the full dmesg and device tree for further check.
dmesg没有任何错误:
dmesg.log (72.9 KB)
设备树相对于jetpack5.1.2基本没什么大的变化:
spi@3210000{
status = "okay";
spi-max-frequency = <50000000>;
spi-imu@0 {
status = "okay";
compatible = "adi,adis16465-2";
reg = <0>; /* spi chip select 0 */
spi-max-frequency = <2000000>;
spi-cpol;
spi-cpha;
interrupt-parent = <&gpio>;
interrupts = <TEGRA234_MAIN_GPIO(Q, 1) IRQ_TYPE_EDGE_RISING>;
reset-gpios = <&gpio TEGRA234_MAIN_GPIO(M, 3) GPIO_ACTIVE_LOW>;
adi,sync-mode = <0x00>;
//adi,scaled-output-hz = <2000>;
controller-data {
nvidia,enable-hw-based-cs;
nvidia,rx-clk-tap-delay = <0x11>;
nvidia,tx-clk-tap-delay = <0x0>;
};
};
};
用逻辑分析仪测了一下spi的信号,jetpack6.2的CS信号似乎有些不一样
jetpack5.1.2正常:
jetpack6.2:
It looks good to me since CS asserted when there’s CLK output.
It seems there’s valid data received on MISO data line.
What command you used to send to your IMU?
What’s the expected SPI frequency for your IMU module?
是的MISO是有数据输出的,虽然我无法判断数据是否准确;
我加载imu驱动后,imu就会输出数据,虽然输出频率sampling_frequency不是按照我想要设置的100hz输出;
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.497000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.499000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
2000.000000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio:device0/sampling_frequency
0.504000
root@trunk-desktop:/home/trunk# cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
-4836039
ADIS16465模块正常模式下要求的spi sclk为0.1~2MHZ,我在设备树里配置的spi-max-frequency为2MHZ;
Could you refer to Jetson Orin Nano DevKit SPI speed - #5 by KevinFFF to check if it could help for your use case?
You can simply run the following command to verify first.
# echo clk_m > /sys/kernel/debug/bpmp/debug/clk/spi1/parent
1 Like
是有用的,设置完之后确实正常工作了
pllp_out0 对应的频率是3187500,clk_m对应的是多少?
我看了jetpack5.1.2和jetpack6.2底层设备树里spi使用的父时钟频率默认都是TEGRA234_CLK_PLLP_OUT0啊
You can run the following command to check.
$ sudo su
# echo clk_m > /sys/kernel/debug/bpmp/debug/clk/spi1/parent
# grep "" /sys/kernel/debug/bpmp/debug/clk/spi1/*rate
It may be caused from that set_best_clk_source()
has been removed in SPI driver of JP6.