Presentation is loading. Please wait.

Presentation is loading. Please wait.

第八章 数据通信.

Similar presentations


Presentation on theme: "第八章 数据通信."— Presentation transcript:

1 第八章 数据通信

2 任课教师:刘忠国 山东大学课程中心网站: 宏晶官方网站: STC单片机编译(汇编)/编程(烧录)/仿真工具说 明书; stc15系列单片机器件手册等 keil μvision软件下载及指导手册(Help→μvision Help) Keil Software –Cx51 编译器用户手册: Cx51编译 器--对传统和扩展的8051微处理器的优化的C 编译器和库参考

3 第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理
第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理 掌握常见串行接口(RS232/RS485/SPI/I2C)的原 理及应用方法 掌握单片机并行接口的扩展方法

4 8.2.4 SPI通信接口 1、SPI接口简介 STC15F2K60S2集成了串行外设接口(Serial Peripheral Interface, 简称SPI)。 SPI接口既可以和其他微处理器通信,也可以与具有 SPI兼容接口的器件,如存储器、A/D转换器、D/A 转换器、LED或LCD驱动器等进行同步通信。 SPI接口有两种操作模式:主模式和从模式。 在主模式中支持高达3Mbit/s的速率; 从模式时速度无法太快,速度在SYSclk/8以内较好。 SPI接口还具有传输完成标志和写冲突标志保护功能。

5 图8-26 STC15F2K60S2单片机的SPI功能方框图

6 STC15F2K60S2单片机的SPI接口结构说明 SPI的核心是一个8位移位寄存器和数据缓冲器,数 据可以同时发送和接收。在SPI数据的传输过程中, 发送和接收的数据都存储在缓冲器中。 对于主模式,若要发送一个字节数据,只需将这个 数据写到SPIDAT寄存器中。主模式下/SS信号不是必 须的。 在从模式下,必须在/SS信号变为有效并接收到合适 的时钟信号后,方可进行数据的传输。在从模式下, 如果一个字节传输完成后,/SS信号变为高电平,这 个字节立即被硬件逻辑标志为接收完成,SPI接口准 备接收下一个数据。

7 3、SPI接口的数据通信 (1)SPI接口的信号 MISO(与P1.4共用),MOSI(与P1.3共用), SCLK(与P1.5), /SS(与P1.2共用) 4根信号线构成SPI接口。SPI接口的引脚可以切换。 MOSI(Master Out Slave In,主出从入) 主器件的输出和从器件的输入,用于主器件到从器 件的串行数据传输。 根据SPI规范,多个从机共享一根MOSI信号线。在 时钟边界的前半周期,主机将数据放在MOSI信号线 上,从机在该边界处获取该数据。

8 3、SPI接口的数据通信 (1)SPI接口的信号 MISO(Master In Slave Out,主入从出)
从器件的输出和主器件的输入。用于实现从器件到 主器件的数据传输。 SPI规范中,一个主机可连接多个从机,因此,主机 的MISO信号线会连接到多个从机上,或者说,多个 从机共享一根MISO信号线。 当主机与一个从机通信时,其他从机应将其MISO 引脚驱动置为高阻状态。

9 3、SPI接口的数据通信 (1)SPI接口的信号 SCLK(SPI Clock,串行时钟信号)
串行时钟信号是主器件的输出和从器件的输入,用 于同步主器件和从器件之间在MOSI和MISO线上的 串行数据传输。 当主器件启动一次数据传输时,自动产生8个SCLK 时钟周期信号给从机。在SCLK的每个跳变处(上 升沿或下降沿)移出一位数据。 一次数据传输可以传输一个字节的数据。

10 (1)SPI接口的信号 SCLK、MOSI和MISO通常用于将两个或更多个 SPI器件连接在一起
如果SPI接口被禁止,即特殊功能寄存器SPCTL 中的SPEN=0(复位值),这些管脚都可作为I/O 口使用。

11 (1)SPI接口的信号 (Slave Select,从机选择信号) 这是一个输入信号。主器件用它来选择处于从模式 的SPI模块。
在主模式下,SPI接口只能有一个主机,不存在主 机选择问题。在该模式下/SS不是必须的。主模式下 通常将主机的/SS引脚通过10kΩ的电阻上拉高电平。 每一个从机的/SS接主机的I/O口,由主机控制电平 高低,以便主机选择从机。 在从模式下,不论发送还是接收,/SS信号必须有效。 因此在一次数据传输开始之前必须将/SS拉为低电平。 SPI主机可用I/O口选择一个SPI器件作为当前从机。

12 (1)SPI接口的信号 SPI从器件通过其/SS脚确定是否被选择。如果满足 下面条件之一,就被忽略:
如果SPI功能被禁止,即SPEN位为0(复位值); 如果SPI配置为主机,即MSTR位为1,并且P1.4配 置为输出(P1M0.4=0, P1M1.4=1); 若/SS脚被忽略, 即SSIG位为1, 该脚用于I/O口功能。 注:即使SPI被配置为主机(MSTR=1), 仍然可通过拉 低/SS脚配置为从机(如果P1.4配置为输入且SSIG=0)。 要使能该特性,应当置位SPIF (SPSTAT.7)。

13 3、SPI接口的数据通信 (2)SPI接口的数据通信方式 STC15F2K60S2单片机SPI接口的数据通信方式有3种: 单主机-单从机方式
双器件方式(器件可互为主机和从机) 单主机-多从机方式。 1)单主机-单从机方式 连接如图所示。

14 (2)SPI接口的数据通信方式 图中, 从机的SSIG (SPCTL.7)为0, 用于选择从机。
SPI主机可用任何端口位(含P1.2/ )来控制从机 脚。 图8-27 SPI接口的单主机-单从机连接方式

15 (2)SPI接口的数据通信方式 主机SPI与从机SPI的8位移位寄存器连成一个循环16位 移位寄存器。
当主机向SPDAT写一字节时, 就启动一连续8位移位通 信过程:主机SCLK脚向从机SCLK脚发一串脉冲,在 该串脉冲驱动下,主机SPI的8位移位寄存器中数据移 到从机8位移位寄存器中。同时从机 8位移位寄存器中 数据移到主机SPI的8位移位寄存器中。由此,主机既 可向从机发送数据,又可由从机中读取数据。

16 (2)SPI接口的数据通信方式 2)双器件方式 双器件方式也称互为主从方式,其连接方式如图所示。 图8-28 SPI接口的双器件连接方式

17 2)双器件方式 图中,两个器件可互为主从。当没有发生SPI操作时, 两个器件都可配置为主机(MSTR=1),将SSIG清零并 将P1.2( )配置为准双向模式。当其中一个器件启 动传输时,可将P1.2配置为输出并驱动为低电平,这 样就强制另一个器件变为从机。

18 2)双器件方式 双方初始化时将自己设置成忽略/SS脚的SPI从模式。 当一方要主动发送数据时,先检测/SS脚的电平,若 /SS脚是高电平,就将自己设置成忽略/SS脚的主模式。 通信双方平时将SPI置成没有被选中的从模式。在该 模式下,MISO、MOSI、SCLK均为输入,当多个 MCU的SPI接口以此模式并联时不会发生总线冲突。 这种特性在互为主从、一主多从等应用中很有用。 注意,互为主从模式时,双方的SPI速率必须相同。 如果使用外部晶体振荡器,双方的晶体频率也要相同。

19 (2)SPI接口的数据通信方式 3)单主机-多从机方式 连接如图所示。 图8-29 SPI接口的单主机-多从机连接方式

20 (2)SPI接口的数据通信方式 图中, 从机的SSIG (SPCTL.7)为0, 从机通过对应的/SS 信号被选中。SPI主机可使用任何端口位(包括P1.2/SS) 来控制从机的/SS。

21 (2)SPI接口的数据通信方式 表8-5 主机和从机的选择
表8-5 主机和从机的选择 STC15单片机进行SPI通信时,主机和从机的选择由SPEN, SSIG, 引脚(P1.2)和MSTR联合控制。主机和从机的选择如表所示。 SPEN SSIG /SS P1.2 MSTR 主或从 模式 MISO P1.4 MOSI P1.3 SCLK P1.5 备 注 X SPI功能禁止 SPI禁止。P1.4/P1.5/P1.6 / P1.7作为普通I/O口使用 1 从机模式 输出 输入 选择作为从机 未被选中 高阻 未被选中。MISO为高阻状态,以避免总线冲突 1→0 输入模式, 若被驱动为低电平且SSIG=0, MSTR位自动清0。 主(空闲) 主机空闲时MOSI和SCLK为高阻态以避免总线冲突。用户须将SCLK上拉或下拉(根据CPOL取值)以避免SCLK出现悬浮状态。 主(激活) 作为主机激活时,MOSI 和SCLK 为推挽输出

22 (3)SPI接口的数据通信过程 作从机时, 若CPHA=0, SSIG必须为0, /SS引脚须取反 且在每个连续的串行字节之间重新设置为高电平。 若SPDAT寄存器在/SS有效(低电平)时执行写操作, 将 导致一写冲突错误,WCOL (SPSTAT.6)标志被置1。 CPHA=0且SSIG=0时的操作未定义。 当CPHA=1时,SSIG可以为1或0。如果SSIG=0, /SS 引脚可在连续传输之间保持有效(即一直为低电平)。 当系统中只有一个SPI主机和一个SPI从机时,这是 首选配置。 SPCTL 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0

23 (3)SPI接口的数据通信过程 在SPI通信中,数据传输总是由主机启动的。如果 SPI使能(SPEN=1),主机对SPI数据寄存器的写操 作将启动SPI时钟发生器和数据的传输。在数据写 入SPDAT之后的半个到一个SPI位时间后,数据 将出现在MOSI引脚。 需注意的是,主机可以通过将对应器件的/SS引脚 驱动为低电平实现与之通信。写入主机SPDAT寄 存器的数据从MOSI脚移出并发送到从机的MOSI 引脚。同时,从机SPDAT寄存器的数据从MISO 引脚移出并发送到主机的MISO引脚。

24 (3)SPI接口的数据通信过程 传输完一个字节后,SPI 时钟发生器停止,传输完 成标志(SPIF)置位并产生一个中断(若SPI中断使能)。
主机和从机CPU的两个移位寄存器可以看作是一个 16位循环移位寄存器。当数据从主机移位传送到从 机的同时,数据也以相反的方向移入。这意味着在 一个移位周期中,主机和从机的数据相互交换。 SPI状态寄存器(SPSTAT) 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL -

25 3、SPI接口的数据通信 (4)通过/SS改变模式 如果SPEN=1,SSIG=0且MSTR=1,SPI使能为主机 模式。
/SS引脚可配置为输入或准双向模式。这种情况下, 另外一个主机可将该引脚驱动为低电平,从而将该 器件选择为SPI从机并向其发送数据。 SPI控制寄存器SPCTL 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0

26 (4)通过/SS改变模式 为避免争夺总线,SPI系统执行以下动作:
MSTR清0并且CPU变成从机。这样SPI就变成从 机。MOSI和SCLK强制变为输入模式,而MISO 则变为输出模式。 SPSTAT的SPIF标志位置位。如果SPI中断已被使 能,则产生SPI中断。 用户程序必须一直对MSTR位进行检测,如果该 位被一个从机选择清零而用户想继续将SPI作为主 机,就必须重新置位MSTR,否则将进入从机模 式。

27 3、SPI接口的数据通信 (5)SPI中断 如果允许SPI中断,发生SPI中断时,CPU就会跳 转到中断服务程序的入口地址004BH处执行中断 服务程序。 注意,在中断服务程序中,必须把SPI中断请求标 志清0。

28 3、SPI接口的数据通信 (6)写冲突 SPI在发送时为单缓冲,在接收时为双缓冲。这样 在前一次发送尚未完成之前,不能将新的数据写入 移位寄存器。 当发送过程中对数据寄存器进行写操作时, WCOL 位将置位以指示数据冲突。在这种情况下,当前发 送的数据继续发送,而新写入的数据将丢失。

29 (6)写冲突 当对主机或从机进行写冲突检测时,主机发生写冲 突的情况很罕见,因主机拥有数据传输的完全控制 权。但从机有可能发生写冲突,因为当主机启动传 输时,从机无法进行控制。 接收数据时,接收到的数据传送到一个并行读数据 缓冲区,这样将释放移位寄存器以进行下一数据的 接收。但必须在下个字符完全移入之前从数据寄存 器中读出接收到的数据,否则,前一个接收数据将 丢失。 WCOL可通过软件向其写入“1”清0。

30 3、SPI接口的数据通信(7)数据格式 数据格式与SPI控制寄存器SPCTL的CPHA和CPOL有关:
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 时钟相位控制位CPHA用于设置采样和改变数据的时 钟SCLK的边沿。 时钟极性控制位CPOL用于设置时钟SCLK的极性。 SPI接口时钟信号线SCLK有Idle和Active两种状态: Idle: 不进行数据传输时(或数据传完后)SCLK所处状态; Active: 是与Idle相对的一种状态。

31 3、SPI接口的数据通信(7)数据格式 时钟极性控制位CPOL用于设置时钟SCLK的极性。
CPOL=0: Idle状态=低电平, Active状态=高电平。 CPOL=1: Idle状态=高电平, Active状态=低电平。 从Idle状态到Active状态的转变, 称为SCLK前沿; 从Active状态到Idle状态的转变, 称为SCLK后沿。 一个SCLK前沿和后沿构成一个SCLK时钟周期, 一个 SCLK时钟周期传输一位数据。 主机总是在SCLK=Idle状态时, 将下一位要发送的数 据置于数据线MOSI上。

32 3、SPI接口的数据通信(7)数据格式 SPI时钟相位选择控制位CPHA用于设置采样和改变 数据的时钟SCLK的边沿:
CPHA=1: 数据在时钟SCLK的前沿驱动到SPI口线, SPI 模块在时钟后沿采样。 CPHA=0: 数据在/SS为低 (SSIG=0) 时驱动到SPI口线, 在 时钟SCLK的后沿被改变, 并在时钟前沿被采样。 ( 注: SSIG=1时的操作未定义 ) 不同的CPHA, 主机和从机对应数据格式如下列图所示。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0

33 (7)数据格式 图8-30 CPHA=0时SPI从机传输格式

34 (7)数据格式 CPHA=1时SPI从机传输格式 图8-31 CPHA=1时SPI从机传输格式

35 (7)数据格式 CPHA=0时SPI主机传输格式 图8-32 CPHA=0时SPI主机传输格式

36 (7)数据格式 CPHA=1时SPI主机传输格式 图8-33 CPHA=1时SPI主机传输格式

37 3、SPI接口的数据通信 (8)SPI时钟预分频器选择 SPI时钟预分频器选择是通过SPCTL寄存器的SPR1, SPR0位实现的。
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 SPR1 SPR0 时钟(SCLK) tCLK/4 1 tCLK/16 tCLK/64 tCLK/128 表8-6 SPI时钟频率的选择

38 4. SPI接口的应用举例 (1)SPI相关的特殊功能寄存器 1)SPI控制寄存器(SPCTL)
SPICTL(地址为CEH,复位值为00H)各位定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 ①SSIG:引脚忽略控制位。 1:由MSTR位确定器件为主机还是从机。 0:由/SS脚用于确定器件为主机还是从机。/SS脚可 作为I/O口使用。

39 D7 D6 D5 D4 D3 D2 D1 D0 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0
(1)SPI相关的特殊功能寄存器 1)SPI控制寄存器(SPCTL) 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 ②SPEN: SPI使能位。 1:SPI使能。 0:SPI被禁止,所有SPI管脚都作为I/O口使用。 ③DORD:设定数据发送和接收的位顺序。 1:数据字的最低位(LSB)最先传送; 0:数据字的最高位(MSB)最先传送。

40 1)SPI控制寄存器(SPCTL) D7 D6 D5 D4 D3 D2 D1 D0 SSIG SPEN DORD MSTR CPOL
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 ④MSTR:SPI主/从模式选择位。 ⑤CPOL:SPI时钟极性。 1:SPI空闲时SCK=1。SCLK的前时钟沿为下降沿 而后沿为上升沿。 0:SPI空闲时SCK=0。SCLK的前时钟沿为上升沿 而后沿为下降沿。

41 1)SPI控制寄存器(SPCTL) D7 D6 D5 D4 D3 D2 D1 D0 SSIG SPEN DORD MSTR CPOL
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 ⑥CPHA:SPI时钟相位选择控制。 1:数据在SCLK的前时钟沿驱动到SPI口线,SPI模 块在后时钟沿采样。 0:数据在/SS为低 (SSIG=0) 时驱动到SPI口线,在 SCLK的后时钟沿被改变,并在前时钟沿被采样。 (注:SSIG=1时的操作未定义)

42 1)SPI控制寄存器(SPCTL) D1 D0 SPR1 SPR0
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 ⑦SPR1:与SPR0联合构成SPI时钟速率选择控制位。 ⑧SPR0:与SPR1联合构成SPI时钟速率选择控制位。 表8-6 SPI时钟频率的选择 SPR1 SPR0 时钟(SCLK) tCLK/4 1 tCLK/16 tCLK/64 tCLK/128

43 (1)SPI相关的特殊功能寄存器 2)SPI状态寄存器(SPSTAT) SPSTAT (地址: CDH, 复位值: 00XXXXXXB)各位定义: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL - ①SPIF:SPI传输完成标志。 当一次传输完成时, SPIF被置位。此时, 若SPI中断被 打开(即ESPI (IE2.1)=1, EA (IE.7)=1 ), 将产生中断。 当SPI处于主模式且SSIG=0时, 如果为输入并被驱动为 低电平,SPIF也将置位,表示“模式改变”。 SPIF标志通过软件向其写入1而清0。

44 2)SPI状态寄存器(SPSTAT) 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL -
②WCOL:SPI写冲突标志。 当一个数据还在传输时,又向数据寄存器SPDAT写 入数据,WCOL将被置位。 WCOL 标志通过软件向其写入1而清0。 ③位5-位0:保留。

45 (1)SPI相关的特殊功能寄存器 3)SPI数据寄存器(SPDAT) SPDAT (地址为CFH, 复位值为00H)各位的定义如下: 位号
位名称 MSB LSB 位7-位0:保存SPI通信数据字节。其中,MSB为最高位, LSB为最低位。

46 4. SPI接口的应用举例 (2)编程实例 SPI接口的使用包括SPI接口的初始化和SPI中断服 务程序的编写。
通过SPI控制寄存器SPCTL设置:/SS引脚的控制、 SPI使能、数据传送的位顺序、设置为主机或从机、 SPI时钟极性、SPI时钟相位、SPI时钟选择。 具体内容请参见SPI控制寄存器SPCTL介绍。

47 SPI接口的初始化包括以下几个方面: 清0寄存器SPSTAT中的标志位SPIF和WCOL (向这两个标志位写1即可清零)。 开放SPI中断(IE2中的ESPI=1,IE2寄存器不能 位寻址,可以使用“或”指令)。 开放总中断(IE中的EA=1)。 SPI中断服务程序根据实际需要进行编写。需注意 的是,在中断服务程序中首先需要将标志位SPIF和 WCOL清0。因为SPI中断标志不会自动清除。

48 4. SPI接口的应用举例 【例8-7】 单主机-单从机通信方式应用举例。
计算机向主单片机发送一串数据, 主单片机的RS-232 串口每收到一个字节就立刻将收到的字节通过SPI口 发送到从单片机中; 与此同时主单片机收到从单片机发回的一个字节,主 单片机把收到的这个字节通过RS-232口发送到计算 机。可以使用串口助手观察结果。 从单片机的SPI口收到数据后,把收到的数据放到自 己的SPDAT寄存器中,当下一次主单片机发送一个 字节时把数据发回到主单片机。

49 【例8-7】 单主机-单从机通信方式应用举例。
硬件连接如图所示。 图8-34 单主机-单从机SPI通信实验电路图

50 【例8-7】 单主机-单从机通信方式应用举例 解:经计算,当SYSclk=18.432MHz, PCON.7(SMOD)=0 (波特率不加倍), 波特率为57600bps时的重装时间常 数为F6H。具体计算: 串行口1用定时器1作为波特率发生器且定时器1工作 于模式2(8位自动重装模式),且T1x12 = 1时: 串口1的波特率= × SYSclk / ( TH1) 即:57600= / ( TH1)/32 所以,TH1 =F6H 在主机的主程序中, 使用查询方法查询UART口是否 接收到数据。

51 $INCLUDE (STC15.INC) ;包含寄存器定义文件 ;MASTER EQU 1 ;汇编后程序代码下载到主单片机
【例8-7】 单主机-单从机通信方式应用举例 汇编语言程序如下: $INCLUDE (STC15.INC) ;包含寄存器定义文件 ;定义常量,根据MASTER_SLAVE的值,选择下载不同的程序 ;MASTER EQU 1 ;汇编后程序代码下载到主单片机 MASTER EQU 0 ;汇编后程序代码下载到从单片机 ;定义变量 Flags EQU 20H SPI_Receive EQU Flags ;SPI 端口收到数据标志位 SPI_buffer EQU 30H ;变量用于保存 SPI 端口收到的数据

52 【例8-7】 单主机-单从机通信方式应用举例 ORG 0000H LJMP MAIN ORG 004BH ;SPI中断服务程序入口 LJMP SPI_ISR ORG 0060H MAIN: MOV SP, #70H ;设置堆栈指针 IF MASTER==1 ;从机不需要UART通信,不需要初始化 ; 初始化串口 MOV SCON, #50H ;0101,0000 8位可变波特率, 无奇偶校验 MOV TMOD, #21H ;T1为自动重装模式 MOV TH1, #0F6H MOV TL1, #0F6H MOV AUXR, # B ;T1计数速度 1T,是普通8051的12倍 ;即波特率 = 4800*12=57600 SETB TR1 ;启动定时器1 开始计数

53 ;----------------初始化SPI--------------------------------
【例8-7】 单主机-单从机通信方式应用举例 ; 初始化SPI MOV SPCTL, # B ;0FCH, 忽略/SS脚, 设为主机 ;SSIG=1: 忽略/SS脚; SPEN=1: 允许SPI工作 ;DORD=1: 先传低位LSB; MSTR=1: 设为主机 ;CPOL=1: SPI 空闲时SCLK=1, 前跳变沿是下降沿, ;后跳变沿是上升沿 ;CPHA=1: 数据由SCLK前跳变沿驱动到SPI口线, ; SPI模块在后跳变沿采样 ;SPR1, SPR0=00: 主模式时SPI时钟源选择为CPU_CLK/4 ELSE ;从机SPI控制字设置(续后…)

54 【例8-7】 单主机-单从机通信方式应用举例 ELSE ;从机SPI控制字设置(续) ENDIF
MOV SPCTL, # B ;0ECH, 忽略/SS脚, 设为从机 ;SSIG=1: 忽略/SS脚 ;SPEN=1:允许SPI工作 ;DORD=1:先传送低位LSB ;MSTR=0: 设为从机 ;CPOL=1: SPI空闲时SCLK=1, 前跳变沿是下降沿, ;后跳变沿是上升沿 ;CPHA=1: 数据由SCLK前跳变沿驱动到SPI口线, ;SPI模块在后跳变沿采样 ;SPR1, SPR0=00: 主模式时SPI时钟源选择为CPU_CLK/4 ENDIF

55 【例8-7】 单主机-单从机通信方式应用举例 MOV SPSTAT, # B ;清零标志位SPIF和WCOL ORL IE2, # B ;令ESPI(IE2.1)=1,允许SPIF产生中断 MOV Flags, #0 ;清标志字 SETB EA ;开总中断 ; 主循环 IF MASTER == 1 Check_RS232: JNB RI, Check_SPI ;判断RS232串口中收到数据否 MOV A, SBUF ;取RS232串口中收到的数据累加器A CLR RI ;主单片机将累加器 A 中的数据发送到从机SPI ANL IE2,#0FDH ; 令ESPI(IE2.1)=0,禁止SPIF产生中断 MOV SPDAT, A ;SPI 发送数据

56 【例8-7】 单主机-单从机通信方式应用举例 SPI_Wait: MOV A, SPSTAT ;等待SPIF=1, 即等待SPI发送完毕 ANL A, #80H JZ SPI_Wait ORL IE2, # B ;令ESPI(IE2.1)=1,允许SPIF产生中断 LJMP Check_RS232 Check_SPI: JNB SPI_Receive, Check_RS232 ;判是否收到从机SPI发回数据 MOV A, SPI_buffer ;将"从机SPI发回的数据"送到累加器A CLR SPI_Receive ;清0主单片机SPI端口收到数据标志位 ;将接收到的数据从RS232串口发送到计算机 CLR TI ;清零串口发送中断标志 MOV SBUF, A

57 【例8-7】 单主机-单从机通信方式应用举例 RS232_Wait: JNB TI, RS232_Wait ;等待发送完毕 CLR TI ;清0串口发送中断标志 LJMP Check_RS232 ELSE Check_SPI: JNB SPI_Receive, Check_SPI ;判是否收到主 SPI 发回数据 ;从单片机SPI端口收到新的数据 MOV A, SPI_buffer ;取 "主单片机 SPI 端口发的数据" CLR SPI_Receive ;清0从单片机 SPI 端口收到数据标志位 MOV SPDAT, A ;将收到数据送 SPDAT,下一次通讯时发回 LJMP Slave_Check_SPI ENDIF

58 【例8-7】 单主机-单从机通信方式应用举例 ; SPI中断服务程序 SPI_ISR: ;SPI中断服务程序 MOV SPSTAT, # B ;0C0H,清0标志位SPIF和WCOL MOV A, SPDAT ;保存收到的数据 MOV SPI_buffer, A SETB SPI_Receive ;设置SPI 端口收到数据标志 RETI ; END 汇编程序改为C语言版本。

59 【例8-8】 单主机-多从机通信方式应用举例。
主单片机用P5.1和P5.2选择当前选中的从单片机, 每 一时刻只有一个从单片机被选中。 P5.1用于选中#1从单片机; P5.2用于选中#2从单片机。 计算机向主单片机发送一串数据,主单片机的RS-232 串行口每收到一个字节就立刻将收到的数据字节通过 SPI口发送到当前选中的从单片机中。 #1单片机将SPI口收到的数据再放到自己的SPDAT寄 存器中,当下一次主单片机发送一个字节时把数据发 回到主单片机;

60 【例8-8】 单主机-多从机通信方式应用举例。
#2从单片机将SPI口收到的数据加1以后再放到自己的 SPDAT寄存器中,当下一次主单片机发送一个字节时 把数据发回到主单片机。 #1从单片机和#2从单片机每隔2秒钟轮换一次。主单 片机把收到的这个字节通过 RS-232口发送到计算机。 在串行口调试助手接收区观察接收的数据。 晶振频率SYSclk=18.432MHz,计算机RS232串行口 波特率设置为57600bps。

61 【例8-8】 单主机-多从机通信方式应用举例 硬件连接如图8-35所示。 图8-35 单主机-多从机SPI通信实验电路图

62 【例8-8】 单主机-单从机通信方式应用举例 解:经计算,当SYSclk=18.432MHz, PCON.7(SMOD)=0 (波特率不加倍), 波特率为57600bps时的重装时间常 数为F6H。具体计算: 串行口1用定时器1作为波特率发生器且定时器1工作 于模式2(8位自动重装模式),且T1x12 = 1时: 串口1的波特率= × SYSclk / ( TH1) 即:57600= / ( TH1)/32 所以,TH1 =F6H 在主机的主程序中, 使用查询方法查询UART口是否 接收到数据。

63 $INCLUDE (STC15.INC) ;包含寄存器定义文件 MASTER_SLAVE EQU 0 ;汇编后程序代码下载到主单片机
【例8-8】 单主机-多从机通信方式应用举例 汇编语言程序如下: $INCLUDE (STC15.INC) ;包含寄存器定义文件 ;定义常量,根据MASTER_SLAVE的值,选择下载不同的程序 MASTER_SLAVE EQU 0 ;汇编后程序代码下载到主单片机 ;MASTER_SLAVE EQU 1 ;汇编后代码下载到从单片机#1 ;MASTER_SLAVE EQU 2 ;汇编后代码下载到从单片机#2 ;定义变量 Slave1_SS EQU P5.1 Slave2_SS EQU P5.2 Flags EQU 20H SPI_Receive EQU Flags ;SPI 端口收到数据标志位 T0_10MS EQU 30H ;变量保存 10 毫秒计数(T0 中断次数) SPI_buffer EQU 31H ;变量用于保存 SPI 端口收到的数据

64 【例8-8】 单主机-多从机通信方式应用举例 ORG 0000H LJMP MAIN ORG 000BH ;定时器0 中断服务程序入口 LJMP T0_ISR ORG 004BH ;SPI中断服务程序入口 LJMP SPI_ISR ORG 0060H MAIN: MOV SP, #70H ;设置堆栈指针 ; 初始化串口和定时器 MOV SCON, #50H ;0101,0000 8位可变波特率, 无奇偶校验 MOV TMOD, #21H ;T1为自动重装模式, T0为16位定时器模式 MOV TH0, #0C4H MOV TL0, #00H ;重装数 = = = C400H ;晶振频率=18.432MHz时,每10mS中断1次

65 【例8-8】 单主机-多从机通信方式应用举例 MOV TH1, #0F6H MOV TL1, #0F6H MOV AUXR, # B ;T1计数速度 1T,是普通8051的12倍 ;即波特率 = 4800*12=57600 SETB TR1 ;启动定时器1 开始计数 SETB TR0 ;启动T0 SETB ET0 ;开T0中断 ; 初始化SPI IF MASTER_SLAVE == ;主机SPI控制字设置 MOV SPCTL, # B ;0FCH, 忽略/SS脚, 设为主机 ;SSIG=1: 忽略/SS脚 ; SPEN=1: 允许SPI工作 ; DORD=1: 先传LSB ;MSTR=1: 设为主机; ;CPOL=0: SPI 空闲SCLK=0,前跳变是上升沿, 后跳变是下降沿 ;CPHA=0: 数据由SCLK后跳变沿驱动到SPI口线, SPI模块在前 ;跳变沿采样;SPR1, SPR0=00: 主模式时SPI时钟源选择为Fosc/4 ELSE ;从机SPI控制字设置(续后…)

66 【例8-8】 单主机-多从机通信方式应用举例 ; 初始化SPI(续) ELSE ;从机SPI控制字设置 MOV SPCTL,# B ;6CH, 为从机, 由脚决定是否被选中 ;SSIG=0:由脚决定主模式或从模式; SPEN=1:允许 SPI 工作; ;DORD=1:先传低LSB; MSTR=0: 设为从机 ;CPOL=0: SPI 空闲时SCLK=0, 前跳变沿是上升沿,后跳变沿是 下降沿 ;CPHA=0: 数据由SCLK后跳变沿驱动到SPI口线, SPI模块在前 跳变沿采样; ;SPR1, SPR0 = 00: 主模式时 SPI 时钟源选择为 Fosc/4 ENDIF

67 【例8-8】 单主机-多从机通信方式应用举例 MOV SPSTAT, # B ;清零标志位SPIF和WCOL ORL IE2, # B ;令ESPI(IE2.1)=1,允许SPIF产生中断 MOV Flags, #0 ;清标志字 SETB EA ;开总中断 MOV T0_10MS, #200 ;T0中断计数(10ms×200=2秒) IF MASTER_SLAVE == 0 CLR Slave1_SS ;选择从单片机 #1 为当前的从单片机 Check_RS232: JNB RI, Check_SPI ;判断RS232串口中收到数据否 MOV A, SBUF ;取RS232串口中收到的数据累加器A CLR RI

68 ANL IE2,#0FDH ; 令ESPI(IE2.1)=0,禁止SPIF产生中断
【例8-8】 单主机-多从机通信方式应用举例 ;主单片机将累加器 A 中的数据发送到从机SPI ANL IE2,#0FDH ; 令ESPI(IE2.1)=0,禁止SPIF产生中断 MOV SPDAT, A ;SPI 发送数据 SPI_Wait: MOV A, SPSTAT ;等待SPIF=1, 即等待SPI发送完毕 ANL A, #80H JZ SPI_Wait ORL IE2, # B ;ESPI(IE2.1)=1,允许SPIF产生中断 LJMP Check_RS232

69 【例8-8】 单主机-多从机通信方式应用举例 Check_SPI: RS232_Wait:
JNB SPI_Receive, Check_RS232 ;判是否收到从机SPI发回数据 ;主单片机SPI端口收到新的数据 MOV A, SPI_buffer ;将"从机SPI发回的数据"送到累加器A CLR SPI_Receive ;清零主单片机SPI端口收到数据标志位 ;将累加器 A 中的数据发送到计算机 CLR TI ;清零串口发送中断标志 MOV SBUF, A RS232_Wait: JNB TI, RS232_Wait ;等待发送完毕 CLR TI ;清零串口发送中断标志 LJMP Check_RS232

70 【例8-8】 单主机-多从机通信方式应用举例 ELSE Slave_Check_SPI:
JNB SPI_Receive, Slave_Check_SPI ;判收到主 SPI 发回数据否 ;从单片机SPI端口收到新的数据 MOV A, SPI_buffer ;取 "主单片机 SPI 端口发的数据" CLR SPI_Receive ;清0从单片机 SPI 端口收到数据标志位 IF MASTER_SLAVE == 2 ADD A, # ;如果是从单片机 #2,就把收到的数据加1 ENDIF MOV SPDAT, A ;将收到数据送 SPDAT,下一次通讯时发回 SJMP Slave_Check_SPI

71 【例8-8】 单主机-多从机通信方式应用举例 IF MASTER_SLAVE == 0 T0_ISR: T0_Exit: RETI
PUSH PSW ;保存断点现场 PUSH ACC MOV TH0, #0C4H ;重装时间常数 MOV TL0, #00H DJNZ T0_10MS,T0_Exit MOV T0_10MS, # ;恢复T0中断计数值 CPL Slave1_SS ;改变当前选择的从单片机 CPL Slave2_SS T0_Exit: POP ACC ;恢复断点现场 POP PSW RETI 【例8-8】 单主机-多从机通信方式应用举例

72 【例8-8】 单主机-多从机通信方式应用举例 ELSE ;从机程序不需要定时器T0 T0_ISR: RETI ENDIF ; SPI中断服务程序 SPI_ISR: ;SPI中断服务程序 MOV SPSTAT, # B ;0C0H, SPIF和WCOL清0 MOV A, SPDAT ;保存收到的数据 MOV SPI_buffer, A SETB SPI_Receive ;设置SPI 端口收到数据标志 ; END

73 【例8-9】 双器件通信方式应用举例。 双器件通信方式就是可互为主机和从机的通信方式。
主单片机用P1.2和P1.3选择当前选中的从单片机, 每 一时刻只有一个从单片机被选中。 P1.2用于选中#1从单片机;P1.3用于选中#2从单片机。 计算机向主单片机发送一串数据,主单片机的RS- 232串口每收到一个字节就立刻将收到的字节通过SPI 口发送到当前选中的从单片机中。 #1单片机将SPI口收到的数据再放到自己的SPDAT寄 存器中,当下一次主单片机发送一个字节时把数据发 回到主单片机。

74 【例8-9】 双器件通信方式应用举例 #2从单片机将SPI口收到的数据加1以后再放到自己 的 SPDAT寄存器中,当下一次主单片机发送一个 字节时把数据发回到主单片机。 #1从单片机和#2从单片机每隔2秒钟轮换一次。 主单片机把收到的这个字节通过 RS232口发送到计 算机。在串口调试助手接收区观察接收的数据。 晶振频率SYSclk=18.432MHz,计算机RS232串口波 特率设置为57600bps。 硬件连接如图8-36所示。

75 【例8-9】 双器件通信方式应用举例 硬件连接如图8-36所示。 图8-36 互为主/从通信方式电路图

76 【例8-9】 双器件通信方式应用举例 解:经计算,当SYSclk=18.432MHz,PCON.7=0(波 特率不加倍),波特率为57600bps时的重装时间常数 为F6H。 在主机的主程序中,使用查询的方法查询UART口是 否接收到数据。

77 【例8-9】 双器件通信方式应用举例 $INCLUDE (STC15.inc) ;包含STC15F2K60S2寄存器定义文件 SS EQU P1.2 ;定义SPI的脚 ; 定义 SPI 模式常量 CONFIG_MASTER EQU B ;忽略 SS 脚的主模式 CONFIG_SLAVE EQU B ;SS脚用于确定器件为主机还是从机。 ;SS=1时为未选从模式,没有总线冲突,MISO、MOSI和SPICLK为输入 ;SS=0时为从模式,MISO为输出,MOSI和SPICLK为输入 ; 定义变量 Flags EQU 20H SPI_Receive EQU Flags.0 ;收到数据标志 TimeOver EQU Flags.1 ;RS232 接收下一个字节超时 Rec_buffer EQU 21H ;缓冲区指针 Rec_Number EQU 22H ;已接收数据长度 SPI_buffer EQU 23H ;保存 SPI 接口收到的数据 Time_Over EQU 24H ;超时计数

78 【例8-9】 双器件通信方式应用举例 ORG 0000H LJMP MAIN ORG 000BH ;定时器0中断服务程序入口 LJMP T0_ISR ORG 004BH ;SPI中断服务程序入口 LJMP SPI_ISR ORG 0080H MAIN: MOV SP, #70H ; 初始化串口 MOV SCON, #50H ;8位可变波特率, 无奇偶校验 MOV TMOD, #21H ;T1 为自动重装模式 MOV TH1, #0F6H MOV TL1, #0F6H MOV AUXR, #40H ;定时器1以1T的速度计数 ;波特率=4800*12=57600 SETB TR1

79 【例8-9】 双器件通信方式应用举例 ; 初始化 SPI MOV SPCTL,#CONFIG_SLAVE MOV SPSTAT,# B ;清零标志位SPIF和WCOL ORL IE2,#02H ;ESPI=1,允许SPIF产生中断 ; MOV Flags, #0 ;清标志字 SETB ET0 ;开 T0 中断 SETB EA ;开总中断

80 【例8-9】 双器件通信方式应用举例 ; Check_Receive: JB RI, RS232_GetFirstByte ;RS232收到第一个字节 JB SPI_Receive, SPI_GetFirstByte ;SPI收到第一个字节 LJMP Check_Receive ;循环 RS232_GetFirstByte: ;RS232收到第一个字节 MOV Rec_buffer, #30H MOV Rec_Number, #0B0H ;最多接收176个字节, ;否则会破坏栈的内容 RS232_Received: ;RS232 收到一个字节 MOV R0, Rec_buffer ;保存收到的字节 SBUF CLR RI DJNZ Rec_Number, RS232_Rec_Next ;判断接收缓冲区是否已满 LJMP SPI_Send ;接收缓冲区满,跳转 RS232_Rec_Next: ;准备接收下一个字节 INC Rec_buffer MOV TH0, #0 SETB TR0 ;启动 T0 CLR TimeOver RS232_GetNextByteWait: ;等待 RS232 传来的下一个字节 JB TimeOver, SPI_Send ;超时,用SPI发送RS232收到的字节 JB RI, RS232_Received LJMP RS232_GetNextByteWait

81 【例8-9】 双器件通信方式应用举例 ; SPI_Send: ;用SPI口发送RS232收到的字节 MOV A, #0B0H ;计算收到的字节数-->R2 CLR C SUBB A, Rec_Number MOV R2, A MOV R0, #30H LCALL ChangeToMast ;切换到忽略 SS 脚的主模式 JC ExitMast ;切换失败, 跳转 SPI_Send_Loop: MOV LCALL SPI_Send_Byte ;将 A 中的数据发送到从 SPI INC R0 DJNZ R2, SPI_Send_Loop ExitMast: CLR TR0 LCALL ChangeToSlave ;SPI 接口切换到未选中的从模式 LJMP Check_Receive

82 【例8-9】 双器件通信方式应用举例 ; SPI_GetFirstByte: ;SPI 收到第一个字节 MOV Rec_buffer, #30H MOV Rec_Number, #0B0H ;最多接收176个字节 SPI_Received: ;SPI 收到一个字节 MOV R0, Rec_buffer ;保存收到的字节 SPI_buffer CLR SPI_Receive DJNZ Rec_Number, SPI_Rec_Next ;判断接收缓冲区是否已满 LJMP RS232_Send ;接收缓冲区满,跳转 SPI_Rec_Next: ;准备接收下一个字节 INC Rec_buffer MOV TH0, #0 SETB TR0 ;启动 T0 CLR TimeOver SPI_GetNextByteWait: ;等待 SPI 传来的下一个字节 JB TimeOver, RS232_Send ;超时,用RS232发送SPI收到的字节 JB SPI_Receive, SPI_Received LJMP SPI_GetNextByteWait

83 【例8-9】 双器件通信方式应用举例 ; RS232_Send: ;用 RS232口发送SPI收到的字节 MOV A, #0B0H ;计算收到的字节数-->R2 CLR C SUBB A, Rec_Number MOV R2, A MOV R0, #30H RS232_Send_Loop: MOV LCALL RS232_Send_Byte ;将 A 中的数据发送到计算机 INC R0 DJNZ R2, RS232_Send_Loop LJMP Check_Receive

84 【例8-9】 双器件通信方式应用举例 ; ChangeToMast: ;切换到忽略 SS 脚的主模式 SETB SS ;如果 SS 脚未被拉低, 就切换 JB SS, ChangeToMast_a SETB C ;切换到主模式失败 RET ChangeToMast_a: ANL IE2,#0FDH ;ESPI(IE2.1)=0,禁止SPIF产生中断 MOV SPCTL,#CONFIG_MASTER ;忽略 SS 脚, 设为主机。 MOV SPSTAT,# B ;清标志位 SPSTAT CLR SS ;拉低 SS 脚, 使对方成为从模式 CLR C ;本机切换到主模式成功

85 【例8-9】 双器件通信方式应用举例 ; ChangeToSlave: ;SPI 接口切换到未选中的从模式 SETB SS ;释放SS脚 MOV SPCTL,#CONFIG_SLAVE MOV SPSTAT,# B ;清标志位 SPSTAT ORL IE2,#02H ;ESPI=1,允许SPIF产生中断 RET

86 【例8-9】 双器件通信方式应用举例 ; 将A中的数据发送到计算机 RS232_Send_Byte: CLR TI ;清零串口发送中断标志 MOV SBUF, A JNB TI, $ ;等待发送完毕, 未发送完毕跳回本行 CLR TI ;清0串口发送中断标志 RET ; 将A中的数据发送到从机SPI SPI_Send_Byte: MOV SPDAT, A SPI_Send_Byte_Wait: MOV A, SPSTAT ANL A, #80H JZ SPI_Send_Byte_Wait;等待 SPIF=1 即等待 SPI 发送完毕 MOV SPSTAT,# B ;清标志位SPSTAT ; 定时器0中断服务程序 T0_ISR: SETB TimeOver RETI

87 【例8-9】 双器件通信方式应用举例 ; SPI 中断服务程序 SPI_ISR: MOV SPI_buffer, SPDAT ;保存收到的数据 MOV SPSTAT, # B ;0C0H, 清0标志位 SPIF 和 WCOL SETB SPI_Receive ;设置SPI端口收到数据标志 RETI ; END

88 I2C通信接口 1、I2C总线简介 I2C(Inter-Integrated Circuit)总线是由PHILIPS 公司开发的串行总线,用于连接微控制器及其外围 设备。 I2C总线产生于二十世纪80年代,最初为音频和视 频设备开发,如今主要在服务器管理中使用,其中 包括单个组件状态的通信。 例如,管理员可对各个组件进行查询,以管理系统 的配置或掌握组件的功能状态,如电源和系统风扇。 可随时监控内存、硬盘、网络、系统温度等多个参 数,增加了系统的安全性,方便了管理。


Download ppt "第八章 数据通信."

Similar presentations


Ads by Google