Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
NXP 微控制器
NXP-MCXN947
NXP MCXN947测评之(三)SPI测评之nor flash
发布于 2024-03-31 14:15:42 浏览:384
订阅该版
[tocm] 本文继续MCXN947的SPI测评,上一篇文章加入SPI6主控后测试了external loopback,测试结果表明RT-Thread适配MCXN947芯片的SPI这块已经成熟。接下来我们要找个实际的SPI设备来测试,最好能SPI发和收都能覆盖到。最常见的SPI设备有SSD1306 SPI屏、PSRAM,Nor Flash等,但SPI屏只需要正确发送数据即可显示,不满足我们的发和收都要覆盖的要求,当然读者有兴趣可以用板子的SPI6接块SPI屏自己试下u8g2,当一个小作业哦。正当我寻找合适的SPI设备时,有大牛指点:FRDM-MCXN947这块板子上的W25Q64JVSSIQ Nor Flash接入的针脚其实可以复用为SPI使用的,那简直太完美了,杜邦线都不用接了😀 故本文以Nor Flash为例测试SPI。 # RT-Thread Nor Flash框架 经调研和阅读RT-Thread源码发现,RT-Thread对于遵循SFDP(什么是SFDP?可阅读RT-Thread源码目录中components/drivers/spi/sfud/README.md)的Nor Flash支持非常完美,它是通过一个叫SFUD(Serial Flash Universal Driver 串行Flash通用驱动库)的component来支持的,在此之上经fal、mtd可以挂接littlefs等文件系统,具体可参考RT-Thread官方文档,但本文侧重点在于SPI通信测试,故只要能通过sfud验证SPI传输即可。 # FRDM-MCXN947 W25Q64JVSSIQ的SPI适配 由FRDM-MCXN947原理图得知,如W25Q64JVSSIQ做SPI设备使用,涉及针脚为P3_0, P3_7, P3_8和P3_9,查询NXP芯片手册可知,这些针脚可以复用为FC7(FCn含义见上一篇文章),所以根据上一篇文章的流程,我们需要修改pinmux和加入SPI7主控,最后还需要attach设备。 ## pinmux修改 修改bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c加入如下代码: ```bash @@ -95,6 +95,11 @@ void BOARD_InitBootPins(void) PORT3->PCR[22] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC6_P2 SDI/D[1], FC3_SPI_MISO */ PORT3->PCR[23] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* CS */ + /* SPI7 */ + PORT3->PCR[0] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* CS */ + PORT3->PCR[7] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P1 SCK, FC7_SPI_CLK */ + PORT3->PCR[8] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P0 SDO/D[0], FC7_SPI_MOSI */ + PORT3->PCR[9] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P2 SDI/D[1], FC7_SPI_MISO */ ``` ## 加入SPI7主控 修改bsp/nxp/mcx/mcxn/Libraries/drivers/drv_spi.c: ```bash @@ -23,6 +23,9 @@ enum #ifdef BSP_USING_SPI6 SPI6_INDEX, #endif +#ifdef BSP_USING_SPI7 + SPI7_INDEX, +#endif }; @@ -78,6 +81,20 @@ static struct lpc_spi lpc_obj[] = .name = "spi6", }, #endif +#ifdef BSP_USING_SPI7 + { + .LPSPIx = LPSPI7, + .clock_attach_id = kFRO_HF_DIV_to_FLEXCOMM7, + .clock_div_name = kCLOCK_DivFlexcom7Clk, + .clock_name = kCLOCK_FroHf, + .tx_dma_request = kDmaRequestMuxLpFlexcomm7Tx, + .rx_dma_request = kDmaRequestMuxLpFlexcomm7Rx, + .DMAx = DMA0, + .tx_dma_chl = 6, + .rx_dma_chl = 7, + .name = "spi7", + }, +#endif }; ``` ## attach SPI设备 新增bsp/nxp/mcx/mcxn/frdm-mcxn947/board/ports/ spi_flash_init.c如下: ```c #include
#include
#include "spi_flash.h" #include "spi_flash_sfud.h" #include "drv_pin.h" #define CS_PIN (3*32+0) static int rt_spi_flash_init(void) { int result = -1; result = rt_hw_spi_device_attach("spi7", "spi70", CS_PIN); rt_kprintf("value is %d\n",result); if(result == RT_EOK) { rt_kprintf("rt_hw_spi_device_attach successful!\n"); } return RT_EOK; } INIT_COMPONENT_EXPORT(rt_spi_flash_init); ``` # 配置编译以及sf命令小试牛刀 ```bash 在scons --menuconfig界面中 Hardware Drivers Config ---> On-chip Peripheral Drivers --> Enable Flexcomm7 as SPI ``` 选中Enable Flexcomm7 as SPI ```bash RT-Thread Components ---> Device Drivers ---> Using SPI Bus/Device device drivers Using Serial Flash Universal Driver ``` 选中Using Serial Flash Universal Driver和Using auto probe flash JEDEC SFDP parameter 编译烧录后sf测试log如下: ```bash msh >sf probe spi70 I/SFUD: Found a Winbond flash chip. Size is 8388608 bytes. I/SFUD: sf_cmd flash device initialized successfully. I/SFUD: Probe SPI flash sf_cmd by SPI device spi70 success. 8 MB sf_cmd is current selected device. ``` log表明能成功探测出Nor flash设备为Winbond flash chip,大小为8MB,到此已经能表明SPI的发和收都正常工作了,到此按理说已经结束了,但可以用sf命令再做点什么,下面我们做个喜闻乐见的benchmark: ```bash msh >sf bench DANGER: It will erase full chip! Please run 'sf bench yes'. msh >sf bench yes Erasing the sf_cmd 8388608 bytes data, waiting... Erase benchmark success, total time: 19.141S. Writing the sf_cmd 8388608 bytes data, waiting... Write benchmark success, total time: 32.769S. Reading the sf_cmd 8388608 bytes data, waiting... Read benchmark success, total time: 9.770S. ``` # 经验 设备没按预期工作,可查一查pinmux,并且pinmux中各个pin的function number不能想当然的认为从小到大顺序增长,芯片厂家有时候为对称性或设计美观,有些function number是跳过的 如果碰上不小心误改FRDM-MCXN947板子的swd有关针脚的pinmux,导致daplink再也连不上时,可以一直按住FRDM-MCXN947板子上ISP按钮再按RST按钮强制无条件进ISP BOOT mode,这时daplink可以连上了,板子救回。 # 总结 笔者虽有其它OS下bsp开发经验,但就RT-Thread来说还是小白一名,在测评过程中得到了RT-Thread社区和NXP公司大牛们的帮助,学习了RT-Thread的SPI驱动流程、MCXN947芯片的LP_FLEXCOMM、eDMA、pinmux以及LPSPI等模块和RT-Thread的Nor Flash驱动框架,提交了两笔RT-Thread的PR,成为一个RT-Thread初步开发者,谢谢RT-Thread和NXP 注:板载的这颗W25Q64 Nor Flash期望的是利用MCXN947的flexspi控制器来操作,所以上述代码合入RT-Thread主线可能性不大,在github上https://github.com/xhackerustc/rt-thread/tree/NXP_BSP
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
rvcore
这家伙很懒,什么也没写!
文章
10
回答
7
被采纳
1
关注TA
发私信
相关文章
1
试贴-消灭0主题
2
LPC M4的一些资料
3
LPC4088的临时分支
4
lpc1788 ad 不稳定
5
1788 LCD控制器缓冲区字节问题
6
一起来学习LPC4088吧
7
上传LPC4088的realtouch主工程
8
RealBoard 4088预定帖 [第一批板子不多,预定提前结束]
9
晒RealBoard LPC4088开箱照啦,速带小板凳前来围观
10
4088主程序需要的SD卡资源
推荐文章
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部