打印
[学习资料]

疏忽使用 spi_transfer,导致spi 读取回来的都是0

[复制链接]
627|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-11-15 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、出现的问题
自己封装了一个 spi 读写函数,程序可以运行,但是读取回来的数据都是0.

static void icm20608_spi_rw( uint8_t tx_buf[], uint8_t rx_buf[], uint32_t len )
{
    struct spi_message  msg = {0};
    struct spi_transfer spi_t  ;

    spi_t.tx_buf = tx_buf;
    spi_t.rx_buf = rx_buf;
    spi_t.len = len;

    spi_message_init( &msg );
    spi_message_add_tail( &spi_t, &msg );
    spi_sync( g_dev.spi, &msg );

}


spi 传输需要的tx_buf 和 rx_buf 都通过外部函数传进来,而不是在读写函数内部分配空间。

二. 问题分析
2.1 教程或者网上比较常见的写法
参考了其他人的写法,区别在于:spi_transfer 变量是在栈里面分配还是堆里面分配。

struct spi_transfer *t;
t = kzalloc( sizeof( struct spi_transfer ), GFP_KERNEL ); /* 申请内存 */


2.2 我的理解
函数后面调用的spi_sync ,进行的是同步传输,函数传输完之后,spi_transfer 生命周期结束。无论是静态定义 spi_transfer 还是 动态分配,作用都是一样的。

三. 问题解决
查看了spi_transfer 的定义,发现除了代码中初始化的 tx_buf, rx_buf, len , 还有一堆成员变量未初始化,在栈内分配的结构体变量,未明确初始化的变量,值都是随机的。究竟哪个变量的值异常导致通信出错,暂时未知。

定义变量的时候,顺便将变量初始化为0 即可

struct spi_transfer spi_t = {0};


kzalloc 分配内存的时候,已经将内存初始化为0,所以不存在这个问题。
————————————————
版权声明:本文为CSDN博主「gdut_llkkyy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gdut_liujiangyi/article/details/129315824

使用特权

评论回复
沙发
Jacquetry| | 2023-11-20 10:38 | 只看该作者
随机变量的问题啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1383

主题

14108

帖子

8

粉丝