Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LoRa
nuc980
SPI
【NK-980评测】SPI功能测试及其LoRa模块驱动
发布于 2022-03-31 19:53:57 浏览:1733
订阅该版
[tocm] # 1 前言 本文主要描述了NUC980 SPI外设,及基于NK-980IoT开发板(SPI0外设)进行LoRa SPI模块的通信验证。 NK-980IOT开发板常用 板载资源 如下: - 处理器:NUC980DK61Y - 主频 300MHz - 内嵌 64MB DDR SDRAM - 板载资源: - 1Gbit SPI-NAND Flash、NAU8822 Audio Codec - 常用外设 - LED:3 个 - 用户按键:2 个 - 复位按键:1个 - 常用接口:Arduino、USB 转串口、RJ-45 接口、1xUSB host 2.0、1xUSB Dual-role 2.0、Micro SD。 - 调试接口:外挂 J-link 调试 或 使用 NuWriter 烧录软件、SDRAM 下载。 - 开发板更多详细信息请参考 [Nuvoton Direct](https://direct.nuvoton.com/tw/numaker-iiot-nuc980)。 2 NCU980 SPI简述 NCU980 SPI具有如下特点: - 支持2路SPI - SPI0,SPI1 - 支持主机与从机模式 - 主机模式支持高达100M, - 从机模式支持高达30M - 支持8~32 bit字长 - 支持4-level depth发送与接收FIFO - 支持PDMA传输 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/5d5511a1eaaaaefaae14d40365844105.png.webp) ## 2.1 NK-980IOT开发板SPI接口 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/35896a4eae9f4b28b1a1859b46b0aa33.png.webp) - NK-980IoT - JTAG接口 - SPI0 - UART0 - 串口shell - SX1278 SPI模块 - VCC、GND、SI、SO、SCK、RESET、CS、DIO0 ### 2.1.1 板载SPI0接口(位号NU5) ![image.png](https://oss-club.rt-thread.org/uploads/20220331/455366f74612cda38c4e8e764c16f15c.png.webp) 板载SPI0接口 ### 2.1.2 板载Arduino接口 SPI1(位号NU1、NU2、NU3、NU4) 注: Arduino接口的SPI1接口连接到了JTAG,因此不能同时使用arduino接口SPI1与JTAG调试。 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/9d1892c053ccb511b97b3cfd90c6274e.png.webp) 板载SPI1接口 ## 2.2 SPI外设引脚分配 通过设置寄存器 SYS_GPx_MFPH、SYS_GPx_MFPL (x=A\B\C\D..)来设置指定SPI外设引脚 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/87bdeab38d8449e2b42d8a6308d2f6c0.png.webp) ### 2.2.1 SPI0外设引脚设置 NUC980 SPI0引脚第二功能设置 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/9dfee83b510c94b93dd7b442a42ebadc.png.webp) 板载SPI0接口(位号NU5)使用了PD8、PD9、PD10、PD11,其对应为MFP1,同时默认配置为4线SPI(硬件CS控制),此处修改为软件控制CS,因此REG_SYS_GPD_MFPH设置为 0x00001110,即 - MFP_GPD8 = 0 - MFP_GPD9 = 1 - MFP_GPD10 = 1 - MFP_GPD11 = 1 ``` //nu_pin_init.c static void nu_pin_spi_init(void) { /* SPI0: PD[9, 11] ,PD8设置普通IO */ outpw(REG_SYS_GPD_MFPH, (inpw(REG_SYS_GPD_MFPH) & ~0x0000FFFF) | 0x00001110); } ``` # 3 NUC980 BSP使用 ## 3.1 开发工具 - RT-Thread Studio 2.2.1 - MDK5.30 - NK-980IoT BSP ## 3.2 调试接口(JTAG) ![image.png](https://oss-club.rt-thread.org/uploads/20220331/7825aa698291c2cb431696dc5b7a20a4.png.webp) # 4 NUC980 LoRa通信 ## 4.1 NK-980 LoRa SPI模块SX127x硬件连接 本次测试使用NK-980开发板的SPI0接口(NU05),当前测试了LoRa SX127x模块。 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/902eec50f453d9abbccf44685f33d7d3.png) ## 4.2 LoRa Radio软件包使用 使能lora-radio软件包,配置如下所示 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/93e043daabd428c7f08b1f750427050d.png.webp) “硬件”使能SPI0外设 ![image.png](https://oss-club.rt-thread.org/uploads/20220331/df8ea31f59e3214079a2061a582803fd.png.webp) 当前lora-radio-driver软件包还未增加NK-980支持(后续加入),目前需要进行如下修改 ### 4.2.1 新增加 rt_hw_spi_device_attach 在libraries\\nuc980\\rtt_port\\drv_spi.c 新增加rt_hw_spi_device_attach,同时传入SPI CS引脚,用于通过软件方式控制lora模块CS引脚,见PR ``` //drv_spi.c /** * Attach the spi device to SPI bus, this function must be used after initialization. */ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_base_t pin) { RT_ASSERT(bus_name != RT_NULL); RT_ASSERT(device_name != RT_NULL); rt_err_t ret = RT_EOK; struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); RT_ASSERT(spi_device != RT_NULL); struct nu_spi_cs *cs_pin = (struct nu_spi_cs *)rt_malloc(sizeof(struct nu_spi_cs)); RT_ASSERT(cs_pin != RT_NULL); cs_pin->pin = pin; rt_pin_mode(pin, PIN_MODE_OUTPUT); rt_pin_write(pin, PIN_HIGH); ret = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); if (ret != RT_EOK) { LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, ret); } RT_ASSERT(ret == RT_EOK); LOG_D("%s attach to %s done", device_name, bus_name); return ret; } ``` ### 4.2.2 重定义lora模块gpio口 修改lora-radio-driver软件包中sx1278-board.c,手动增加 lora模块SPI NSS、RESET、DIO0引脚定义 注 #define NU_GET_PININDEX(port, pin) ((port)*16+(pin)) ``` //sx1278-board.c #include
#ifndef LORA_RADIO0_NSS_PIN #define LORA_RADIO0_NSS_PIN NU_GET_PININDEX(NU_PD,8) #endif #ifndef LORA_RADIO0_RESET_PIN #define LORA_RADIO0_RESET_PIN NU_GET_PININDEX(NU_PF,8) #endif #ifndef LORA_RADIO0_DIO0_PIN #define LORA_RADIO0_DIO0_PIN NU_GET_PININDEX(NU_PF,7) #endif ``` 注意nk-980iot bsp默认开启了PF7,PF8为pwm输出,这里用作LoRa模块的RESET、DIO0,因此要屏蔽如下部分 ``` static void nu_pin_pwm_init(void) { /* PWM02, PWM03: PF[7, 8] */ //outpw(REG_SYS_GPF_MFPL, (inpw(REG_SYS_GPF_MFPL) & ~0xF0000000) | 0x40000000); //outpw(REG_SYS_GPF_MFPH, (inpw(REG_SYS_GPF_MFPH) & ~0x0000000F) | 0x00000004); } ``` ### 4.2.3 绑定lora设备到spi0总线 修改lora-radio-driver软件包中lora-spi-board.c,绑定lora-radio设备与LORA_RADIO0_NSS_PIN到spi0总线 ``` //lora-spi-board.c struct rt_spi_device *lora_radio_spi_init(const char *bus_name, const char *lora_device_name, uint8_t param) { rt_err_t res; struct rt_spi_device *lora_radio_spi_device; RT_ASSERT(bus_name); // ... res = rt_hw_spi_device_attach( bus_name, lora_device_name, LORA_RADIO0_NSS_PIN); //..... } ``` ### 4.2.3 更新nu_spi_bus_xfer 注意如果使用RT-Thread Studio 2.2.1,RT-Thread内核默认当前是4.0.3版本,\libraries\nuc980\rtt_port\drv_spi.c 非master最新代码,不支持由用户软件控制SPI CS,需更新如下 ``` static rt_uint32_t nu_spi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message) { struct nu_spi *spi_bus; struct rt_spi_configuration *configuration; uint8_t bytes_per_word; void *pvUserData; RT_ASSERT(device != RT_NULL); RT_ASSERT(device->bus != RT_NULL); RT_ASSERT(message != RT_NULL); spi_bus = (struct nu_spi *) device->bus; configuration = (struct rt_spi_configuration *)&spi_bus->configuration; bytes_per_word = configuration->data_width / 8; pvUserData = device->parent.user_data; if ((message->length % bytes_per_word) != 0) { /* Say bye. */ LOG_E("%s: error payload length(%d%%%d != 0).\n", spi_bus->name, message->length, bytes_per_word); return 0; } if (message->length > 0) { if (message->cs_take && !(configuration->mode & RT_SPI_NO_CS)) { if (pvUserData != RT_NULL) // 软件控制SPI CS引脚 { if (configuration->mode & RT_SPI_CS_HIGH) { // set to HIGH */ rt_pin_write(*((rt_base_t *)pvUserData), PIN_HIGH); } else { // set to LOW */ rt_pin_write(*((rt_base_t *)pvUserData), PIN_LOW); } } else { if (configuration->mode & RT_SPI_CS_HIGH) { SPI_SET_SS_HIGH(spi_bus->spi_base); } else { SPI_SET_SS_LOW(spi_bus->spi_base); } } } nu_spi_transfer(spi_bus, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length, bytes_per_word); if (message->cs_release && !(configuration->mode & RT_SPI_NO_CS)) { if (pvUserData != RT_NULL)// 软件控制SPI CS引脚 { if (configuration->mode & RT_SPI_CS_HIGH) { // set to LOW */ rt_pin_write(*((rt_base_t *)pvUserData), PIN_LOW); } else { // set to HIGH */ rt_pin_write(*((rt_base_t *)pvUserData), PIN_HIGH); } } else { if (configuration->mode & RT_SPI_CS_HIGH) { SPI_SET_SS_LOW(spi_bus->spi_base); } else { SPI_SET_SS_HIGH(spi_bus->spi_base); } } } } return message->length; } ``` ## 4.3 测试结果 ![nk-980-lora-ping-sf7-4703.gif](https://oss-club.rt-thread.org/uploads/20220331/04660dca4f37f40032fa779db7102ab1.gif) - 测试过程如下 - 左侧为NK-980 + LoRa SX1278模块,作为master - 首先执行lora probe - 检测lora模块spi是否访问正常 - 执行 lora ping -m 发送lora数据包给从机,等待从机应答 - 右侧为STM32L4 + LoRa SX1268模块,作为slaver - 执行 lora ping -s - 接收到master数据包后,回传给master # 5 注意事项 1. Arduino接口的SPI1接口连接到了JTAG,因此不能同时使用arduino接口SPI1与JTAG调试。 2. JTAG连接线不能太长,否则可能出现debug异常 3. 使用外设功能引脚,注意根据实际引脚配置MFP功能,比如SPI0 MOSI-> PD.10 -> MFP1 a. NK-980引脚初始化配置位于nu_pin_init.c # 6 示例代码 基于RT-Thread Studio 2.2.1 测试代码 https://gitee.com/forest-rain/nk-980iot-lora-radio
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ForestRain
这家伙很懒,什么也没写!
文章
12
回答
12
被采纳
5
关注TA
发私信
相关文章
1
BBB的SPI驱动
2
求个SPI上挂两个或多个设备的使用例子
3
SPI设备有个bug
4
spi flash 的fatfs使用一段时间后读写文件出现故障
5
SPI驱动
6
请教rt_spi_configure函数理解
7
SPI FLASH挂载的问题
8
SPI-FLASH 文件系统 SPIFFS
9
求助一个完整的 spi flash 驱动
10
关于同时使用文件系统与SPI FLASH的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
三世执戟
7
个答案
1
次被采纳
KunYi
5
个答案
1
次被采纳
RTT_逍遥
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
JonasWen
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部