如何解决尝试选择 i2c 地址会引发 ioctl failed: invalid argument
我正在用 Common Lisp 构建一个程序,该程序使用树莓派 3B+ 上的 sysfs 通过 i2c 与 pca9685 通信。
初始化设备时,我需要使用(ioctl fd +i2c-slave+ addr)
where +i2c-slave+ = xf0703
(选择slave的命令)和addr = 0x40
(对于pca9685)来选择pca
但是从电话中我得到一个错误:
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))
我正在使用 cl-spidev 中的 ioctl 实现。
由于我在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 函数正在传递一个指针,虽然它应该是一个普通的 long(根据 the docs),但我仍然无法完全理解它。我是否遗漏了一些明显的东西?
Adafruit python 库和 some 示例 C 实现的工作方式相同。
注意事项
- 也试过
I2C_SLAVE_FORCE
,结果一样。 - 如何将整数作为值传递给外部调用?可能吗?
-
i2cdetect
确认#x40
上有设备,成功读取i2cget
的一些寄存器。
解决方法
您的假设是正确的,您正在使用的这个包装函数调用 ioctl
并带有指向您的值而不是值的指针。
您是否尝试过简单的(sb-unix:unix-ioctl fd cl-i2c-lli:+i2c-slave+ addr)
?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。