前言

这次来复习一下SPI以及ADC的有关知识,之前介绍到的磁编码器也是基于SPI协议通信才能读取其内部角度信息,ADC就更不用说了,在电压检测,电机驱动的方面都会涉及到采样量化编码的知识,趁此机会好好复习一下

参考资料

SPI通信协议详解(spi总线) - 知乎 (zhihu.com)

STM32F10xxx参考手册(中文).pdf

普中51单片机开发攻略--A2.pdf

SPI

介绍

这是一种全双工串行外围总线,最少需要三根线,相较I2C而言,其优点是高速、能够同步通信

缺点是没有应答机制,接收数据时有一定缺陷

工作机制

如图所示,我们将SPI设备中的内部缓冲区称为SSPBUF,物理层面上是FIFO的形式用于保存接收或发送的数据

我们再通过移位寄存器SSPSR根据设置好的数据位宽把数据移入或者移出

通过配置与主控制电路相关的控制寄存器来选择SPI的工作模式

我们先不去看那些复杂的寄存器,我们先来看看SPI的引出的这四根线分别有什么作用

信号线

SCK:时钟信号,由主机向从机发送,在其上升沿或下降沿来决定数据的传输和速率

NSS/CS:片选信号,当总线上挂载了多个设备的时候,我们可以给每一个从机分配一个片选地址(Chip Select)以便主机能够与对应的从机进行通信

SDO/MOSI:数据的输出口,用于发送数据

SDI/MISI:数据的输入口,用于接收数据

配置寄存器

在上图中我们可以留意到有两个位,分别是CPOLCPHA

CPOL配置时钟的极性,为1时代表空闲时为高电平,为0时代表空闲时为低电平

CPHA配置时钟的相位

我们知道一个时钟周期有两个跳变沿,因此CPHA决定的是从第几个脉冲开始采样,CPHA=0表示从第一个跳变沿采样,为1则从第二个跳变沿采样

举个例子,当CPHA = 0时,当CPOL = 1时,下降沿开始数据交换,当CPOL = 0时,上升沿开始数据交换

排列组合一下,我们可以得到四种模式

工作特点

同步通讯

由于SPI配备了时钟线,因此SPI设备可以通过时钟线进行实时通讯

数据交换

SPI协议规定一个SPI设备不能仅仅接收或者发送数据,对于一个设备而言,这两个工作应该是同时进行的,在每一个时钟周期内SPI设备都会发送并接收一个bit

而且在数据传输的过程中每次接收到的数据必须要在下一次数据传输之前采样,否则这些数据有可能会被丢弃

SPI只有主从模式,并没有读和写的概念

和前面的通讯形式稍有不同,全双工的SPI对时序的要求并不高

ADC

工作流程

其大致工作流程为:

ADC采样模拟信号 -> 采样信号保持 -> 低通滤波将模拟信号转换为数字信号 -> 根据ADC的分辨率量化信号的值 -> 对量化后的值进行编码

图中所示的A为滤波器电压传输系数,在采样周期下保持不变,保持周期下系数迅速下降,在这个周期里ADC将模拟信号转换为数字信号

分辨率的概念我在之前FOC篇中有提到,简单来说就是分辨率越大量化误差越小,测量到的精度越高

实现原理

逐次逼近型ADC

这种ADC的基本原理简单来说就是:

逐次逼近寄存器先写入高电压,经过DA转换后把数据和采样回来的信号进行比较,若采样信号大于逐次逼近寄存器电压则该位保留,否则置0,不断重复此过程直至逼近寄存器最低位,当转换结束后将逐次逼近寄存器的值存入缓冲寄存器,一个AD转换过程就完成了 

双积分式ADC

基本原理如下:

第一步将输入电压变换成与其平均值成正比的时间间隔

接下来先将开关接通采样信号,将采样信号输入积分器,正向积分固定好的时间后再将开关接通参考电压,反向积分直至电压为0,系统在反向积分所经过的时间就是采样的电压值

简单来说就是先累加采样信号,然后用参考电压去抵消,抵消要用到的电压值就是采样信号的电压

XPT2046

这是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器

XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口

XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置,除此之外, 还可以测量加在触摸屏上的压力

内部自带 2.5V 参考电压,可以作为辅助输入、 温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 6V

XPT2046 片内集成有一个温度传感器

引脚介绍

X、Y、Z、VBAT、Temp 和 AUX 模拟信号经过片内的控制寄存器选择后进入 ADC

芯片部分并不是本文想要讲解的重点,这里就略过了

代码部分

#ifndef __XPT2046_H__
#define __XPT2046_H__#define XPT2046_VBAT   0xAC    //光敏电阻电压
#define XPT2046_AUX     0xEC
#define XPT2046_XP      0x9C    //滑变电阻电压
#define XPT2046_YP      0xDC    //热敏电阻电压
#define DELTA           0.02unsigned int XPT2046_ReadAD(unsigned char Command);#endif
#include <REGX52.H>
#include <INTRINS.H>
#include "XPT2046.h"//引脚定义
sbit XPY2046_DIN=P3^4;
sbit XPY2046_CS=P3^5;
sbit XPY2046_DCLK=P3^6;
sbit XPY2046_DOUT=P3^7;/*** @brief  ZPT2046读取AD值* @param  Command 命令字,范围:头文件内定义的宏,结尾的数字表示转换的位数* @retval AD转换后的数字量,范围:8位为0~255,12位为0~4095*/
unsigned int XPT2046_ReadAD(unsigned char Command)
{unsigned char i;unsigned int Data=0;XPY2046_DCLK=0;      //时钟线复位XPY2046_CS=0;       //片选线为低电平有效,查询从机地址for(i=0;i<8;i++){XPY2046_DIN=Command&(0x80>>i);   //将指令输入,高位在前XPY2046_DCLK=1; //上升沿进行数据转换XPY2046_DCLK=0;}for(i=0;i<16;i++){XPY2046_DCLK=1;    //接收数据XPY2046_DCLK=0;if(XPY2046_DOUT){Data|=(0x8000>>i);}   //接收从机发来的2字节数据}XPY2046_CS=1;       //片选信号关闭,释放从机return (Data>>8)*DELTA;       //返回计算数值
}

SPI驱动XPT2046芯片读取其内部ADC信息笔记相关推荐

  1. 驱动编程简单教程——PTC512(ADC芯片驱动)为例

    1.简介 上几周硬件找了一个ADC芯片的替代料,需要我这边写一个驱动做测试.以前都是配置与修改设备树,最多查看或小改一下驱动,没有写过驱动,所有记录一下思路.大致思路就是先看原理图,再看芯片手册,知道 ...

  2. STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度

    文章目录 STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度 一.初始准备 1.硬件平台 2.软件平台 3.原理图接线 二.操作步骤 1.CubeMX生成初始化代码 1.1 建立工程 ...

  3. STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据

    STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据 STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要 ...

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

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

  5. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  6. CC2530(SPI)驱动FLASH芯片W25Qxx

    由于之前用的存储芯片价格涨得离谱,需要寻找新的存储芯片,综合考虑找到了W25Qxx来测试替代的可行性.不用DMA的具体代码经过测试可用,但DMA收发测试不成功,仍在测试修改阶段. 所用芯片:cc253 ...

  7. NXP SJA1124 spi转lin芯片驱动

    NXP SJA1124 spi转lin芯片驱动 文章目录 NXP SJA1124 spi转lin芯片驱动 一.总体特点 二.工作模式 三.spi通信 三.lin通信 四.芯片寄存器配置 一.总体特点 ...

  8. DSP28335使用SPI从AD2S1210(旋变芯片)读取位置

    前言 精准的转子位置对于电机精确控制来说至关重要,利用旋转变压器获取转子位置角度是一种常见方案.因此在电控程序中只需要通过主控芯片(以DSP28335为例)与旋变解码芯片(以AD2S1210为例)进行 ...

  9. AT32F437VM SPI驱动AT7456E OSD芯片

    上篇文章讲了BF固件中关于OSD的代码部分,今天来看一下硬件部分. 使用AT的芯片配置SPI和OSD芯片通讯. 先配置一下AT32F437的时钟: /************************* ...

最新文章

  1. Kotlin尾递归优化
  2. 《数学之美》第27章 期望最大化算法
  3. 路由跟踪工具0trace
  4. Nero 9 Lite 9.4.12.708 最新最好破解刻录软件下载
  5. Linux:WPS不能使用中文输入法
  6. vue 前期准备,项目结构
  7. Python中的星号:用途及使用方法(下篇)
  8. jQuery.ajax()方法
  9. Pytorch损失函数BCELoss,BCEWithLogitsLoss
  10. 知识管理是一门很深的学问
  11. oracle定时清理回收站,电脑设置定时清理回收站的操作方法
  12. iphone和ipad的一些区别
  13. python中词云图是用来描述_Python如何实现中国地图词云图
  14. 关于高精度地图定义的探讨
  15. URL Extractor 4 for Mac(URL资源地址抓取器)特别版
  16. OLE程序开发利用(开发EXCEL) 之 一
  17. [滑模控制器浅述] (5) 基于分层滑模的吊车控制
  18. 已解决解决:consumer: Cannot connect to redis://localhost:6379//: Error 11001 connecting to localhost:6379
  19. Go 实现短链接服务
  20. 儿童CPC认证,儿童学习用品CPC认证

热门文章

  1. Android屏幕保持常亮的三种方法
  2. python selenium爬虫实例_python使用selenium爬虫知乎的方法示例
  3. 向HTML中添加节点的几种方法
  4. vivoz3升级Android10,vivoZ3i 刷机教程 vivoZ3i 卡刷升级教程
  5. UE4 控制台 不能调出
  6. 惊爆眼球!视频解读游戏中DX9与DX11画质差别
  7. 面试原理之闭包的优缺点和应用场景
  8. CommonJS简介
  9. 图论——极图和托兰定理
  10. JAVA学习笔记(1)【基础知识】