OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8504|回复: 6

imx6ull 的SPI缓存大小问题

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2019-11-30
在线时间
13 小时
发表于 2020-9-29 14:56:56 | 显示全部楼层 |阅读模式
5金钱
为了提高imx6ull的spi传输效率,希望能增加一次收发数据的数量,


- 例如树莓派可以通过在/boot/cmdline.txt中增加spidev.bufsiz=32768从而使得调用一次下面的spi传输函数一次发送32K数据。
- 原子哥的板子,使用spi一次传输4K字节没有问题,但是调用以下函数目前不能一次传输32K字节,有没有类似的地方修改spi的缓存大小呀

int spi_transceive (int fd, uint8_t* tx_dat, uint8_t* rx_dat, uint16_t len)
{
    struct spi_ioc_transfer spi_l;
    memset (&spi_l, 0, sizeof (spi_l)) ;
    memset (rx_dat, 0, len);
    spi_l.tx_buf        = (unsigned long)tx_dat;
    spi_l.rx_buf        = (unsigned long)rx_dat;
    spi_l.len           = len ;
    spi_l.delay_usecs   = 0;
    spi_l.speed_hz      = 500000 ;
    spi_l.bits_per_word = 8 ;
    return ioctl (fd, SPI_IOC_MESSAGE(1), &spi_l) ;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2020-10-2 23:59:06 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-8-13
在线时间
2 小时
发表于 2020-10-5 11:50:30 | 显示全部楼层
请问楼主解决这个问题了吗?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-8-13
在线时间
2 小时
发表于 2020-10-5 11:52:39 | 显示全部楼层
楼主你spi_transceive这个函数中调用的ioctl (fd, SPI_IOC_MESSAGE(1), &spi_l)函数是你自己根据spidev驱动写的吗?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2019-11-30
在线时间
13 小时
 楼主| 发表于 2020-10-9 11:21:45 | 显示全部楼层
ioctl()不是我写的,是linux的
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2019-11-30
在线时间
13 小时
 楼主| 发表于 2020-11-4 09:16:04 | 显示全部楼层
目前未找到直接增大缓存的方法
抛砖引玉,在不过于考虑执行效率的情况下,本人使用以下的函数来传输32K以下的数据的接收。

int spi_transceive_32k (int fd, uint8_t* tx_dat, uint8_t* rx_dat, uint16_t len)
{
    struct spi_ioc_transfer spi_l = {0};
    int res_l;
    uint16_t ofs_l = 0;
    while (len > 4096)
    {
        memset (&spi_l, 0, sizeof (spi_l)) ;
        memset (&rx_dat[ofs_l], 0, 4096);
        spi_l.tx_buf        = (unsigned long)(&tx_dat[ofs_l]);
        spi_l.rx_buf        = (unsigned long)(&rx_dat[ofs_l]);
        spi_l.len           = 4096 ;
        spi_l.delay_usecs   = 0;
        spi_l.speed_hz      = 10000000 ;
        spi_l.bits_per_word = 8 ;
        res_l = ioctl (fd, SPI_IOC_MESSAGE(1), &spi_l) ;
        ofs_l = ofs_l + 4096;
        len = len - 4096;
    }

        spi_l.tx_buf        = (unsigned long)(&tx_dat[ofs_l]);
        spi_l.rx_buf        = (unsigned long)(&rx_dat[ofs_l]);
        spi_l.len           = len ;
        spi_l.delay_usecs   = 0;
        spi_l.speed_hz      =10000000 ;
        spi_l.bits_per_word = 8 ;
        res_l = ioctl (fd, SPI_IOC_MESSAGE(1), &spi_l) ;
    return res_l;
}
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-4-6
在线时间
1 小时
发表于 2021-6-10 14:19:01 | 显示全部楼层
提示下,SPI_IOC_MESSAGE(1)这里的1可以设置成其他值,表示transfer的次数,.len表示一次transfer数据的长度。。。
我试出来的结果是.len最大可设成64,不知道楼主为啥能设成4096,求教~~
而SPI_IOC_MESSAGE(n),n=2的时候是没问题的,此时你需要把spi_ioc_transfer定义成一个数组,像这样 struct spi_ioc_transfer spi_l[2];,然后用memset初始未0,或者在定义的时候就进行赋值。。这样的话,定义一个长度的8的数组,里面每个成员传4096,差不多够32k了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表