AVR单片机学习SPI串行口与DS1302

发布者:EtherealEssence最新更新时间:2020-02-07 来源: eefocus关键字:AVR单片机  SPI  串行口  DS1302 手机看文章 扫描二维码
随时随地手机看文章

简介:同步串行口SPI的基本原理
DS1302的接口时序图
DS1302的使用
M16的SPI的使用



SPI基本原理


spi 它是一种最常用的同步串行接口:同步的意思就是利用时钟线对串行数据进行同步在时钟的上升沿或下降沿极性锁存数据.所以它的线至少有时钟线和数据线.


一、同步串行口


利用时钟线对串行数据进行同步


上升沿或者下降沿锁存数据


二、4线SPI:全双工(它的两根数据线一个是收一个是发收发是可以同时进行的,还有2根 SS SCLK SS是用来帧同步的控制线,时钟是SCLK 上升合下降)


SS 、SCLK、MOSI、MISO


三、3线SPI:半双工(半双工,收和发 用同一根 DIO )


SS、SCLK、DIO


四、SPI时序图


五、按照时序图编写IO程序


一、上升沿:


PORTB &= ~(1<<5);


asm("NOP");


PORTB |= (1<<5);


二、下降沿:


PORTB |=(1<<5);


asm("NOP");


PORTB &= ~(1<<5);


下图是DS1302的时序图


从上图可以看到它是属于3线的SPI接口


读操作:


单字节读的时序


在CE它是一个帧同步在空闲的时候它是拉低的,它把CE拉高标示这一帧就要开始,然后在每一个SCLK的上升沿(S估计就是串行的意思CLK时钟)我们看到每个上升沿上标了一个小箭头然后在每个I/O 数据线上,记住前8位叫做输入地址的这样的数据,可以看到在每个时钟的上升沿讲每个数据写入这个DS1302,在这个后8位这个DS1302的I/O口就要有输入状态转变为输出可以看到变成下降沿上了,所以在读数据的时候是在SCLK的下降沿上进行输出的。

然后单片机就可以用I/O将这8位数据一位一位的读回来,一帧2个字节16位结束之后呢?CE这根线就要拉低,表示这一帧结束了


写操作:


这是一个单字节写的时序


它与单字节读非常类似的也是CE 这根线的拉高与拉低表示这一帧数据的开始和结束所不同的是这16位数据都是要输入到DS1302里面去的也就是DS1302这个I/O一直是处于输入状态这个数据呢每个数据都是在每个数据的上升沿之中锁入到DS1302之中、


这个是DS1302的时序图,下面看看ATmega16的SPI接口的时序图





可以看出他有4种模式 上升 下降 有两种 共4种


等后面操作详细讲说时序。


解释:相对于串行数据,SCK的相位合极性有4种组合。CPHA和CPOL控制组合的方式。SPI数据传输格式见Figture 67与Figure 68,每一位数据的移出和移入发生于SCK不同的信号跳变沿,以保证有足够的时间使数据稳定。这个过程在Table 56 和Table 57 有清楚的说明:sample(采样)rising(上升) setup(设置)falling(下降) 呵呵英语不好。


Figure 67 是CPHA =0 时候的传输格式


Figure 68 是CPHA =1 时候的传输格式


ATmega 16 支持以上四种全部的模式 有的是上升沿锁存有的是下降沿锁存这四种模式,这四种模式我们一会在说到ATmega 16 的SPI接口的时候会详细给你们菜鸟说:


好了再看了SPI的时序图之后要怎样按照时序对它编程呢?


在基本的逻辑里面同步都是靠时钟的上升沿来进行同步,也就是说我们需要掌握这个I/O口让他产生一个时钟,它上升沿或者下降沿的方法,上升沿就是低跳变到高,我们以PORTB 它的第五位作为输出口为例来进行讲解,产生上升沿首先它原先必须要是低输出一个低电平0 PORTB =~(1<<5) 拉低 然后一个延迟延迟也可以去掉要看接受方的SPI接受速度是怎么样的了,不过一般的器件它的SPI速率都是非常高的,我们没有必要考虑单片机是否过快对它有所影响因此这个asm("NOP");这条语句可以去掉不过这个是什么意思呢?asm 在C语言中插入一条汇编指令,NOP呢?NOP是汇编语言中的一条空指令表示的是CPU在接下来的一个CPU时钟里面它是什么都不干,干等着这么一个CPU时钟周期,所以就实现一个非常小的延时。然后呢再将PORTB |=(1<<5) 它的第五位拉高,这样就产生一个上升沿,同理下下降沿也是一样的。接下来咱么讲一下DS1302的时序图吧。


DS1302的接口时序图与AVR的接线图

时序图

见DS1302的官方技术文档

与AVR之间的接线图

3线SPI与4线SPI的互联




这个时序图上面已经说过了,那么这个DS1302属于3线的SPI 而ATmega 16 是4线的SPI接口那么3线合4线之间怎样进行互联呢?我们看以采用下面的这种方法。


来看下电路图


上图的PB5 PB6 PB7是单片机的三个I/O口。 可以看他它的第二功能是SPI功能


PB5可以看到MOSI M是主 S 是从 意思就是主机输出 从机输入


同理PB6 MISO 是主机输入从机输出也就是AVR的SPI正常工作的时候PB6这个引脚它应该是处于一个输入的状态PB5应该是一个输出的状态。我们就将PB5 与PB6之间串上一个10K的电阻然后再将PB6直接接到I/O上,下面我们可以简单的分析一下原理图是怎样正常工作的,首先这个DS1302对它处于写的状态的时候呢,DS1302的I/O口是处于输入的,而PB6呢也是一个输入口始终是一个输入口。










关键字:AVR单片机  SPI  串行口  DS1302 引用地址:AVR单片机学习SPI串行口与DS1302

上一篇:简述AVR单片机中断
下一篇:AVR应用经验-经典

推荐阅读最新更新时间:2024-11-11 12:28

时钟芯片DS1302+AT89C2051的红外遥控LED电子钟电路设计与制作
自制LED电子钟在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍的LED电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控制,方便使用。有一路闹铃输出,可以通过遥控器设置闹铃时间及允许与否。 一.工作原理 DS1302为达拉斯公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32768 Hz 晶振 。 AT89C2051作为主控芯片,一是对接收到的红外遥控编码进行判断识别,并执行相应的处理;第二就是定期的读取时钟芯片DS1302中的时间并把小时和肥
[单片机]
时钟芯片<font color='red'>DS1302</font>+AT89C2051的红外遥控LED电子钟电路设计与制作
AVR单片机学习按键与数码管的程序设计
简介:按键与数码管的程序设计 AVR IO口的输入模式与上拉电阻 选择结构语句与按键的查询方式程序设计 数码管基本原理 扫描方式显示多位数码管 一、输入状态IO寄存器设置 1、DDRx 某一位置0,相应位的IO口被设置为输入 2、PORTx某一位置1,使能对应IO口相应位的上拉电阻 3、PINx的对应位是输入的数据,0或1 选择结构语句 一、关系运算符和关系表达式 小于 小于等于 = 大于 大于或等于== 不等于!= 二、逻辑运算符和逻辑表达式 逻辑与&&逻辑或||逻辑非! 三、if 语句结构 if(表达式1)语句1 else if(表达式2)语句2 else 语句3 四
[单片机]
<font color='red'>AVR单片机</font>学习按键与数码管的程序设计
AVR单片机熔丝位配置操作的注意事项
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。有关ATmega128熔丝位的具体定义和功能请查看本书相关章节,在附录中将给出一个完整的汇总表。 (1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。 (2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首
[单片机]
STM32下SPI模式通过MAX7219驱动8位数码管显示模块
借鉴的地方: 1、正点原子的“ALIENTEK MINISTM32 实验20 SPI实验” 2、 STM32 硬件SPI max7219 8位数码管显示模块 http://www.openedv.com/posts/list/46179.htm 工具: STM32F103RCT6开发板;MAX7219 8位数码管显示模块: 数码管模块电路图:(店家https://item.taobao.com/item.htm?spm=a1z09.2.0.0.FiSjlX&id=41059249086&_u=cjnajni5a96提供) MAX7219中文说明可以借鉴: http://wenku.baidu.co
[单片机]
STM32下<font color='red'>SPI</font>模式通过MAX7219驱动8位数码管显示模块
STM32 SPI接口的简单实现
通常SPI通过4个引脚与外部器件相连: ● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。 ● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。 ● SCK:串口时钟,作为主设备的输出,从设备的输入 ●NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为 片选引脚 ,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚
[单片机]
avr单片机DS18B20温度读取程序-母亲节的礼物
/*DS18B20读取温度字节程序 本函数花了我不少时间,主要问题是在51可以的情况下他却不行,知道今天才解决,原来是部分延时函数数值不对,造成的 所以虽然做过也未见得好用,切不可粗心大意,AVR内部8M晶振,20110508 天津第四项目部宿舍 */ #include iom16v.h #define uchar unsigned char #define uint unsigned int #define get_bit(a,b) a&(1 b) #define set_bit(a,b) a|=(1 b) #define clr_bit(a,b) a&=~(1 b) void delay600us() { uin
[单片机]
7脚12864spi单片机源程序,直接函数调用
单片机源程序如下: #include yejin.h const uchar num ={ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/* 0 ,0*/ 0X00,0X00,0X08,0X08,0X1F,0X00,0X00,0X00,0X00,0X00,0X04,0X04,0XFC,0X04,0X04,0X00,/* 1 ,1*/ 0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/* 2 ,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved