使用SPI进行Bit Bang(fwirte,写入性能)

时间:2015-06-11 19:02:25

标签: linux linux-kernel embedded-linux spi bitstream

我有一个 bit bang 代码,允许我通过SPI线路发送4兆的数据。它使用Linux内核为自定义硬件嵌入代码。

问题在于需要花费很长时间才能完成(4小时),这很可能是因为内核正在做更多的事情。基本上我的代码是这样的(aprox):

unsigned char data=0xFF;

BB_SPI_Init();
SPI_start();//activates chipselect(enable)

for(i=0;i<8;i++){
    if(data & 0x80){
        gpio_set_value(SPI_MOSI,1);
    }else{
        gpio_set_value(SPI_MOSI,0);
    }
    //send pulse clock
    gpio_set_value(SPI_CLK,0);
    gpio_set_value(SPI_CLK,1);
    data<<=1;
}
SPI_stop();//deactivates chipselect(disable)

所以这是一个非常简单的位爆炸,但我注意到如果我使用write将数据发送到linux gpio处理程序/sys/class/gpio/gpioXX/value(其中XX是任何gpio编号),则需要4个小时。 但如果我使用fwrite()发送到同一台设备则需要3个小时。 但是,如果您仅将write()用于启用(SPI_stop()和SPI _ start())和fwrite()以发送到MISO,那么它只需要1小时30分钟。

所以,以此作为基础,有人可以向我解释这是怎么回事?我的想象力说是线程的处理方式,并且在每个软件周期中它都会解析2个线程(fwrite()write())而不是只使用其中一个函数,但现在我还在调查有人能让我知道任何信息吗?有没有更好的方法来解决这个问题?

FYI 无法使用内核驱动程序spi,因为硬件连接到gpios并且强制要求使用bit bang但我接受任何建议

提前致谢

修改

嘿伙计感谢您的评论,似乎我有一个问题(非常愚蠢)我每次创建文件描述符时都要将数据发送到sys/class/gpio/gpioxx/value,这就是为什么这么慢。同时关闭一些其他程序和转移冲程到3分钟而不是1小时30分钟(写())。谢谢,抱歉,

1 个答案:

答案 0 :(得分:4)

如果您正在寻找性能,我认为 spi-bitbang 驱动程序是最佳解决方案。从用户空间进行比特操作是一件很痛苦的事情,因为每个数据位至少有3个系统调用。系统调用是一项昂贵的操作。

  

FYI无法使用内核驱动程序spi,因为硬件已连接到gpios,并且强制要求使用bit bang但我接受任何建议

这就是 spi-bitbang 驱动程序存在的原因。您可以轻松配置 spi-bitbang 驱动程序以使用您的 GPIO。

然后,一旦你有了一个 spi-bitbang 驱动程序,就可以编写一个char设备,接受整个数据块的输入并将其传输到内核空间。使用此解决方案,您将获得最佳性能的爆炸接口。