闪存和tft LCD共享SPI硬件的问题

闪存和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打印时,在闪存上传输某些数据(使用其他脚本或应

我使用的是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上发送数据的功能代码

    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线,以便内核知道如何多路传输消息盖斯。