当前位置: 首页>編程日記>正文

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

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

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手册


https://www.fengoutiyan.com/post/15683.html

相关文章:

  • 51单片机串口是什么
  • 嵌入式与单片机
  • 单片机和嵌入式学哪个
  • 嵌入式单片机开发
  • 单片机串口通信
  • 单片机嵌入式
  • 单片机
  • 51单片机属于嵌入式吗
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機