我正在用Common Lisp构建一个程序,该程序通过i2c在覆盆子pi 3B+上使用sysfs与pca9685通信。
初始化设备时,我需要使用以下命令选择pca
(ioctl fd +i2c-slave+ addr)
哪里
+i2c-slave+ = xf0703
(选择从属命令)和
addr = 0x40
(适用于pca9685)
然而,在通话中,我收到了一个错误:
IOCTL 1795 failed: Invalid argument
[Condition of type SIMPLE-ERROR]
0: ((SETF I2C::IOCTL) 64 10 1795)
1: (I2C:I2C-START #S(I2C:I2C-DEV :FILENAME "/dev/i2c-1" :DEV 1 :ADDR 64))
我正在使用来自的ioctl实现
cl-spidev
.
由于我在sbcl上,相关函数是
(defun (setf ioctl) (arg fd cmd)
(sb-alien:with-alien ((value sb-alien:int))
(setf value arg)
(multiple-value-bind (wonp error)
(sb-unix:unix-ioctl (stream-fd fd)
(if (< cmd (expt 2 31)) cmd (- cmd (expt 2 32)))
(sb-alien:alien-sap (sb-alien:addr value)))
(unless wonp
(error "IOCTL ~a failed: ~a" cmd (sb-impl::strerror error))))
arg))
它的名字是这样的
(setf (ioctl fd cl-i2c-lli:+i2c-slave+) addr)
我目前的猜测是ioctl函数正在传递一个指针,而它应该是一个普通的长指针(根据
the docs
),但我仍然无法完全理解。我错过了什么明显的东西吗?
Adafruit python库,以及
some
示例C实现以相同的方式工作。
笔记
-
也试过了
I2C_SLAVE_FORCE
,并得到了相同的结果。
-
如何将整数作为值传递给外部调用?有可能吗?
-
i2cdetect
确认有设备打开
#x40
,成功读取了一些寄存器
i2cget
.