闪存和tft LCD共享SPI硬件的问题
我使用的是TFT LCD屏幕(ILI9163c),该屏幕通过spi引脚与athros AR9331模块相连。Athros AR9331使用OpenWRT linux发行版运行。因此,我正在使用我的C应用程序代码用spidev0.1驱动我的LCD Athros AR9331板使用相同的SPI引脚驱动板上的闪存,这是从内核处理的。 我为LCD设置了单独的芯片选择引脚,通过从代码中将其设置为高低,从而为LCD提供适当的数据识别,但有时在从我的代码进行LCD打印时,在闪存上传输某些数据(使用其他脚本或应用程序)时,LCD屏幕仍会受到垃圾的影响 我有控制LCD芯片从代码中选择,但不为闪存。所以在这种情况下,当flash和LCD的操作同时进行时,我应该如何处理这种情况呢 这是我使用SPIdev0.1在LCD上发送数据的功能代码闪存和tft LCD共享SPI硬件的问题,c,linux-device-driver,embedded-linux,openwrt,spi,C,Linux Device Driver,Embedded Linux,Openwrt,Spi,我使用的是TFT LCD屏幕(ILI9163c),该屏幕通过spi引脚与athros AR9331模块相连。Athros AR9331使用OpenWRT linux发行版运行。因此,我正在使用我的C应用程序代码用spidev0.1驱动我的LCD Athros AR9331板使用相同的SPI引脚驱动板上的闪存,这是从内核处理的。 我为LCD设置了单独的芯片选择引脚,通过从代码中将其设置为高低,从而为LCD提供适当的数据识别,但有时在从我的代码进行LCD打印时,在闪存上传输某些数据(使用其他脚本或应
void spi_transactor(unsigned int wlength,
unsigned int rlength,
const unsigned char write_data,
int mode)
{
int ret;
struct spi_ioc_transfer xfer[4];
unsigned char init_reg[1];
init_reg[0] = write_data;
if (mode)
{
gpio_set_value(_rs, 1); // DATA
}
else
{
gpio_set_value(_rs, 0); // COMMAND
}
memset(xfer, 0, sizeof xfer);
xfer[0].bits_per_word = 8;
xfer[0].tx_buf = (unsigned long) &init_reg[0];
xfer[0].rx_buf = 0; //( unsigned long ) &buf_rx[0];
xfer[0].len = wlength + rlength;
xfer[0].delay_usecs = 0;
xfer[0].speed_hz = speedx;
//xfer[0].speed_hz = 40000000; // 40MHZ
gpio_set_value(_CS, 0); // SET ChipSELECT LOW
ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &xfer);
gpio_set_value(_CS, 1); // SET ChipSELECT HIGH
(void) ret;
//DEBUG_PRINT("%d\n",ret);
//if (ret <= 0) ;
//DEBUG_PRINT("ERROR: %s\n", strerror(errno));
}
void spi\U交易人(未签名整数长度,
无符号整数长度,
常量无符号字符写入数据,
int模式)
{
int ret;
结构spi_ioc_transfer xfer[4];
无符号字符init_reg[1];
init_reg[0]=写入_数据;
如果(模式)
{
gpio_设置_值(_rs,1);//数据
}
其他的
{
gpio_设置_值(_rs,0);//命令
}
memset(xfer,0,xfer的大小);
xfer[0]。每个字的位=8;
xfer[0].tx_buf=(无符号长)和init_reg[0];
xfer[0].rx_buf=0;/(无符号长)和buf_rx[0];
xfer[0]。len=wlength+rlength;
xfer[0]。延迟\u usecs=0;
xfer[0]。速度_hz=speedx;
//xfer[0]。速度_hz=40000000;//40MHZ
gpio_设置_值(_CS,0);//设置芯片选择低
ret=ioctl(spi\U fd、spi\U IOC\U消息(1)和xfer);
gpio_设置_值(_CS,1);//设置芯片选择高
(无效)ret;
//调试\u打印(“%d\n”,ret);
//如果(ret我发现了类似的东西,这里
刚刚从spi驱动程序将通用GPIO引脚注册为LCD的CS1,最后我解决了我的问题。
谢谢@A.K,@user694733很明显,您不能在同一条总线上同时使用这两种设备。您在“当flash和LCD的操作都并行时,我应该如何处理这种情况”中所说的并行是什么意思?@user694733在我的设备中,多个脚本和代码在后台运行(即系统日志、证书更新脚本、FW更新脚本等)从启动开始。这段代码在随机时间将数据写入闪存。因此,当我在显示器上打印一些图像时,问题发生了,同时数据从其中一个脚本传输到闪存文件中。这听起来更像是正常的并发问题,而不是任何特定于硬件的问题。您可以用任何其他共享资源替换SPI,这将ecome泛型问题。我对嵌入式Linux了解不够,无法回答,但我猜提供资源锁定/共享(如互斥锁、信号量和队列)的普通线程工具是您所需要的。@Logan859:请显示写入spidev设备的代码。特别是,如何驱动CS线以及哪个内核接口用于传输。“我在LCD芯片上有从代码中选择的控制权”-我认为这是问题所在。您应该在spi设备中配置CS线,以便内核知道如何多路传输消息盖斯。