我正在编程我的 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/