我正在编程我的 A13-OLinuXino-MICRO使用提供的pyA13 0.2.2SPI驱动程序向LCD发送数据。理想情况下,我希望发送一个包含320*240*2字节(320*240像素,每色16位)的列表,用一个连续的写入命令写入,以提高速度效率。spi.c和spi-lib.c中的驱动程序有一个8bit的tx-len,它限制了我256个字节,所以我将它们修改为32位,这很有效,但是现在当我试图在spi.write(data[:])函数中传递一个长度超过4096个值的列表时,收到一个错误。下面是我用16位纯色填充屏幕的代码:

def FillScreen(c):
    LCD_SetPos(0, 0, 239, 319)
    ch = c>>8 & 0x00FF
    cl = c & 0x00FF
    d =[]
    for x in range (0,76800):
        d += [ch, cl]
   spi.write(d[:])

这是运行函数时出现的错误:
Traceback (most recent call last):
  File "lcd.py", line 205, in <module>
    FillScreen(0x00FF)
  File "lcd.py", line 200, in FillScreen
    spi.write(d[:])
IOError: [Errno 90] Message too long

给我这个错误的代码包含在spi.c中
/* Send data */
    if(spi_write(fd, tx_buffer, tx_len) < 0){
        return PyErr_SetFromErrno(PyExc_IOError);
    }

有什么方法可以将较长的消息传递给spi.write函数吗?我对python很陌生,但对C很熟悉,请简单地使用我的代码。。。另外,我也尝试过循环发送较小的消息来填充屏幕,但这花费了太长时间。任何帮助都将不胜感激。
谢谢,
迈克尔

最佳答案

查看Linux spidev文档中的注释-https://www.kernel.org/doc/Documentation/spi/spidev

- There's a limit on the number of bytes each I/O request can transfer
  to the SPI device.  It defaults to one page, but that can be changed
  using a module parameter.

(你可以用$ getconf PAGESIZE找到你的页面大小-我相信它几乎总是4096字节。)
我还没有测试过,但我认为马克西姆的答案应该为你工作:https://stackoverflow.com/a/16440226/5527382,这是:
解决方案是在/etc/modprobe.d/local.conf中添加以下行:
options spidev bufsiz=<NEEDED BUFFER SIZE>
spidev驱动程序默认为4096字节,然后使用该参数的值覆盖它(如果提供了-https://github.com/beagleboard/linux/blob/4.1/drivers/spi/spidev.c#L92-L94):
static unsigned bufsiz = 4096;
module_param(bufsiz, uint, S_IRUGO);
MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");

将该行放入/etc/modprobe.d/local.conf中应该会在加载spidev模块时将该参数传递给该模块—您需要在进行更改后重新启动以确保重新加载了该模块。

关于python - Python IOError:[Errno 90]消息太长,将长列表传递给SPI函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33791995/

10-10 23:04