原博客连接:http://blog.sina.com.cn/s/blog_9fff1f140102wq3m.html

这个项目里面涉及到使用加速度芯片,我们使用了一片目前最低功耗的ADXL362芯片。这类数字传感芯片的主流端口一般是IIC和SPI。IIC相对而言硬件设计较为简单,两线总线可以直接挂载很多芯片,但通信受干扰,容易进入“死锁”状态,需要软件处理。SPI相对而言需要的硬线更多,但不存在出现“死锁”的问题,另外通信速率也更高。

下面是NRF52832的SPI模块结构图。和51422/51822之类相比其主要区别,新增了EasyDMA模块,可以自动读写RAM。也就意味着我们CPU可以一次性配置一整个数据包的传输,然后等着整包数据传输完再处理剩下任务了,无论是低功耗还是降低CPU负荷都有很大帮助。

除此以外还有个比较重要的事情,NRF的MCU有一部分外设是“共享资源”的,他们的配置寄存器的地址也是重合的,不能同时被使能。(其实我觉得根本就是同一个模块的不同模式罢了...)。下图里面可以看出来,片上的SPIM,SPIS,TWI三个模块均是共享同样地址。因此要注意,不能同时使能同一个ID号的外设。也意味着NRF52832事实上只有3个同步串行通信模块,可以被配置为SPI主,SPI从,IIC模式,而不是有9个...

接下来先编写SPI外设的驱动程序。这里我将其封装为4个功能:

1、初始化并开启SPI模块

2、收发数据

3、关闭SPI模块

如图为初始化程序,其主要任务为:初始化SPI模块并使能,创建传输完成的信号量

由于我们经常会在同一个SPI总线上面挂若干芯片,通过片选来分别,分时复用,所以一般都将ss_pin禁用,在更高一层的设备驱动,软件控制GPIO来实现。

另外重点就是字节传输顺序,bit_order,一般都是MSB在前,也遇到过LSB在前的奇葩(某国产芯片),每次都应该仔细核对下。

此外还有CPOL和CPHA也要仔细确认下,这里使用库函数的话,直接采用MODE0/1/2/3来代替。

这里orc是如果数据包长度TX

此外外设库SPI初始化函数nrf_drv_spi_init可以提供一个函数句柄,用做传输完成的回调函数。若不提供的话则后面调用nrf_drv_spi_transfer则会是阻塞的。

如图为SPI读写函数。由于SPI读写是同步的故直接封装成一个函数,且使用RTOS的信号量实现阻塞。

大致任务就是调用nrf_drv_spi_transfer发送,随后等待回调函数里面释放信号量,再返回。

如图为SPI模块关闭函数,主要用于低功耗优化。

如图为SPI的发送完成回调函数,将会在发送完成中断中调用,因此发送信号量时候应该选择FromISR这个API。

接下来可以编写个简单的程序,用ADXL362来进行一番简单测试。一般的,这类芯片皆有一个专门用来识别ID的只读寄存器,可以编写读取这个ID来测试。

这里就读取0x02地址的数据来测试。

首先,在ADXL362的驱动程序里面,封装一个函数__read_char,作用是读取单个字节大小的寄存器的数据。其中输入参量为寄存器地址,返回值为寄存器的值。

之后在ADXL362的初始化函数里面调用,运行程序就可以知道结果了,返回值应为0xF2。

SPI通信调试(ADXL362)相关推荐

  1. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  2. Spi通信,写操作时,发送缓冲区非空停留在while里面。arm a5与w5500芯片udp网络通信。网络调试助手界面及sscom无法点击

    问题描述 w5500 与SAMA5D3x处理器通过硬件spi实现网络通信.采用w5500自带的函数进行udp通信,接口函数sendto,发送100Hz的数据一段时间后,程序停留在函数SPI_write ...

  3. linux 逻辑分析仪,可实时显示所有SPI通信的逻辑分析仪,一个更好的SPI调试器SPIDriver上手体验...

    SPIDriver是一个用于控制SPI设备的易于使用的工具,它可与Windows,Mac和Linux系统配合使用,并具有内置的彩色屏幕,可实时显示所有SPI通信的逻辑分析仪,它使用标准的FTDI US ...

  4. (30)SPI接口调试丢数据解决(FPGA不积跬步101)

    1)遇到问题 FPGA与微处理器进行数据交互用到了SPI接口总线,SPI总线已经很成熟了,网上也有好多开源代码.但是,项目开发调试中也遇到SPI通信丢帧验证问题. 2)解决方法 a.设计思路为:SPI ...

  5. TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出

    一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...

  6. AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项

    1.AS5047P硬件设计 1.1 简介.性能参数 AS5047P 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行高速(高达 28krpm)角度测量.这种新型位置传感器配备了革命性的 ...

  7. STM8使用SPI通信需要注意的几个问题

    概述: 在使用STM8L101F3单片机,SPI通信读取三轴传感器ADXL362数据时,出现了一系列的问题,在这里做个笔记,也希望可以给大家一个小的参考. 问题一: 在SPI初始化过程中,没有初始化M ...

  8. 基于STM32与NOR FLASH的SPI通信

      SPI的通信很容易实现,相比之下,驱动FLASH反而耗费了我学习SPI整个过程的大部分时间.下面是我学习过程的一些记录. 硬件平台:秉火ISO_V2开发板 实现功能:STM32使用SPI协议读写板 ...

  9. STM32 网口转SPI通信

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.网络通信与SPI通信是什么? 二.代码思路 1.流程图 三.测试代码流程与关键代码 总结 前言 `本文介绍利用ST ...

  10. 【GD32F427开发板试用】硬件SPI通信驱动CH376芯片,用单片机实现U盘数据下载

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:周文杰 SPI通信作为单片机多种基础数据传输模式中的一种,驱动外部芯片CH376实现数据 ...

最新文章

  1. WordPress.com 开源,弃 PHP 改用 JavaScript
  2. java类使用其他类的变量_如何将java类中的变量加载到其他类
  3. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为
  4. 小技巧,怎么让MFC的MDI程序子窗口看起来有扁平的效果
  5. [Java基础]IO流小结
  6. 如何检测支付宝接口中notify_url.php有没有返回,微信小程序支付成功,但是notify_url接收不到回调如何排查此问题?...
  7. 统计过去数据一个php脚本
  8. java 基础类型 包装类型
  9. 关注的计算机视觉研究组和个人主页列表
  10. python怎么让py里面逐行运行_Python读写文件详解,看完这篇即可完全理解「收藏」...
  11. 二叉树非递归遍历思路总结
  12. (转)DirectX不是全部!3D游戏图形技术解析
  13. 10万字公安大数据平台建设项目方案
  14. 少年,我看你骨骼精奇,见与你有缘,这套算法赠你
  15. html让背景图铺满整个页面
  16. 通过web修改AD账号密码(无需第三方工具)
  17. forum php 无法下载应用程序,iphone无法下载应用程序怎么办?六个方法你看看
  18. Android3d结构光,3D结构光首功+Find+X成首款刷脸支付安卓机
  19. 幼儿园科学教案计算机,大班科学教案4篇
  20. 产能过剩蔓延到光伏产业 结构性改革下如何去产能?

热门文章

  1. 宏excel怎么计算机,excel宏的使用/EXCEL 如何关闭宏
  2. 详解Python函数如何重载?
  3. 功能性能服务器图标,SQL Server服务器的图标及其功能
  4. 被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志
  5. 老男孩python最新_老男孩Python高级运维自动化实战 老男孩Python高级运维开发10期 全套Python视频教程...
  6. 软件设计模式学习总结
  7. 前端js 下载zip文件并解压
  8. 【人工智能】无人车系统仿真软件-PreScan
  9. android studio 导入第三方的jar包,add as library的位置
  10. 希尔密码_希尔密码| 网络安全