微雪树莓派PICO笔记——7. SPI(串行外设接口)
文章目录
- SPI简介
- 硬件连接
- 通讯协议详解
- RP2040 SPI 主要参数
- RP2040 SPI 逻辑框图
- machine.SPI类函数详解
- 例程地址
- 代码示例
- 代码实现
SPI简介
SPI全称为串行外设接口(Serial Peripherall Interface)
一种高速,全双工,同步通信总线
以主从方式工作,这种模式通常一个主设备对应一个或多个从设备
双向数据传输时需要4根线,单向数据传输时可以裁剪为3根线
硬件连接
MOSI(Master output slave input)-主设备输出/从设备输入引脚
该引脚对应主设备数据接收引脚,从设备数据发送引脚
SCLK-同步时钟,通常由主设备输出
CS - 从设备选择,用来选择从设备
功能是让主设备可以与特定从设备通信,避免数据线上的冲突
SPI没有规定最高速度,通讯速率完全有通信双方的能力决定
所以使用SPI需要查阅双方的数据手册,和根据实际情况调制通讯速率
通讯协议详解
SPI总线协议最早是摩托罗拉公司推出的一种同步串行接口
由于其简单实用,性能优异,因此许多产商的设备都支持该接口,广泛用于与·MCU和外设模块
如E2PROM,ADC,显示驱动器等
注意,SPI接口是一种事实标准,大部分产商都是参照摩托罗拉的SPI接口定义来设计的,并在此基础上衍生出很多变种
因此,不同厂家产品的SPI接口在使用上可能存在一定差别
有的甚至无法直接互连(需要软件进行必要的修改),在实际中需要仔细阅读厂家文档确认
最常见的为摩托罗拉SPI格式
主要特点:
其可以配置时钟极性和时钟相位来控制同步时钟在空闲时的状态和相位
时钟极性 Clock Polarity :空闲时时钟信号电平,如果时钟极性为低,则时钟信号脚空闲时输出低电平,反之则输出高电平
时钟相位 Clock Phase: 选择 捕获数据的时钟边缘,如果时钟相位为低,则数据在第一个时钟边缘上捕获。反之则数据在第二个时钟边缘上捕获
RP2040 SPI 主要参数
RP2040 有两个相同的SPI控制器,都是基于ARM Primecell 同步串口(ssp)(pl022)
RP2040 SPI 逻辑框图
machine.SPI类函数详解
machine.SPI(id,baudrate=1000000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=None, mosi=None, miso=None)
- SPI对象构造函数,作用为初始化对应通道和引脚
- id:使用SPI通道,可为0或者1
- baudrate: SPI通讯速率,也就是SCK引脚上的频率
- polarity:时钟极性,若为0则总线空闲时SCK输出低电平,反之则输出高电平。
- phase:时钟相位,若为0则在第一个时钟边缘捕获数据,反之则在第二个时钟边缘捕获数据。
- bits:每次传输的数据位数
- firstbit:先传输高位还是低位
- sck:SCK引脚,应为Pin对象
- mosi:MOSI引脚,应为Pin对象
- miso:MISO引脚,应为Pin对象
- sck、mosi和miso均为SPI使用的引脚,应为Pin对象
SPI.init()
- init函数,用于重新开启SPI
SPI.deinit()
- deinit函数,用于关闭SPI
SPI.read(nbytes,write=0x00)
- read函数,用于读取从设备数据并返回
- nbytes:读取字节数
- write:读取数据时,MOSI输出数据。
SPI.readinto(buf,write=0x00)
- readinto函数,用于读取从设备数据并存入指定字符数组中。
- buf:字符数组,用于存放接收数据
- write:读取数据时,MOSI输出数据。
SPI.write(buf)
- write函数,将字符数组写入从设备。
- buf:字符数组,用于存放传输数据
SPI.write_readinto(write_buf, read_buf)
- write_readinto函数,用于同时发送和接收数据
- write_buf:字符数组,用于存放传输数据
- read_buf:字符数组,用于存放接收数据
- PS: 这里传输和接收数据的字符数组的长度要求一致。
例程地址
- Github仓库
MicroPython源码
代码示例
以Pico - Evel - Board 的原理图
- Pico 的CPIO10,GPIO11和GPIO12分别作为SCLK,MOSI和MISO连接到XPT2046触摸屏芯片和LCD驱动电路
XPT2046触摸芯片
一款电阻式触摸控制芯片,其通过ADC采集电压获取触摸面板坐标
一次完整的转换需要24个串行同步时钟来完成
前8个时钟用来通过SPI输入控制字节,后16个时钟读取对应ADC数值
XPT2046的控制字节各位描述表
代码实现
from machine import SPI,Pin
umport time# 初始化SPI,使用通道1,频率为5Mhz,引脚
spi = SPI(1,baudrate=5_000_000,sck=Pin(10),mosi=Pin(11),miso=Pin(12))
# 初始化输入输出引脚将GPIO16设置为高电平
IRQ = Pin(17,Pin.IN)
TP_CS = Pin(16,Pin.OUT)
TP_CS(1)while True:
# 当XPT2046检测到触摸,则会在IRQ引脚输出中断信号,用于表示检测到触摸
# 所以在循环中,程序会不断判断IRQ引脚是否被拉低,如果IQO引脚被拉低
# 则开始读取XPT2046的ADC读数并输出if IRQ() == 0:TP_CS(0)spi.write(bytearray[0xD0])Read_date = spi.read(2)time.sleep_us(10)X_Point=((Read_date[0]<<8)+Read_date[1])>>3spi.write(bytearray[0x90])Read_date = spi.read(2)Y_Point=((Read_date[0]<<8)+Read_date[1])>>3TP_CS(1)print("*****************************")print("*********TP_Read_ADC*********")print("*****************************")print("X_Point = {}".format(X_Point))print("Y_Point = {}".format(Y_Point))time.sleep(0.5)
微雪PICO教程
微雪树莓派PICO笔记——7. SPI(串行外设接口)相关推荐
- 嵌入式硬件协议: SPI串行外设接口 Serial Peripheral Interface
简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在ADC.LCD 等设备与M ...
- 微雪树莓派PICO笔记——1.基础介绍
文章目录 基础硬件 原理图讲解 电路图重点讲解 点灯实操 基础硬件 长度51mm,宽度21mm,板厚1mm pcb使用了沉金工艺,所以引脚都做了半孔设计,即可焊接2.54mm的排针,也可以直接焊在主板 ...
- DSP SPI串行外设接口
1.SPI介绍 1.1 SPI简介 SPI的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器 ...
- 微雪树莓派PICO笔记——5. UART (异步收发传输器)
文章目录 通讯协议 UART UART详解 RP2040 UART参数 UART流程图 函数详解 例程地址 码代码 通讯协议 MCU如果要说话需要约定一定的规则,这些规则,我们称为通信协议 常见的有U ...
- 微雪树莓派PICO笔记——6. I2C(集成电路总线)
文章目录 简介 协议详解 RP2040 I2C主要参数 函数讲解 内存操作 软件I2C 例程地址 实操 程序讲解 简介 I2C 集成电路总线,一种串行通信总线,使用多主从架构 由飞利浦公司在20世纪8 ...
- 微雪树莓派PICO笔记——3.PWM(脉冲宽度调制)
文章目录 什么是PWM PWM的应用 RP2040 PWM框架图 PWM流程图 PWM内部框架图 [MicroPython]machine.PWM类函数详解 代码实现 什么是PWM 脉冲宽度调制 (P ...
- 微雪树莓派PICO笔记——4. ADC(模拟数字转换器)
文章目录 什么是ADC RP2040 ADC技术参数 ADC大致框架图 [MicroPython]machine.ADC类函数详解 代码实现 如果我们需要使用PWM精准的控制LED的亮度,就需要反馈 ...
- arduino教程-9. 串行外设接口(spi)
文章目录 相关资料 1. spi针脚 Arduino 串行外设接口 串行外设接口简介 板的SPI引脚 SPI.h 库 SPI.h官方示例 SPI为主机 例子 SPI为从机 例子 相关资料 SPI li ...
- 谈谈SPI (Serial Peripheral Interface,串行外设接口)
今天我们来一起聊聊谈谈SPI (Serial Peripheral Interface,串行外设接口): 什么是SPI SPI (Serial Peripheral Interface,串行外设接口) ...
最新文章
- 一览群智胡健:在中国完全照搬Palantir模式,这不现实
- BigGAN被干了!DeepMind发布LOGAN:FID提升32%,华人一作领衔
- 计算机学的语数英大概是那些,职高如果选电子商务专业那是不是要学语数英
- 大数据开发初学者学习路线
- 软通动力月薪8K面试题解析
- 实现redis集群的批量pineline操作
- swift实例教程_Swift示例教程基础
- (day 34 - 哈希表 or 双指针 )剑指 Offer 57. 和为s的两个数字
- python找到两个有序列表的中位数
- 【通信】基于matlab多径衰落信道仿真【含Matlab源码 338期】
- 一、Windows许可证即将过期怎么办
- mysql为什么要重建索引_深入理解重建索引
- 未来-区块链-Micron:区块链永远不会忘记:内存对这项革命性技术的推动作用...
- 一万年太久,只争朝夕_散文网
- html设计带图形的边框,css怎么设置图片的边框?
- 人人都能读懂的react源码解析(大厂高薪必备)
- 计算机毕业设计 SSM的房屋租赁管理系统(源码+论文)
- 热插拔机制之udev和mdev
- P1023 税收与补贴问题
- 五年学习日语经验资料分享