代码之家  ›  专栏  ›  技术社区  ›  RecencyEffect

尝试选择i2c地址时抛出ioctl失败:参数无效

  •  0
  • RecencyEffect  · 技术社区  · 4 年前

    我正在用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 .
    0 回复  |  直到 4 年前
        1
  •  1
  •   pjstirling    4 年前

    你的假设是正确的,你正在使用的这个包装器函数调用 ioctl 用指针指向你的值而不是值。

    你试过简单吗 (sb-unix:unix-ioctl fd cl-i2c-lli:+i2c-slave+ addr) ?