Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Numaker-IoT-M487
SPI
Nuvoton M487USCI之USPI通讯
发布于 2022-04-28 18:56:02 浏览:578
订阅该版
前面做了USCI的UUART和UI2C的通讯测试,本例程测试USPI的输出功能。 疫情被隔离在家,手上只有M487和STM32F769NI两块开发板,没有SPI接口设备,用STM32F769NI开发板做SPI从设备与M487的USPI进行通讯。M487开发板作为主机,发送固定长度的数据给STM32F769NI开发。 **创建工程** 创建一个名为uspi的rtthread项目,项目创建完成后打开“RT-Thread Settings”,点击右侧“<<”按钮,选择“硬件”,使能“USCI”,使能“USCI0”,在“Select USCI0 function mode”右侧的下拉框中选择“USPI0”选项;配置完成后更新软件包。 **引脚选择和配置** USCI各个引脚和SPI映射关系 ![image.png](https://oss-club.rt-thread.org/uploads/20220428/0f103c5dd4e0c28919caac7d4b0df86f.png) 引脚选择 ![image.png](https://oss-club.rt-thread.org/uploads/20220428/c12f7129e63bebb0520be0ef2dcb43ab.png.webp) 接下来配置USPI的引脚,选用M487的PA.9、PA.10和PA.11作为USPI的DAT1、DAT0和CLK,打开nutool_pincfg.c(路径 board->NupinConfig->nutool_pincfg.c)在nutool_pincfg_deinit_usb函数后面添加以下代码 ``` void nutool_pincfg_init_usci0(void) { SYS->GPA_MFPH &= ~( SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk|SYS_GPA_MFPH_PA11MFP_Msk); SYS->GPA_MFPH |= ( SYS_GPA_MFPH_PA9MFP_USCI0_DAT1 | SYS_GPA_MFPH_PA10MFP_USCI0_DAT0|SYS_GPA_MFPH_PA11MFP_USCI0_CLK); return ; } void nutool_pincfg_deinit_usci0(void) { SYS->GPA_MFPH &= ~( SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk|SYS_GPA_MFPH_PA11MFP_Msk); return ; } ``` 将上面两个函数分别添加到nutool_pincfg_init和nutool_pincfg_deinit中。 **硬件连接** 引脚对应 USCI标识----IO引脚标识----对应功能----板载丝印 USCI_CLK-----PA.9----------CLK---------SS USCI_DAT0----PA.10---------MOSI--------CLK USCI_DAT1----PA.11---------MISO--------MISO ![image.png](https://oss-club.rt-thread.org/uploads/20220428/953c36d8d56e958036fe6b500213c6ad.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220428/44c0ae82f8035ecfde1870bad4a8ae29.png) F7SPI总线选择 ![image.png](https://oss-club.rt-thread.org/uploads/20220428/0450c9a7f89402be671f7f29d6be153f.png.webp) 电路板对应连接 M487-------------F769NI SS----------------D13 CLK---------------D11 MISO--------------D12 GND---------------D10 **启动启动线程** 在application文件夹下面创建一个名为uspi.c源文件,参考官方文档,M487通过SPI总线每5秒发送一次字符串,代码如下 ``` #include "rtthread.h" #include "rtdevice.h" #include "NuMicro.h" #include "drv_gpio.h" #define LEDY NU_GET_PININDEX(NU_PH, 1) static void stm32_write(rt_uint8_t *rec,rt_uint8_t len); static void stm32_read(rt_uint8_t *rec,rt_uint8_t len); #define USPI_BUS_NAME "uspi0" //定义USPI总线 #define STM32_SPI_DEVICE_NAME "uspi00" //挂载USPI总线设备 struct rt_spi_device stm32_f769_ni; static rt_uint8_t reccach[30] = {0}; static rt_uint8_t Slave_write = 0x32; static rt_uint8_t Slave_read = 0x33; static struct rt_spi_message msg1, msg2; int stm32_spi_device_init(void) { rt_err_t res; struct rt_spi_configuration cfg = {0}; rt_pin_mode(LEDY, PIN_MODE_OUTPUT); res = rt_spi_bus_attach_device(&stm32_f769_ni, STM32_SPI_DEVICE_NAME, USPI_BUS_NAME, (void*)RT_NULL); if (res != RT_EOK) { rt_kprintf(" uspi bus attach failed\n"); return RT_ERROR; } else { rt_kprintf(" uspi bus attach ok\n"); stm32_f769_ni.bus->owner = &stm32_f769_ni; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB ; cfg.max_hz = 1000000; rt_spi_configure(&stm32_f769_ni, &cfg); return RT_EOK; } } void uspi_thread_entry(void *arc) { stm32_spi_device_init(); while(1) { rt_pin_write(LEDY, !rt_pin_read(LEDY)); stm32_write(reccach,29); rt_thread_delay(5000); } } int run_uspi(void) { rt_thread_t tid = RT_NULL; rt_memset(reccach, 0x36, 27); rt_memcpy(reccach+27, "\r\n", 2); rt_thread_delay(1000); tid = rt_thread_create("uspi_thd", uspi_thread_entry, RT_NULL, 2048, 6, 10); if (tid != RT_NULL) { rt_thread_startup(tid); } else { return RT_ERROR; } return RT_EOK; } static void stm32_read(rt_uint8_t *rec,rt_uint8_t len) { msg1.send_buf = &Slave_read; msg1.recv_buf = RT_NULL; msg1.length = 1; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = rec; msg2.length = len; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(&stm32_f769_ni, &msg1); } static void stm32_write(rt_uint8_t *rec,rt_uint8_t len) { msg1.send_buf = &Slave_write; msg1.recv_buf = RT_NULL; msg1.length = 1; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = rec; msg2.recv_buf = RT_NULL; msg2.length = len; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(&stm32_f769_ni, &msg1); } INIT_APP_EXPORT(run_uspi); ``` 连接好开发板,编译程序,烧录 ![image.png](https://oss-club.rt-thread.org/uploads/20220428/29c9eef5675e4015fe51665bc9586b46.png) 设备挂载完成 将编写好的STM32F769的SPI从机设备烧入开发板,复位串口输出如下 ![image.png](https://oss-club.rt-thread.org/uploads/20220428/b7ee42a527abef4c93cbffa59aacf695.png) SPI从机发送检测不到,有大佬做过关于rtthread的spi从机设备吗?帮忙看一下到底哪儿出的问题 M487开发板USPI代码 [uspi.rar](https://oss-club.rt-thread.org/uploads/20220428/fd92a28258f3d25d29aab5cdcca84c25.rar) F769开发板SPI_SLAVE代码 [SPI_SLAVE.rar](https://oss-club.rt-thread.org/uploads/20220428/38d933bc4f89d8d2ec8e91a693252985.rar)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
likang0519
这家伙很懒,什么也没写!
文章
5
回答
4
被采纳
0
关注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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部