一、出现的问题
自己封装了一个 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
|