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

一、出现的问题

自己封装了一个 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_bufrx_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,所以不存在这个问题。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdut_llkkyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值