SPI通信以及51单片机程序

SPI通信协议:
1、简而言之:
(1)利用时钟脉冲得上升沿和下降沿来实现数据传输。
(2)数据传输方式为字节高位在前,低位在后传输。
(3)标准SPI协议为4线制传输数据,4条信号线分别为:
MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK 时钟信号,由主设备产生。
CS 从设备片选信号,由主设备控制(一般低电平有效)。
(4)SPI内部结构简明图如下:

(5)由上图可以看出,SPI接口传输数据的方式是主机发送一字节数据的最高位的同时也会接收到从机的一字节数据的最高位并放在自己的最低位,从机亦然。
(6)如果主机在时钟信号的上升沿接收数据,那么主机在时钟信号的下降沿就会发送数据。
(7)标准的SPI协议为高速、全双工、同步的串行通信协议。
(8)四线制的SPI为标准的SPI接口,同时收发数据;三线制或二线制的SPI为非标准的SPI接口,一般使用SCL时钟信号线、片选线CS、和数据信号线DIO或片选信号线直接接地,只有SCL时钟信号线和数据线DIO。
(9)物理拓扑图:

2、传输模式:
(1)CPOL(Clock Polarity,时钟极性)表示SCK在空闲时为高电平还是低电平。当CPOL=0,SCK空闲时为低电平,当CPOL=1,SCK空闲时为高电平。
(2)CPHA(Clock Phase,时钟相位)表示SCK在第几个时钟边缘采样数据。当CPHA=0,在SCK第一个边沿采样数据,当CPHA=1,在SCK第二个边沿采样数据。(所谓的采样数据也就是接收数据)
(3)根据时钟的极性与相位的不同,SPI的传输模式可以分为4种模式,如下表:

(4)SPI的传输模式一般由从机决定。
3、51单片机模拟SPI读写单字节数据程序:

unsigned char SPI_WriteReadByte(unsigned char  dat)
{unsigned char i = 0;
unsigned char temp = 0;
unsigned char read_data = 0x00;
//  SCK=0;
for(i=0;i<8;i++) {SCK=0;temp=((dat&0x80)==0x80)?1:0;dat= dat<<1;   SI=temp;SCK=1;read_data <<=1;read_data|=(unsigned char)SO; }
//  SCK=1;
return read_data;
}

4、51单片机模拟SPI通信协议控制25AA040读写数据完整程序:


#include <reg51.h>    //包含单片机寄存器的头文件
#include <intrins.h>  //包含_nop_()函数定义的头文件
sbit SCK=P3^4;       //将SCK位定义为P3.4引脚
sbit SI=P3^5;        //将SI位定义为P3.5引脚
sbit SO=P3^6;        //将SO位定义为P3.6引脚
sbit CS=P3^7;        //将CS定义为P3.7引脚#define WREN 0x06    //写使能锁存器允许
#define WRDI 0x04    //写使能锁存器禁止
#define READ 0x03    //读出
#define WRITE 0x02   //写入
void delay1ms()
{unsigned char i,j; for(i=0;i<10;i++)for(j=0;j<33;j++);      }void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}
unsigned char SPI_WriteReadByte(unsigned char  dat)
{unsigned char i = 0;
unsigned char temp = 0;
unsigned char read_data = 0x00;
//  SCK=0;
for(i=0;i<8;i++) {SCK=0;temp=((dat&0x80)==0x80)?1:0;dat= dat<<1;   SI=temp;SCK=1;read_data <<=1;read_data|=(unsigned char)SO; }
//  SCK=1;
return read_data;
}
unsigned char WriteSet(unsigned char dat,unsigned char addr)
{unsigned char readdat;SCK=0;                 //将SCK置于已知状态CS=0;                  //拉低CS,选中X5045SPI_WriteReadByte(WREN);    //写使能锁存器允许CS=1;                  //拉高CSCS=0;                  //重新拉低CS,否则下面的写入指令将被丢弃SPI_WriteReadByte(WRITE);   //写入指令SPI_WriteReadByte(addr);    //写入指定地址SPI_WriteReadByte(dat);     //写入数据CS=1;                  //拉高CSSCK=0;                 //将SCK置于已知状态return readdat;
}unsigned char ReadSet(unsigned char addr)
{unsigned char dat;SCK=0;                 //将SCK置于已知状态CS=0;                  //拉低CS,选中X5045SPI_WriteReadByte(READ);   //开始读SPI_WriteReadByte(addr);   //写入指定地址dat=SPI_WriteReadByte(addr);    //读出数据CS=1;                 //拉高CSSCK=0;                //将SCK置于已知状态return dat;           //返回读出的数据}void main(void)
{ while(1){WriteSet(0xaa,0x10);   //将数据“0xaa”写入第一个X5045的指定地址“0x10”delaynms(10);           //X5045的写入周期为约10msP1=ReadSet(0x10);       //将数据从第一个X5045中的指定地址读出来}
}

5、51单片机模拟SPI通信协议控制25AA040电路图:

6、25AA040手册:
25AA040手册

嵌入式单片机基础篇(三十五)之SPI通信以及51单片机程序相关推荐

  1. LINUX学习基础篇(十五)软件包管理

    LINUX学习基础篇(十五)软件包管理 软件包管理 软件包分类 源码包 二进制包 选择 依赖性 rpm包安装 rpm包命名规则 rpm包安装和卸载 服务命令 rpm查询命令 验证 数字证书 rpm中文 ...

  2. WF4.0 基础篇 (三十 完) 对学习WF的一点建议

    从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了 这段时间与一些对WF4.0感兴趣的公司与开发人 ...

  3. JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法)

    JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法) 线程 首先要清楚的是 线程依赖于进程 进程 是 正在运行的应用程序 一个正在运行的应用程序 是个进程 这个应用程序又要执 ...

  4. 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略

    第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...

  5. 鸟哥的Linux私房菜(基础篇)- 第十五章、磁碟配额(Quota)与进阶文件系统管理

    第十五章.磁碟配额(Quota)与进阶文件系统管理 最近升级日期:2009/09/10 如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁碟配额 (Quo ...

  6. 嵌入式单片机基础篇(十)之Systick定时器原理及应用

    Systick定时器原理及应用 1.什么是Systick定时器? 回答: (1)ystick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. (2)Systick定时 ...

  7. 前端基础(三十五):SVG入门

    SVG - viewBox 属性&值 描述 svg width="320" height="200" viewBox="0 0 100 100 ...

  8. Python基础篇(十五)-- Python程序接入MySQL数据库

    程序运行时,数据都在内存中,程序终止时,需要将数据保存到磁盘上.为了便于程序保存和读取,并能直接通过条件快速查询到指定数据,数据库(Database)应运而生,本篇主要学习使用Python操作数据库, ...

  9. Python基础篇(十五)-- Pygame游戏编程

    1 初识Pygame Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像.声音.视频.事件.碰撞等的支持.Pygame建立在SDL的基础上,SDL是一套跨 ...

  10. Java基础(三十五)Math、Random类和数字格式化(String.format方法)

    一.Math类 Math类常用的方法: public static long abs (double a) 返回a的绝对值 public static double max (double a,dou ...

最新文章

  1. 下一代脑电图可以帮助恢复失去的大脑功能
  2. 恢复SQL Server被误删除的数据(再扩展)
  3. cf不能全屏win7的解决方法_win7电脑输入法不能打字的解决方法
  4. checking for mysql_commit in -lmy_mysql2安装异常
  5. X-Scan描述及简单教程
  6. mongodb地理空间索引原理阅读摘要
  7. 六级词汇打卡第一天(一)
  8. ZUST-CCCC选拔赛(L1,L2部分题解)
  9. NOR Flash的原理与操作
  10. 锅炉的计算机控制系统设计,余热锅炉计算机控制系统设计与开发
  11. Hibernate的下载与配置
  12. VTN系列多通道振弦模拟信号采集仪常规操作
  13. 如何部署自定义统计图
  14. Linux下打包压缩war和解压war包 zip和jar
  15. 移动硬盘安装ubuntu系统二——启动U盘安装
  16. c语言判断字符是否为某字母,判断字符是否为字母
  17. 程序员社交网站_程序员不必在社交上感到尴尬。 这里有10项社交技巧可以改善您的职业。...
  18. web前端面试 js部分
  19. 国内首个《政务APP技术指标评价规范》团体标准正式出台
  20. 从零开始的板绘入门!

热门文章

  1. 51单片机用PID算法温度控制器毕业设计 完整资料,Matlab作图仿真源码
  2. FFT蝶形算法的verilog实现专题——基-4 频率抽取FFT算法matlab实现
  3. 第一周:半导体器件基础(一)
  4. 磁共振成像(Magnetic Resonance Imaging,MRI)学习资料汇总,包括:在线学习视频、网站、教材
  5. SeaChest Utilities 工具,让你的硬盘功耗又低又长寿
  6. 五子棋等级考试软件的开发(五)
  7. 网络安全宣传周:强调个人信息保护│预防个人信息泄露实操指南
  8. 基于深度学习的图像匹配技术一览
  9. List转Map的几种方式
  10. CTPN/CRNN的OCR自然场景文字识别理解(一)