LPC804开发(7.SPI使用)

news2024/11/16 8:27:37

1.前言

原本说写ADC,但是考虑到6已经给了串口,算了算了,还是把SPI和IIC放到7和8吧。整体用下来感觉NXP的协议比ST和TI开发的完善的,都可以走硬件,比较完善的底层开发,没有硬伤,那么接下来我们来快速上手吧。

2.初始化

首先说一下,官方的SDK是有问题的,并不是SPI问题,而是管脚布置问题。我最开始研究的这个例程,MOSI管脚死活没有输出,CLK反而有。

翻了一下管脚定义

发现是19,21两个管脚

 CLK输出正常,但是MOSI没有东西。所以我在程序里换了个管脚,我不确定是我管脚烧了还是程序问题,后面如果有人测试也可以评论区说说效果,是官方程序的问题还是芯片的问题。 

我的初始化程序如下

void init_spi0_pin(void)
{
    /* Enables clock for switch matrix.: enable */
    CLOCK_EnableClock(kCLOCK_Swm);

    /* SPI0_SCK connect to P0_18 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SCK, kSWM_PortPin_P0_18);

    /* SPI0_MOSI connect to P0_20 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MOSI, kSWM_PortPin_P0_27);

    /* SPI0_MISO connect to P0_19 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MISO, kSWM_PortPin_P0_28);

    /* SPI0_SSEL0 connect to P0_21 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SSEL0, kSWM_PortPin_P0_21);

    /* Disable clock for switch matrix. */
    CLOCK_DisableClock(kCLOCK_Swm);
}

void init_spi0(void)
{
	CLOCK_Select(kSPI0_Clk_From_MainClk);

	init_spi0_pin();

    spi_master_config_t userConfig = {0};
    SPI_MasterGetDefaultConfig(&userConfig);
    userConfig.baudRate_Bps           = 5000U;
    userConfig.sselNumber             = kSPI_Ssel0Assert;
    userConfig.clockPhase             = kSPI_ClockPhaseSecondEdge;
    userConfig.delayConfig.frameDelay = 1;
    SPI_MasterInit(SPI0, &userConfig, CLOCK_GetFreq(kCLOCK_MainClk));
}

比较简单上面一个函数是初始化管脚就不说了。看下面的函数,首先是选择时钟,依然是主时钟,15Mhz的那个,大家应该很熟悉了,大部分外设都是这个。

接着是设置一个spi结构体用以我们的配置

然后获取默认配置

然后是通信速率,我这里是5Khz,官方给的是50Mhz,不过我看没什么问题

 然后是选择CS管脚

在芯片内部每个SPI可以有两个CS管脚,我们可以自由选择cs10,cs11或是全选

然后选择第几个时钟边沿传输数据,一般是第一个

此外NXP对于SPI还提供了延迟

  官方给出了四种延迟

(1)CS选中后到传输前的延迟(2)传输完毕后到CS恢复高电平前延迟(3)框架与框架内延迟(4)传输与传输见延迟。但是光这里设置没有用,这里的设置要配合传输时的设置一起用才行,这个我一会再说。

3.传输

程序如下

void SPI0_Senddata(void)
{
	unsigned char t[2]={5,10};
    unsigned char r[2];
    spi_transfer_t xfer = {0};

    /*Start Transfer*/
    xfer.txData      = t;
    xfer.rxData      = r;
    xfer.dataSize    = 2;
    xfer.configFlags = kSPI_EndOfFrame|kSPI_EndOfTransfer;
    /* Transfer data in polling mode. */
    SPI_MasterTransferBlocking(SPI0, &xfer);
}

首先申请两个区域,一块用以接收,一块用以发送,然后申请一个结构体来进行设置

然后设置传输,第一个参数是传输数据存放地址,第二个参数是接收数据存放地址,第三个参数是当前传输的数据量

最后这句就可以配合前面的设置的延迟对spi过程进行延迟 

 等这些配置完毕后就可以开始传输了。

指定SPI,投入刚刚配置好的结构体就可以发送了。

4.测试

首先我们测试没有延迟的情况,我在主程序里循环发送,5和10,两个数据

效果如下

因为逻辑分析仪还没到,所以这里我用示波器看了一下CLK与MOSI,可以看到波形输出正确,没有问题。

下面我们加上延迟,可以明显看到在一组数据传输完毕后,相较于上一次,可以明显看到延迟

5.结语

总的来说NXP的协议使用起来比较简单。当然,SDK里还有复杂的中断等等,但是我就不搞了,大家有需要可以自行测试。等明天逻辑分析仪到了我会再把完整的SPI信号发给大家看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你一招轻松把模糊的照片变高清

亲爱的朋友们,你们是否也曾经遇到过这样的问题——精心拍摄的照片或珍藏已久的图片突然变得模糊不清,让人心情郁闷?别担心,我发现了解决这个问题的秘诀!借助一些专业的图片修复工具,那些模糊的瞬间可以重新…

react实现滚动到顶部组件

新建ScrollToTop.js import React, { useState, useEffect } from react; import ./ScrollToTop.css;function ScrollToTop() {const [isVisible, setIsVisible] useState(true);// Show button when page is scorlled upto given distanceconst toggleVisibility () > {…

一分钟在SpringBoot项目中使用EMQ

先展示最终的结果: 生产者端: RestController RequiredArgsConstructor public class TestController {private final MqttProducer mqttProducer;GetMapping("/test")public String test() {User build User.builder().age(100).sex(1).address("世界潍坊渤…

Wireshark网络协议分析 - UDP协议

在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的UDP服务器与客户端2.2. Wireshark抓包分析 3. UDP与TCP的区别4. 参考资料 1. 基础 UDP包的数据结构: 2. 实战 2.1. 用Go写一个简单的UDP服务器与客户端 我们这里使用Golang写了一个简单的9830端…

docker由浅入深

一、什么是docker docker 顾名思义就是轮船的意思,轮船我们知道是通过集装箱运载货物的东西,那么docker其实也是类似的东西,只是装载的是虚拟的运行程序罢了。其中集装箱在docker里面被称为container(后面以容器称之)…

林浩然的Python奇遇记:从小白到科学界的编程魔法师

林浩然的Python奇遇记:从小白到科学界的编程魔法师 Lin Haoran’s Python Adventure: From Novice to Programming Sorcerer in the Scientific Realm 在那个平凡的午后,我们的主角林浩然——一个对编程一窍不通但对世界充满好奇的物理学大二学生&#x…

qiankun子应用静态资源404问题有效解决(遇到了http请求静态文件404、css文件引用图片无法显示、svg图片转换成 base64无法显示等问题)

在👉🏻 qiankun微前端部署👈🏻这个部署方式的前提下,遇到的问题并解决问题的过程 >> 问题现象 通过http请求本地的静态json文件404 css中部分引入的图片无法显示 >> 最开始的解决方式 在👉…

Linux第36步_创建正点原子的TF-A工作区

创建正点原子的TF-A工作区,目的是想查看正点原子的设备树文件“stm32mp157d-atk.dts”和设备树头文件“stm32mp157d-atk.dtsi”,了解设备树是什么样子,为后期基于“ST公司的源码”创建自己的设备树提供参考,同时也是为了学习移植u…

飞桨大模型分布式训练技术

今天我为大家介绍飞桨大模型分布式训练技术,内容分为以下几个部分: 首先,我会介绍大模型训练面临的重点难题;然后,为大家介绍飞桨在大模型训练领域的特色分布式训练技术和优化方案;最后,伴随着…

NeRF:神经辐射场复杂场景的新视图合成技术

NeRF:神经辐射场复杂场景的新视图合成技术 NeRF:神经辐射场复杂场景的新视图合成技术项目背景与意义如何运行?快速开始更多数据集 预训练模型方法与实现结语服务 NeRF:神经辐射场复杂场景的新视图合成技术 在计算机视觉领域&…

工业物联网网关如何实现工业设备的远程运维?-天拓四方

随着工业4.0和智能制造的快速发展,工业设备的远程运维已经成为提高企业生产效率和降低运营成本的重要手段。工业物联网网关作为这一过程中的关键组件,发挥着不可或缺的作用。本文将重点探讨工业物联网网关如何实现工业设备的远程运维,并结合实…

网络和Linux网络_15(IO多路转接)reactor编程_服务器+相关笔试题

目录 1. reactor的服务器 1.1 Sock.hpp 1.2 加协议分割报文 1.3 序列化和反序列化 Protocol.hpp main.cc Epoll.hpp TcpServer.hpp 2. 相关笔试题 答案及解析 本篇完。 1. reactor的服务器 Log.hpp和以前一样,因为下面要写ET模式所以Sock.hpp加了一个把…

[Python] 什么是集成算法,什么是随机森林?随机森林分类器(RandomForestClassifier)及其使用案例

什么是集成算法? 集成算法是一种机器学习方法,它将多个基本的学习算法(也称为弱学习器)组合在一起,形成一个更强大的预测模型。集成算法通过对基本模型的预测进行加权平均或多数投票等方式,来产生最终的预…

【Leetcode】两数之和

目录 题目: 解法1:暴力双for 1.想到的第一种方法两for循环解 复杂度分析 解法2:hash表 总结: 笔记: 题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

简单区间DP

文章目录 什么是区间DpAcWing 282. 石子合并题意分析思路解析状态表示状态计算 CODE需要注意的问题 什么是区间Dp 区间Dp指的是某些问题可以用区间来划分解决。 AcWing 282. 石子合并 题目链接:穿梭时间的画面的钟 题意分析 从一排石子中选择相邻的两堆进行合并…

2024-01-25 力扣高频SQL50题目1193每月交易

1.1193每月交易 1 count可以这样用。。 COUNT(IF(state approved, 1, NULL)) AS approved_count 如果 COUNT(if(state approved,1,0)),这里变成0,就不对了。因为count计数时候,只要里面不是null,就会算进去。 sum(if(state …

(学习日记)2024.01.27

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

行为型设计模式—迭代器模式

迭代器模式:也叫作游标模式,能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。 当集合背后为复杂的数据结构,且希望对客户端隐藏其复…

漏洞原理文件上传漏洞

一 文件上传漏洞介绍(理论) 文件上传漏洞是一种常见的web应用程序漏洞,允许攻击者向服务器上传恶意文件。这种漏洞可在没有恰当的安全措施的情况下,将任意类型的文件上传到服务器上,从而可能导致以下安全问题&#xff…

【lesson1】高并发内存池项目介绍

文章目录 这个项目做的是什么?这个项目的要求的知识储备和难度?什么是内存池池化技术内存池内存池主要解决的问题malloc 这个项目做的是什么? 当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc&#xf…