SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚
Posted UCSD99
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚相关的知识,希望对你有一定的参考价值。
SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚
情况说明
Sx1302代码:https://gitee.com/rejeee/gw1302s
NUC980DK61Y内核代码:官方提供的虚拟机镜像包(里面包含linux内核及交叉编译工具链)
SPI引脚使用:
如上图可见,使用了NUC980的SPI0口。使能SPI0口后,运行网关程序时,却始终反馈如下错误:
lgw_connect:1230: ERROR: NOT EXPECTED CHIP VERSION (v255)
ERROR: [main] failed to start the concentrator
Cycle 0 > error during the buffer comparison
经示波器检查发现片选脚无电平变化,但我们已经开启了SS0片选功能。仔细排查内核代码后,发现文件:
user@ubuntu:"Youself path"/NUC970_Buildroot-master/output/build/linux-master/arch/arm/mach-nuc980/dev.c
中有这样一段代码:
#ifdef CONFIG_SPI_SPIDEV
{
.modalias = "spidev",
.max_speed_hz = 75000000,
.bus_num = 1,
#if defined(CONFIG_BOARD_IOT) || defined(CONFIG_BOARD_LORAG)
.chip_select = 0, //use SS0
#else
.chip_select = 1, //use SS1
#endif
.mode = SPI_MODE_0,
},
#endif
从#if defined(CONFIG_BOARD_IOT) || defined(CONFIG_BOARD_LORAG)
中我们可以看出,只有当配置文件为IOT与LORAG时,才会使用SS0片选脚。但我们在make menuconfig
时配置的不是这两个文件,而是eth2uart文件。
因此内核代码配置的是使用ss1而不是ss0。
解决方法
在if条件后加上defined(CONFIG_BOARD_ETH2UART)
,即:
#ifdef CONFIG_SPI_SPIDEV
{
.modalias = "spidev",
.max_speed_hz = 75000000,
.bus_num = 1,
#if defined(CONFIG_BOARD_IOT) || defined(CONFIG_BOARD_LORAG) || defined(CONFIG_BOARD_ETH2UART)
.chip_select = 0, //use SS0
#else
.chip_select = 1, //use SS1
#endif
.mode = SPI_MODE_0,
},
#endif
同时通过make linux-menuconfig
进入内核配置界面,在Device Drivers > Memory Technology Device (MTD) support界面下取消SPI-NOR device support配置。
重新编译后,即可成功连接服务器。
以上是关于SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚的主要内容,如果未能解决你的问题,请参考以下文章