SPI设计
title: SPI设计
tags: ARM
date: 2018-11-05 15:22:59
SPI设计
概述
在SPI协议中,有两个值来确定SPI的模式。 CPOL:表示SPICLK的初始电平,0为电平,1为高电平 CPHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿.
| CPOL | CPHA | 模式 | 含义 |
|---|---|---|---|
| 0 | 0 | 0 | 初始电平为低电平,在第一个时钟沿采样数据 |
| 0 | 1 | 1 | 初始电平为低电平,在第二个时钟沿采样数据 |
| 1 | 0 | 2 | 初始电平为高电平,在第一个时钟沿采样数据 |
| 1 | 1 | 3 | 初始电平为高电平,在第二个时钟沿采样数据 |
常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。比如下图的flash手册

寄存器配置
- GPIO复用为SPI
- 设置SPI寄存器
- 设置波特率预分频寄存器(SPPREn)
- 设置 SPCONn 来正确配制 SPI 模型
- 写数据 0xFF 到 SPTDATn 10 次来初始化 MMC 或 SD 卡
- 设置起 nSS 作用的 GPIO 引脚为低来激活 MMC 或 SD 卡
- 发送数据 ¡ 检查发送就绪标志的状态(REDY = 1),并接着写数据到 SPTDATn。
- 接收数据(1):SPCONn 的 TAGD 位禁止 = 普通模式
- ¡ 写 0xFF 到 SPTDATn,然后确认 REDY 的置位,并接着从读缓冲器读取数据
- 接收数据(2):SPCONn 的 TAGD 位使能 = 自动发送杂数据模式
- ¡ 确认 REDY 的置位,并接着从读缓冲器读取数据(然后自动开始传输)
- 设置起 nSS 作用的 GPIO 引脚为高来释放 MMC 或 SD 卡
程序设计
/*
[6:5]设置为查询模式: 00 polling mode
[4]设置时钟使能: 1 = enable
[3]设置为主机模式: 1 = master
[2]设置无数据时时钟为低电平: 0
[1]设置工作模式为模式A: 0 = format A
[0]设置发送数据时无需读取数据: 0 = normal mode
*/
static void SPIControllerInit(void)
{
/* OLED : 100ns, 10MHz
* FLASH : 104MHz
* 取10MHz
* 10 = 50 / 2 / (Prescaler value + 1)
* Prescaler value = 1.5 = 2
* Baud rate = 50/2/3=8.3MHz
*/
SPPRE0 = 2;
SPPRE1 = 2;
/* [6:5] : 00, polling mode
* [4] : 1 = enable
* [3] : 1 = master
* [2] : 0
* [1] : 0 = format A
* [0] : 0 = normal mode
*/
SPCON0 = (1<<4) | (1<<3);
SPCON1 = (1<<4) | (1<<3);
}
发送接收(查询)

void SPISendByte(unsigned char val)
{
while (!(SPSTA1 & 1));
SPTDAT1 = val;
}
//读数据的时候,无所谓发什么数据
unsigned char SPIRecvByte(void)
{
SPTDAT1 = 0xff;
while (!(SPSTA1 & 1));
return SPRDAT1;
}
SPI设计的更多相关文章
- dubbo SPI设计
SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时, ...
- API/SPI可扩展设计原则(转)
API/SPI可扩展设计原则 博客分类: [设计体系]架构模式 API/SPISPISPI原则JAVA SPISPI机制 写本篇主要是用来后面写一篇可扩展性软件设计打好基础(苦于找不到一篇关于API ...
- Java扩展方法之SPI
API:API(Application Programming Interface)表示应用程序编程接口 SPI:SPI(Service Provider Interface)表示服务提供商接口 A ...
- dubbo源码分析5——SPI机制_AdaptiveExtension的原理和作用
private T createAdaptiveExtension() { try { return injectExtension((T) getAdaptiveExtensionClass().n ...
- SPI ServiceLoader源码分析
public class ddd { public static void main(String[] args) { ServiceLoader1<Hello> sl = Service ...
- 10个精妙的Java编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- SOFA 源码分析 — 扩展机制
前言 我们在之前的文章中已经稍微了解过 SOFA 的扩展机制,我们也说过,一个好的框架,必然是易于扩展的.那么 SOFA 具体是怎么实现的呢? 一起来看看. 如何使用? 看官方的 demo: 1.定义 ...
- 你知道吗?10个精妙的 Java 编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- Spring源码学习笔记之基于ClassPathXmlApplicationContext进行bean标签解析
bean 标签在spring的配置文件中, 是非常重要的一个标签, 即便现在boot项目比较流行, 但是还是有必要理解bean标签的解析流程,有助于我们进行 基于注解配置, 也知道各个标签的作用,以及 ...
随机推荐
- Nginx 防盗链 secure_link 模块
L:76 需要通过 --with-http_secure_link_module 编译进Nginx secure_link 指令 Syntax: secure_link expression; Def ...
- python命令里运行正确但是pycharm里面运行就是报错的问题
这两天在学习爬虫,第一步就是 import scrapy class StackOverflowSpider(scrapy.Spider): 结果一直报错,说是scrapy没有spider这个方法,各 ...
- eclipse添加tomcat服务器
在网上找资料好辛苦,还不对,自己试了好久,终于成功了 还是一如既往的分享 右键 弄好以后发现如此简单| _ |
- BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理
题目描述 给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x. 输入 三个整数p,k,a. 输出 第一行一个整数,表示符合条件的x的个数. ...
- Machine Schedule POJ - 1325(水归类建边)
Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17457 Accepted: 7328 ...
- 【XSY2693】景中人 区间DP
题目描述 平面上有\(n\)个点,你要用一些矩形覆盖这些点,要求: 每个矩形的下边界为\(y=0\) 每个矩形的大小不大于\(s\) 问你最少要用几个矩形. \(n\leq 100,1\leq y\l ...
- Ionic开发遇到的坑整理
1.修改tabs页的图标,关键是 outline 在使用自定义图标的时候,需要修改 /theme/icons.scss 文件,但是如何定义选中前后的分别使用哪个图标呢 定义选中前的状态 .ion-io ...
- Hdoj 1203.I NEED A OFFER! 题解
Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用 ...
- Android GPS定位测试(附效果图)
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
- luogu5021 [NOIp2018]赛道修建 (二分答案+dp(贪心?))
首先二分一下答案,就变成了找长度>=m的 不相交的路径的个数 考虑到在一个子树中,只有一个点能出这个子树去和别的点搞 所以我这个子树里尽量自我满足是不会有坏处的 而且要在自我满足数最大的条件下, ...