当前位置: 首页 > news >正文

RT1176 LPSPI驱动移植到RT-THREAD

步骤一 :引脚配置

思路:由底层往上逐层配置

  1. 先在MCUXpresso Config Tools上配置好SPI的引脚,分别是
    在这里插入图片描述
  2. 将fsl_lpspi.c添加构建
  3. 将drv_spi.c添加构建
  4. 将rt-thread/components/drivers/spi目录下的 spi_core.c添加构建

步骤二:RTT的配置

RTT有两处地方要配置

第一处

文件配置完成后,对 board/Kconfig进行修改,
drv_spi.c中默认有4路SPI,SPI有三种模式:阻塞,中断,DMA
先使用阻塞的模式
在这里插入图片描述
以下是Kconfig的代码

menuconfig BSP_USING_SPI
        bool "Enable SPI"
        select RT_USING_SPI
        default y
        
        if BSP_USING_SPI
            config BSP_USING_SPI1
                bool "Enable SPI1"
                default n

				config BSP_SPI1_USING_DMA
                    bool "Enable SPI1 DMA"
                    depends on BSP_USING_SPI1
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI1_TX_DMA_CHANNEL
                        depends on BSP_SPI1_USING_DMA
                        int "Set SPI1 TX DMA channel (0-32)"
                        default 0
                        
                    config BSP_SPI1_RX_DMA_CHANNEL
                        depends on BSP_SPI1_USING_DMA
                        int "Set SPI1 RX DMA channel (0-32)"
                        default 1    

            config BSP_USING_SPI2
                bool "Enable SPI2"
                default n
				
				 config BSP_SPI2_USING_DMA
                    bool "Enable SPI2 DMA"
                    depends on BSP_USING_SPI2
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI2_TX_DMA_CHANNEL
                        depends on BSP_SPI2_USING_DMA
                        int "Set SPI2 TX DMA channel (0-32)"
                        default 2
                        
                    config BSP_SPI2_RX_DMA_CHANNEL
                        depends on BSP_SPI2_USING_DMA
                        int "Set SPI2 RX DMA channel (0-32)"
                        default 3               
                        
            config BSP_USING_SPI3
                bool "Enable SPI3"
                default n
				
				 config BSP_SPI3_TX_USING_DMA
                    bool "Enable SPI3 TX DMA"
                    depends on BSP_USING_SPI3
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI3_TX_DMA_CHANNEL
                        depends on BSP_SPI3_TX_USING_DMA
                        int "Set SPI3 TX DMA channel (0-32)"
                        default 0
                        
                config BSP_SPI3_RX_USING_DMA
                    bool "Enable SPI3 RX DMA"
                    depends on BSP_USING_SPI3
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI3_RX_DMA_CHANNEL
                        depends on BSP_SPI3_RX_USING_DMA
                        int "Set SPI3 RX DMA channel (0-32)"
                        default 1
                        
			config BSP_USING_SPI4
                bool "Enable SPI4"
                default n
				
				 config BSP_SPI4_TX_USING_DMA
                    bool "Enable SPI4 TX DMA"
                    depends on BSP_USING_SPI4
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI4_TX_DMA_CHANNEL
                        depends on BSP_SPI4_TX_USING_DMA
                        int "Set SPI4 TX DMA channel (0-32)"
                        default 0
                        
                config BSP_SPI4_RX_USING_DMA
                    bool "Enable SPI4 RX DMA"
                    depends on BSP_USING_SPI4
                    select BSP_USING_DMA
                    select RT_SPI_USING_DMA
                    default n

                    config BSP_SPI4_RX_DMA_CHANNEL
                        depends on BSP_SPI4_RX_USING_DMA
                        int "Set SPI4 RX DMA channel (0-32)"
                        default 1                        
        endif
endmenu

第二处

在这里插入图片描述

步骤三 设备的初始化

step1 将设备挂载到总线上

按照RTT框架对SPI进行挂载
首先要区分RTT中 SPI设备,和SPI总线的区别
在console中分别是 SPI deviceSPI bus

SPI BUS不需要额外初始化,RTT已经帮你做好了

但SPI device需要自己挂载,因为 device 可以不止一个,可以有 spi11 spi12 等

比如下面的代码,就是将spi10设备挂载到 spi1总线上

 ret = rt_hw_spi_device_attach("spi1","spi10",pin_EVB_SPI1_CS);

step2 对设备进行设置

设置SPI的波特率,主从,MSB或LSB,数据宽度等
比如下面的代码,另外可以将该函数,用 INIT_DEVICE_EXPORT 添加到初始化段中,
到时RTT就会自己调用了

	struct rt_spi_configuration cfg;
    cfg.data_width = 8;
    cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
    cfg.max_hz = 12000000U;//12*1000*1000;//50 * 1000 *1000;    /* 20M */
    struct rt_spi_device *SPI1_EVB;

    SPI1_EVB = (struct rt_spi_device *)rt_device_find("spi10"); /*要用rt_device_find获取 spi10的句柄*/

    rt_spi_configure(SPI1_EVB, &cfg);

步骤四 :数据的发送

同样需要先找到设备的句柄,然后设置数据,最后调用 rt_spi_transfer_message()
需要注意的是,

  1. 这里的 length指的数据的字节数(非位数)
  2. 如果recv_buf 为 NULL,RTT会自动设置成 TX ONLY模式,会对SPI的寄存器中的RXMASK赋值为1
	struct rt_spi_device *SPI1_Dev;
	SPI1_Dev = (struct rt_spi_device *)rt_device_find("spi10");
	if (!SPI1_Dev)
	{
		rt_kprintf("can't find %s device!\n", SPI_BUSNAME_HC165);
	}
	else
	{
		struct rt_spi_message msg;
		uint8_t Tx_Buffer[8] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
		uint8_t Rx_Buffer[8];
		msg.send_buf   = Tx_Buffer;
		msg.recv_buf   = RT_NULL;//&Rx_Buffer;
		msg.length     = 8;
		msg.cs_take    = 1;
		msg.cs_release = 1;
		msg.next       = RT_NULL;
		rt_spi_transfer_message(SPI1_Dev, &msg);
	}        

上机效果

BSP的运行结果
在这里插入图片描述
SDK的运行结果
在这里插入图片描述

Debug思路

首先确认RTT配置的代码有无问题:
同样的应用代码,在STM32F767上运行,波形正常

所以排除是应用代码的问题

接下来确认是不是 fsl

相关文章:

  • JAVA异步执行线程池
  • 效果最大化的所需素材
  • MySQL中的int(11)类型后的括号是什么意思?ZEROFILL属性
  • 树莓派4B(64位)环境搭建
  • AWS CodeCommit中分支保护
  • 免费搭建查题公众号提供题库接口
  • 13---OpenCV:图像进阶操作之①图像直方图②图像金字塔
  • 石头科技: 决胜百亿扫地机器人“价值高地”
  • 趁着中秋节来临之际,学学如何做好团队管理
  • Spring Cloud项目(八)——使用gateway作为服务网关
  • 为什么要注册商标?有什么好处?
  • C/C++后端开发学习路线总结(附带实习学习经历分享)
  • 广西大学口袋开发板之抢答器
  • 【Python零基础入门篇 · 2】:掌握各种运算符和变量、input()输入输出、映射函数map()结合input()和split()函数实现多值输入
  • 单向环形链表构建(思路分析) [Java][数据结构]
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【剑指offer】让抽象问题具体化
  • 2017 前端面试准备 - 收藏集 - 掘金
  • es的写入过程
  • JavaScript对象详解
  • Java编程基础24——递归练习
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • 回顾2016
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • #pragma once与条件编译
  • #Spring-boot高级
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (k8s中)docker netty OOM问题记录
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (剑指Offer)面试题34:丑数
  • (九十四)函数和二维数组
  • (四)Android布局类型(线性布局LinearLayout)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .net core控制台应用程序初识
  • .net 设置默认首页
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [ARC066F]Contest with Drinks Hard
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [C# WPF] 如何给控件添加边框(Border)?
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [jQuery]div滚动条回到最底部
  • [Latex学习笔记]数学公式基本命令
  • [LeetCode] Ransom Note 赎金条
  • [Leetcode] 寻找数组的中心索引