SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚

SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚

情况说明
Sx1302代码:https://gitee.com/rejeee/gw1302s
NUC980DK61Y内核代码:官方提供的虚拟机镜像包(里面包含linux内核及交叉编译工具链)
SPI引脚使用:
SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚_第1张图片
SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚_第2张图片
如上图可见,使用了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文件。SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚_第3张图片
因此内核代码配置的是使用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片选脚_第4张图片
重新编译后,即可成功连接服务器。
SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚_第5张图片

你可能感兴趣的:(内核,linux,arm9,c语言,嵌入式)