linux下spi读写的时间开销问题。求助!!!

agoodog   2012-11-5 21:39 楼主
板子跑的linux,我在调spi的时候遇到一个问题就是读写外设的寄存器的时间开销太大。
static void
transfer (int fd)
{
  int ret;
  uint8_t tx[] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
    0xF0, 0x0D,
  };
  uint8_t rx[ARRAY_SIZE (tx)] = { 0, };
  struct spi_ioc_transfer tr = {
    .tx_buf = (unsigned long) tx,
    .rx_buf = (unsigned long) rx,
    .len = ARRAY_SIZE (tx),
    .delay_usecs = delay,
    .speed_hz = speed,
    .bits_per_word = bits,
  };

  ret = ioctl (fd, SPI_IOC_MESSAGE (1), &tr);


上面是spi_write函数的大概内容,其中ioctrl的时间开销就很大,读一次spi(一个字节)需要大约50us的时间(spi配置为3Mbps)。

是有点长,有什么方法可以提高spi读写的效率?

谢谢!

回复评论 (4)

我也发现太慢

等了44us才从SPI输出时钟,应用层到内核层要判断数据合理性,要拷贝,我后来直接用mmap映射SPI物理地址后,在应用层写寄存器(不符合LINUX推荐办法),延时很短,1us延时,当然数据多时,你连贯发也会因为系统时间片切换而被暂停,比如我试验发送64KBYTES,我用30M时钟,计算大约21ms发完,实际是三个包,每个包最长10ms,包中间隔了10ms被系统切走(忙的话还要更多),所以实际50ms左右传完64KBYTES

[ 本帖最后由 mr.king 于 2012-12-7 19:57 编辑 ]
点赞  2012-12-7 19:50
你好,你用的哪种方式读的spi,能不能贴一部分代码?
点赞  2012-12-7 21:31

回复 板凳 agoodog 的帖子

留QQ,周一上班交流
点赞  2012-12-8 07:32
你用的什么驱动?我用的内核自带的spi驱动。你qq多少?
点赞  2012-12-19 23:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复