51单片机SPI协议与应用实例

————————————————————————————————————————————

SPI总线

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

参考链接:

http://blog.csdn.net/fly__chen/article/details/52724109

http://blog.csdn.net/skyflying2012/article/details/11910173

http://blog.sina.com.cn/s/blog_9cc7125c0100yk1s.html

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

简介:

  • 串行外围设备接口
  • 全双工三线同步,可以同时发出和接收串行数据
  • 采用主从(Master Slave)架构,支持多Slave模式应用,一般仅支持单Slave
  • 时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后
  • 目前应用中可以达到几Mbps的水平
  • 优点:与普通的串行设备相比,可以按位传输,甚至可以暂停。当没有时钟跳变时,从设备不采集和传送数据。不需要寻址操作。全双工通信。
  • 缺点:没有应答机制确认。

特点:

  • 提供频率可编程时钟
  • 发送结束、中断标志;写冲突保护
  • 总线竞争保护
  • SPI总线工作的4种工作方式中,使用最广泛的是SPI0和SPI3方式

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

信号线情况:

  • SCLK提供时钟脉冲,SDI/SDO基于此脉冲按位传输。当处于上升沿模式时,输出:通过SDO线在时钟上升沿时输出,在紧接着的下降沿被读取。输入同理。
  • SS/CS是片选信号线,只有片选信号为使能信号时,对芯片的操作才有效,所以可以在同一总线上连接多个SPI设备
  • SDI:slave → master,从机要发送给主机的数据
  • SDO:master → slave,主机要发送给从机的数据

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

连接方式:

  • 级联方式:此时所有设备的CS端都连在一起,只要选中一个设备,则全选。可以作为一个设备进行处理。

  • 独立连接方式:设备独立操作,为被选通的从设备均处于高阻隔离状态。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工作模式:


SPI模式


CPOL极性


CPHA相位


说明


0


0


0


第一个边沿上升沿


1


0


1


第二个边沿下降沿


2


1


0


第一个边沿下降沿


3


1


1


第二个边沿上升沿

CPOL=0:SCLK有效时为高电平(active-high)

CPOL=1:SCLK有效时为低电平(active-low)

CPHA=0:表示第一个边沿

CPHA=1:表示第二个边沿

Toggling edge为切换边沿,输出信号

Sampling edge为采样边沿,输入信号

时序图:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SPI协议举例

  • 主机8位寄存器存放的是1010 1010,从机存放的是0101 0101,将主从机数据交换
  • SDI:slave → master
  • SDO:master → slave
  • 上升沿发送、下降沿接收

初始化就绪状态:

  • 主机SBUFF = 1010 1010
  • 从机SBUFF = 0101 0101

操作过程:如图所示,经过8个脉冲后,master和slave数据交换

SPI的8个时钟周期的数据:

————————————————————————————————————————————

基于SPI协议,DS1302显示时钟实例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现效果:

实现代码:

  1 #include <reg52.h>
  2 typedef unsigned char uchar;
  3 typedef unsigned int uint;
  4 //写操作控制字节,D7=1,D0=0
  5 uchar code write_address[] =
  6 {
  7     //秒,分,小时,日,月,星期,年
  8     0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c
  9 };
 10 //读操作,D7=1,D0=1,地址同写操作
 11 uchar code read_address[] =
 12 {
 13     0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d
 14 };
 15 uchar code table[] =
 16 {
 17     //0,1,2,3,4,5,6,7,8,9
 18     0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6
 19 };
 20 //dat1和dat2存放读出来的时间,初始值写入12年5月9日1时1分1秒,dat1存放1234位,dat2存放567位
 21 uchar dat1[] = {0x01, 0x01, 0x01, 0x09, 0x05, 0x02, 0x12};
 22 uchar dat2[] = {0x01, 0x01, 0x01, 0x09, 0x05, 0x02, 0x12};
 23 sbit rst = P3 ^ 0;
 24 sbit scl = P3 ^ 1;
 25 sbit sda = P3 ^ 2;
 26 sbit ACC7 = ACC ^ 7;
 27 void Delay(uint m)
 28 {
 29     while(m--);
 30 }
 31 /* SPI协议操作,读字节 */
 32 uchar ReadByte()
 33 {
 34     uchar i;
 35     for (i = 0; i < 8; ++i)
 36     {
 37         ACC = ACC >> 1; //累加器左移1位,补上未知数x
 38         ACC7 = sda; //从sda引脚写入ACC最高位
 39         scl = 1;
 40         scl = 0; //时钟下降沿读入
 41     }
 42     return ACC;
 43 }
 44 /* SPI协议操作,写字节 */
 45 void WriteByte(uchar byte)
 46 {
 47     uchar i;
 48     for (i = 0; i < 8; ++i)
 49     {
 50         byte >>= 1; //byte左移1位存入CY
 51         scl = 0;
 52         sda = CY; //从CY移入sda,发送给DS102
 53         scl = 1; //时钟上升沿写入
 54     }
 55 }
 56 void Write1302(uchar address, uchar dat) //写地址子程序
 57 {
 58     rst = 0;
 59     scl = 0;
 60     rst = 1; //rst上升沿开始写数据
 61     WriteByte(address); //先写入地址控制字节
 62     WriteByte(dat); //再写入数据字节
 63     rst = 0;
 64 }
 65 uchar Read1302(uchar address)
 66 {
 67     uchar temp;
 68     rst = 0;
 69     scl = 0;
 70     rst = 1; //读过程中保持rst高电平状态
 71     WriteByte(address | 0x01); //写入地址并置R/W位为1(读)
 72     temp = ReadByte(); //在单片机写入命令字节的最后一位的第一个下降沿处即读出数据
 73     scl = 1;
 74     rst = 0;
 75     return temp;
 76 }
 77 void SetRST()
 78 {
 79     uchar i;
 80     Write1302(0x8e, 0x00); //向10001110写保护寄存器,写入指令0x00
 81     for (i = 0; i < 7; ++i)
 82         Write1302(write_address[i], dat1[i]); //从秒到年各寄存器写入对应初始值
 83     Write1302(0x8e, 0x80); //向写保护寄存器,写入数据0x80
 84 }
 85 void ReadTime()
 86 {
 87     uchar i, temp1, temp2, temp3;
 88     temp3 = 0x80; //temp3存放时间寄存器地址
 89     for (i = 0; i < 7; ++i) //分别读出秒分小时日月星期年
 90     {
 91         temp1 = Read1302(temp3);
 92         temp2 = temp1;
 93         dat1[i] = (temp1 >> 1) & 0x0f; //读出的数据1234位存入dat1,屏蔽其他位
 94         dat2[i] = (temp2 >> 5) & 0x07; //读出的数据567位存入dat2,屏蔽其他位
 95         temp3 = temp3 + 0x02; //下一个寄存器地址
 96     }
 97 }
 98 void main()
 99 {
100     rst = 0;
101     SetRST(); //时钟建立
102     while(1)
103     {
104         ReadTime(); //读时间
105         P2 = 0xfe;
106         P1 = table[dat1[0] % 10];
107         Delay(500);
108         P2 = 0xfd;
109         P1 = table[dat2[0] % 10];
110         Delay(500);
111         P2 = 0xfb;
112         P1 = 0x02; // -
113         Delay(500);
114         P2 = 0xf7;
115         P1 = table[dat1[1] % 10];
116         Delay(500);
117         P2 = 0xef;
118         P1 = table[dat2[1] % 10];
119         Delay(500);
120         P2 = 0xdf;
121         P1 = 0x02; // -
122         Delay(500);
123         P2 = 0xbf;
124         P1 = table[dat1[2] % 10];
125         Delay(500);
126         P2 = 0x7f;
127         P1 = table[dat2[2] % 10];
128         Delay(500);
129     }
130 }

时间: 2024-10-27 05:52:20

51单片机SPI协议与应用实例的相关文章

[51单片机] SPI nRF24L01 无线简单程序 1

main.c 1 #include <reg51.h> 2 #include <api.h> 3 4 #define uchar unsigned char 5 6 /***************************************************/ 7 #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 8 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 9 #define LED P2 10 11

[51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]

main.c 1 #include<reg51.h> 2 #include"2401.h" 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 7 sbit KEY8=P3^7; //发送按键 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6; ////接收到数据后的功能实现灯 10 11 void delay_ms(uint z) //延时函数 12 { 13 uint x

51单片机300个proteus仿真实例下载

51单片机300个proteus仿真实例下载,不仅有230个51单片机的proteus仿真实例,还有59个经典案例,50个经典电路制作实例,下面只是部分截图和资料,还有更多的proteus仿真/程序在闯客网可以找到,并且免费下载,有需要的朋友可以下载学习,还有技术交流群:613377058 下载链接:https://bbs.usoftchina.com/thread-201293-1-1.html 100000秒以内的计时程序.DSN 10秒的秒表 (2).DSN 10秒的秒表.DSN 1286

(转)STC 51单片机烧录协议分析

前段时间买了一个51单片机开发板.买完后发现,这开发板和芯片的厂家都是十分山寨. 芯片产家叫STC,江湖人称"死太惨",它的中文名字叫"宏晶科技",官网是:www.stcmcu.com,相信在打开这个网站之后,你就同意我的看法了.如果还不够的话,可以下载它的芯片手册:STC90C516RD+ PDF,或者 烧录软件,体验体验. 开发板的产家叫做普中科技,一个连官方论坛都打不开的神秘企业,谢天谢地,它还是有官网的:www.prechin.com. 虽然山寨味浓厚,但是

51单片机实现四相步进电机控制实例

-------------------------------------------- 工作原理见书<51单片机应用及原理--基于KeilC和Proteus,陈海宴>P178-180 -------------------------------------------- 步进电机控制应用实例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

51单片机1-Wire总线及应用实例

-------------------------------------------- 1-Wire总线 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 只使用一根导线(地址线.数据线.控制线合一) 可以传输时钟和数据 双向传输 信号线上可挂许多测控

实例源码2---基于51单片机的摇摇棒制作

最近整理资料,看见这个之前做的摇摇棒,是基于51单片机的,下面把源程序贴出来,有任何问题欢迎留言! #include #define uchar unsigned char #define uint unsigned int sbit key = P3^0;//定义切换画面开关 uchar Key_num;//定义按键次数 uchar Int0_num=0;//定义中断次数 uchar Direction;//定义摇动方向(从左到右) uchar code Embed[]={ 0x40,0x00

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码实现触摸屏(串口屏)与单片机的通讯,主要是解决通讯协议的问题.本文使用开放的Modbus通讯协议,以广州易显的HMImaker触摸屏作主机(Master),单片机作从机(Slaver).HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了.触摸屏与单片机之间采用RS-485标准接口直接连接,与多台51单片机MODBUS RTU多机串口通信一.包括如下实例:二

单片机(simple chip microcomputer)概论、51单片机、MCS-51单片机、STM32、ARM

catalogue 1. 单片机概论 2. 51单片机 3. MCS-51单片机 4. QX-MINI51开发板(STC89C52芯片) 5. STM32单片机 6. stm32f103zet6开发板实验 1. 单片机概论 0x1: 仿真器 单片机应用系统的软硬件调试需要专门的开发工具,称为"单片机开发系统"或"仿真机".常用的开发方式是把开发系统(例如PC)中的CPU和RAM暂时出借给用户系统,利用开发系统对用户系统的软硬件进行调试(又称仿真),然后将调试好的程序