logo
 
首页-> 产品信息-> 8位单片机
 
入门指南
开发&工具
应用方案
客户支持
 
学习e条龙
一、单片机简介 二、指令系统 三、IO端口 四、中断系统
五、定时/计数器 六、串行接口 七、模拟外设 八、其它硬件
九、开发工具 十、应用实例 十一、附录  

串行接口原理及应用

内容索引
6.1 SPMC65系列单片机的串行接口 6.4 IIC接口
6.2 SPI接口  
6.3 UART接口  

6.1  SPMC65 系列单片机的串行接口

  SPMC65 系列单片机共提供了三种串行接口模块,即:

  •  SPI ( Serial Peripheral Interface )串行外设接口;

  •  标准全双工 UART 通用异步收发器;

  •  IIC ( Inter-Integrated Circuit )内部集成电路总线。

  用户可以方便地使用 SPMC65 提供的串行接口模块,与各种串行外设进行通讯、数据交换等;常用的就有 24 系列 EEPROM 、单片机之间 UART 组网通讯、单片机与 PC 机进行串行通讯等。

  SPMC65 系列单片机的三种串行接口模块与端口 C 复用端口,具体分布如表 7.1 。

表 6 . 1 端口 C 特殊功能复用对照

管脚

特殊功能

PC7

IIC 总线数据输入 / 输出

PC6

IIC 总线时钟输入

PC5

UART 接收信号

PC4

UART 发送信号

PC3

SPI 数据输出

PC2

SPI 数据输入

PC1

SPI 时钟输出 / 时钟输入

PC0

SPI 从机模式选择

  具体型号芯片的串行接口资源请参考具体型号芯片的数据手册,如在 SPMC65P2408A 中集成了 SPI 和 UART 两个串行接口模块。

6.2 SPI接口

6.2.1 SPI 接口简述

  SPI(Serial Peripheral Interface) 即串行外设接口,是一种高速同步的串行接口,可以串行接收或发送数据,支持主从机之间的全双工同步传输,传输速率可编程设定。在 SPMC65 系列单片机中, SPI 模块有 4 个管脚(与端口 C 的低 4 位复用),支持主模式和从模式。许多参数都可编程设定,如工作模式、传输速率、时钟相位和极性等。 SPI 模块具有以下特性:

■ 四个接口管脚

 · SDO :数据输出管脚(与 PC3 复用)

 · SDI :数据输入管脚(与 PC2 复用)

 · SCK :时钟输入 / 输出管脚(与 PC1 复用)

 · SSB :从机选择管脚(与 PC0 复用)

■ 支持全双工同步传输

■ 两种工作模式:主模式、从模式

■ 波特率: 8 种可编程传输速率, CPU 时钟在 8 MHz 时,最大可达 2Mbps

■ 每次发送或接收的数据长度: 8 位

■ 时钟相位和极性的可编程设定

■ 数据采样时刻选择:可在数据输出中或数据输出末尾进行采样

■ SPI 接收 / 发送缓冲器大小为 1 个字节

  下图为 SPMC65 系列单片机的 SPI 串行接口功能框图:

图 6 . 1 SPI 串行接口功能框图

  SPI 接口经常用于和 EEPROM 进行通讯。如 图 6.2 即为 SPMC65 系列单片机与 93C46 通讯的应用电路。

图 6 . 2 SPI 应用电路图

6.2.2 控制寄存器

  SPI 控制寄存器 0 P_SPI_Ctrl0 ( $38 , R/W )

  写 SPI 控制寄存器 0 P_SPI_Ctrl0 ( $38 )可以完成 SPI 模块的使能控制、主 / 从模式选择、时钟信号特性设置,以及 SPI 通讯时钟频率选择等;该寄存器默认初始值为 #00h 。有关 SPI 控制寄存器 0 的功能请参考 表 6.2 。

表 6 . 2 SPI 控制寄存器 0 P_SPI_Ctrl0 ( $38 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SPIEN

MOD

SCKPHA

SCKPOL

SMS

SCKSEL2

SCKSEL1

SCKSEL0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

  Bit 7  SPIEN:SPI使能位。该位置1后PC[3:0]即作为SPI通讯接口。
       1= 使能SPI功能
       0= 禁止SPI功能
  Bit 6 MOD:SPI运行模式
       1= 从机模式
       0= 主机模式
  Bit 5  SCKPHA:SPI时钟相位选择,见SPI主模式时序。
  Bit 4  SCKPOL:SPI时钟极性选择,见SPI主模式时序。
  Bit 3  SMS:主机采样模式选择
       1=输入数据输出末尾段进行采样
       0=输入数据输出中部进行采样
  Bit [2:0] SCKSEL[2:0]:主模式时钟选择位
       111 = FSYS ÷ 128
       110 = FSYS ÷ 128
       101 = FSYS ÷ 128
       100 = FSYS ÷ 64
       011 = FSYS ÷ 32
       010 = FSYS ÷ 16
       001 = FSYS ÷ 8
       000 = FSYS ÷ 4
  FSYS:系统时钟频率

  SPI 控制寄存器 1 P_SPI_Ctrl1 ( $39 , R/W )

  而 SPI 模块的从模式的设置,以及采样时钟频率的选择等,可以通过写 SPI 控制寄存器 1 P_SPI_Ctrl1 ( $39 )完成设置。而采样时钟的目的是为了防止在接收数据时受到尖脉冲的干扰,但是低的采样率会影响通信速度;建议:采样时钟频率 >= 4 X SPI 时钟频率。 SPI 控制寄存器 1 默认初始值为 #02h ;该寄存器各位的功能请参考 表 6.3 。

表 6 . 3 SPI 控制寄存器 1 P_SPI_Ctrl1 ( $39 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SMSEN

SWRST

-

-

-

-

SPISPCLK1

SPISPCLK0

R/W

R/W

-

-

-

-

R/W

R/W

  Bit 7  SMSEN:SPI从模式选择输入
        1= PC0作为SSB输入管脚(SSB:从模式选择,低有效)
        0= PC0作为通用IO管脚
  Bit 6  SWRST:SPI软件复位
       写:
         1=产生脉冲复位SPI模块(寄存器设置除外)
         0=无效
       读:总为0
  Bit [5:2]保留
  Bit [1:0]SPISPCLK [1:0]:采样时钟选择位
          11= FSYS ÷ 4
          10= FSYS ÷ 2
          01= FSYS
          00= 不采样
  FSYS:系统时钟频率

  PI TX/RX 状态寄存器 P_SPI_Status ( $3A , R/W )

  SPMC65 系列单片机的 SPI 模块提供了发送和接收中断,可以通过读取 SPI TX/RX 状态寄存器 P_SPI_Status ( $3A )查询 SPI 模块的中断标志;而写 SPI TX/RX 状态寄存器可以设置 SPI 中断的使能、清除 SPI 中断标志。该寄存器默认初始值为 #00h ,具体各个位的功能请参考 表 6.4 。

表 6 . 4 SPI TX/RX 状态寄存器 P_SPI_Status ( $3A , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SPIIF

SPIIEN

TXBF

-

-

-

-

BUFFull

R/W

R/W

R

-

-

-

-

R

Bit 7  SPIIF:SPI 中断标志
    
     读:
    
     1= 有SPI 中断 发生
    
     0= 无 SPI中断发生
    
     写:
    
     1= 清除标志
    
     0= 无效

Bit 6  SPIIEN: SPI中断使能位
    
     1= 使能
    
     0= 禁止
    
Bit 5  TXBF: 发送缓冲器满标志位

    1= 发送缓冲器满
    
     0= 发送缓冲器空

Bit [4:1] 保留

Bit 0 BUFFull:接收缓冲器满并覆盖标志位
    
     1= 覆盖
    
     0= 接收缓冲器工作正常

  注:当前 SPI 接收到一个完整的数据时,会把接收缓冲器中上次接收到的数据覆盖,此时将 BUFFull 标志位置位;若上次接收到的数据被读取,则该标志位清零。

  SPI 发送缓冲器 P_SPI_TxData ( $3B , R/W )

  SPMC65 系列单片机的 SPI 模块提供了发送和接收数据的缓冲器,这两个寄存器默认初始值都为 #00h ,发送缓冲器的具体功能请参考下 表 6.5 :

表 6 . 5 SPI 发送缓冲器 P_SPI_TxData ( $3B , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SPITXDATA7

SPITXDATA6

SPITXDATA5

SPITXDATA4

SPITXDATA3

SPITXDATA2

SPITXDATA1

SPITXDATA0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

 Bit [7:0]  SPITXDATA : SPI 发送数据

       读 :总为 #00 h

       写: 发送数据

  SPI 接收缓冲器 P_SPI_RxData ( $3C , R/W )

表 6 . 6 SPI 接收缓冲器 P_SPI_RxData ( $3C , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SPIRXDATA7

SPIRXDATA6

SPIRXDATA5

SPIRXDATA4

SPIRDATA3

SPIRXDATA2

SPIRXDATA1

SPIRXDATA0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

  Bit [7:0]  SPIRXDATA : SPI 接收数据

        读: SPI接收数据

        写: 无效

6.2.3 工作机制

  主模式( Master Mode )

  在主模式下,移位时钟 SCK 由 SPI 模块产生。在寄存器 P_SPI_Ctrl0 中有两个分别控制时钟相位( SCKPHA )和极性 (SCKPOL) 的控制位。当向 P_SPI_TxData 寄存器写入数据时,发送立即开始。 另外如果用户想要接收从机数据, SDI 管脚 (PC2) 可以设置为悬浮输入状态。 SPMC65 系列单片机支持 SPI 模块的接收和发送中断。在寄存器 P_SPI_Status 中将 SPIIEN 位置 1 可同时使能收发中断。同样,在收发中断服务程序结束后需要清除 SPIIF 标志位。

  在软件向寄存器 P_SPI_TxData 写入一个字节之后,数据被锁存到寄存器的内部发送缓冲器中。如果此时移位寄存器是空的,该数据将被载入到移位寄存器中并在下一个 SCK 相位时开始传输。如果移位寄存器正在执行数据移位(由 P_SPI_TxStatus 寄存器中的 TXBF 标志得知),新数据会等待当前的数据移出后才可以载入进行移位。

  SPI 通过 SDO 管脚将数据从最高有效位 (MSB) 开始移出,直到最低有效位 (LSB) 也被移出。 8 位数据在 8 个 SCK 周期后全部移出。同时,接收的数据也通过 SDI 引脚移入。当每组 8 位发送完成后, P_SPI_Status 寄存器中的 SPIIF 置 '1' ;此外,如果寄存器 P_SPI_Status 中的 SPIIEN 位被设置为 ‘1' ,会产生一个 SPI 发送中断。

  相反的,当 SPI 接口成功地接收了一组 8 位数据时,接收到的数据将被锁存到接收缓冲器中。此时, P_SPI_Status 寄存器中的 SPIIF 位将被设置为 ‘1' , 如果 P_SPI_Status 寄存器中的 SPIIEN 位被设置为 ‘1' ,会产生一个 SPI 接收中断。

  图 6.3 给出了 SPI 主机模式下不同运行类型的时序(极性控制位等于 “1” 或 “0” ,相位控制位等于 “1” 或 “0” ,取样控制位等于 “1” 或 “0” )。

图 6 . 3 SPI 主模式时序

  从模式 ( Slave Mode )

  在从机模式下,移位时钟 SCK 来自外部 SPI 主设备,所以第一个外部时钟周期开始传输。发送前,软件应在第一个来自主设备的 SCK 之前向其发送缓冲写入数据。主设备与从设备都必须按相同的 SCK 相位和极性运行,以进行数据的发送与接收。

  如果时钟相位 (SCKPHA) 为 “1” ,只要向 P_SPI_TxData 寄存器写入数据,就开始移出的第一个数据位。如果时钟相位 (SCKPHA) 为 “0” ,则在第一个 SCK 边沿后才开始移出的第一个数据位。

  SPI 从模式时序请参考 图 6.4 :

  注:图中“ SSB ”为 SPI 从机选择信号,由主机发出,从机接收到“ SSB ”信号后启动 SPI 。

图 6 . 4 SPI 从模式时序图

  SPI 中断

  与 SPI 相关的中断有两个: SPI 发送中断和接收中断。因为 SPI 为全双工通讯,因此这两个中断同时发生,并且共用一个中断标志位。

  •  SPI 发送中断

  •  SPI 接收中断

  设置 SPI 中断需要以下步骤:

  1. 用“ SEI ”指令关闭总的中断开关;

  2. 使能 SPI 模块,配置相关寄存器;

  3. 在 P_SPI_Status ( $3A )寄存器中将 SPIIEN 位置 1 ,使能 SPI 中断;

  4. 用“ CLI ”指令打开总的中断开关;

     5. 等待中断产生。

6.2.4  应用举例

SPI 采样时钟选择计算公式

1. spi 时钟计算公式

用下面的公式计算采样时钟,以保证获得正确的数据。

采样时钟频率 >= 4 X SPI Clock

例:

SPI 时钟频率 =1MHz(PC1), F SYS =8MHz

采样时钟频率 >= 4X1MHz = 4MHz

采样时钟必须大于 4Mhz 才能保证从机数据接收正确。

因此,采样时钟选择位 (SPISPCLK [1:0]) 宜设置为 2

采样时钟频率 =8MHz/2=4Mhz

IO 设置对照

  SPI 在主 / 从模式下工作时,端口 C 的设置请参考 表 6.7 :

表 6 . 7 SPI 功能复用端口设置

SPI 运行在主模式下

SPI 运行在从模式下

PC0(SS)

输出

PC0(SS)

悬浮输入

PC1(SCK)

输出

PC1(SCK)

悬浮输入

PC2(SDI)

悬浮输入

PC2(SDI)

悬浮输入

PC3(SDO)

输出

PC3(SDO)

悬浮输入

  【例 7-1 】: SPI 在主模式下运行(初始化)

  lda  #00000000B
   
  sta  P_IOC_Data
   
  lda  #00000100B      ; 将 SDI 接口 PC2 设置为悬浮输入
   
  sta  P_IOC_Attrib
   
  lda  #11111011B
   
  sta  P_IOC_Dir
   
  lda  #$AF         ; 使能 SPI ,设置为主模式, Clock= Fsys(8MHz)/128= 62.5KHz
   
  sta  P_SPI_Ctrl0
   
  lda  #$43         ; PC0 为 GPIO ,软件复位 SPI ,采样时钟 = Fsys/4(must >= 4* SPI clock)
   
  sta  P_SPI_Ctrl1
   
  lda  #11000000B      ; 使能 SPI 中断,清除 SPI 中断标志
   
  sta  P_SPI_Status

  【例 7-2 】: SPI 主模式下发送数据

  L_TestSPIL7:
 
  lda  #11000000B ; 清除 SPI 中断标志
   
  sta  P_SPI_Status
   
  lda  T_SPI_Data,X ; 从用户定义 ROM 表中得到发送数
   
  sta  P_SPI_TxData ; 发送数据
 
  L_TestSPIL71:
 
  lda P_SPI_Status
 
  and #10000000B ; 查询 SPI 发送是否结束
 
  beq L_TestSPIL71 ; 没有
 
  inx
 
  cpx #4 ; 查询数据字节是否发送完毕
 
  bne L_TestSPIL7 ; 没有
 
  T_SPI_Data:
 
  DB #00000001B ; 开始位
 
  DB #01000001B ; 写入地址 1
 
  DB #$55
 
  DB #$AA

  【例 7-3 】: SPI 主模式下接收数据

  lda  #$00       ; 发送测试数据
 
  sta  P_SPI_TxData
 
  L_TestSPIL5:
 
  lda  P_SPI_Status
   
  and  #10000000B    ; 查询是否发生 SPI 发送中断
   
  beq  L_TestSPIL5   ; 没发生
 
  nop
 
  lda  P_SPI_RxData   ; 读取数据
   
  sta  G_MWorkReg1

  【例 7-4 】: SPI 从模式下运行(初始化)

  lda  #00000000B
   
  sta  P_IOC_Data
   
  lda  #00001111B    ; 设置从模式:将 PC0~3 设置为悬浮输入
   
  sta  P_IOC_Attrib
   
  lda  #11111111B
   
  sta  P_IOC_Dir
   
  lda  #$C0       ; 使能 SPI ,主机模式 , Clock= Fsys(8MHz)/128= 62.5KHz
   
  sta  P_SPI_Ctrl0
   
  lda  #$C3       ; PC0 为 GPIO ,软件复位 SPI ,采样时钟 = Fsys/4(sample clock >4* SPI clock)
   
  sta  P_SPI_Ctrl1
   
  lda  #11000000B    ; 使能 SPI 中断,清除 SPI 中断标志
   
  sta  P_SPI_Status

6.3  UART 接口

6.3.1  SPMC65 系列单片机的 UART 接口简述

  UART 即通用异步收发器,可配置成全双工异步通讯方式,与 PC 等通讯;或设置成半双工同步模式与其它周边外设通讯,如 A/D 或 D/A 。 SPMC65 系列单片机内置了 UART 模块,它的作用是: 将外部设备串行数据转换为并行数据接收;将内部并行数据转换为串行数据发送。 UART 模块特点如下:

■ 两个接口管脚

  ·  RXD :数据接收管脚 ( 与 PC5 复用,使用 RX 功能时设置为输入口 )

  ·  TXD :数据发送管脚 ( 与 PC4 复用,使用 TX 功能时设置为输出口 )

■ 提供标准的异步全双工通讯

■ 可编程的波特率

■ 可进行偶校验、奇校验或禁止校验

■ 停止位可设置为 1 位或 2 位

■ 支持发送中断

■ 支持接收中断

■ 高抗噪声能力的数据接收 ( 接收中间连续进行 3 次采样,并对结果进行多数决策 )

■ 在接收中进行帧校验和奇偶校验

■ 溢出检测

■ CPU 工作频率为 8MHz 时,波特率可在 2400 bps~38400 bps 之间编程设置

  UART 的数据帧如图 图 6.5 如示:

图 6 . 5 UART 数据帧

  UART 接口通常用于与 PC 机通讯,或者用于单片机间的通讯。

6.3.2  控制寄存器

  UART控制寄存器 P_UART_Ctrl( $46 , R/W )

  可以通过写 UART 控制寄存器 P_UART_Ctrl ( $46 )对 UART 的中断使能、 UART 功能、帧格式等进行设置; P_UART_Ctrl 默认初始值为 #00h ,具体位的功能请参考 表 6.8 :

表 6 . 8UART 控制寄存器 P_UART_Ctrl ( $46 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

RXIE

TXIE

RXEN

TXEN

SOFTRST

STOPSEL

PSEL

PEN

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

 Bit 7  RXIE :接收中断使能位
 
       1= 使能
      
       0= 禁止
 
  Bit 6  TXIE :发送 中断使能位
 
       1= 使能
      
       0= 禁止
 
  Bit 5  RXEN : UART 接收功能使能位
 
       1= 使能
      
       0= 禁止
 
  Bit 4  TXEN : UART 发送功能使能位
 
       1= 使能
      
       0= 禁止
 
  Bit 3  SOFTRST :软件复位
 
       写:
      
       1= 复位所有 UART 模块
      
       0= 无效
 
  Bit 2  STOPSEL :停止位长度选择位
 
       1= 2 位停止位
      
       0= 1 位停止位
 
  Bit 1  PSEL :校验类型选择位
 
       1= 偶校验
      
       0= 奇校验
 
  Bit 0  PEN : 校验使能
 
       1= 使能
      
       0= 禁止

  UART 波特率分频器 P_UART_Baud ( $47 , R/W )

  SPMC65 系列单片机的 UART 波特率可通过软件设置 UART 波特率分频器 P_UART_Baud ( $47 )的值,通过换算可得到所需要的 UART 波特率。 P_UART_Baud 默认初始值为 #00h ,具体功能请参考 表 6.9 ,以及后面的说明。

表 6 . 9 UART 波特率分频器 P_UART_Baud ( $47 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

BaudRate7

BaudRate6

BaudRate5

BaudRate4

BaudRate3

BaudRate2

BaudRate1

BaudRate0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

  Bit [7:0] BaudRate[7:0] : UART 波特率分频器

  SPMC65 系列单片机的 UART 波特率是由一个波特率寄存器和一个 8 位定时 / 计数产生的。每次定时 / 计数器计到最大计数值 (0xFF) 后,再加 1 时,一个时钟信号就会被发送到波特率产生电路,在该电路中,时钟信号会通过一个 16 分频的计数器,然后产生波特率。定时 / 计数器溢出后,会自动重新载入波特率寄存器中的值。

  波特率寄存器中的内容为 8 位的无符号数, UART 波特率的计算公式如下:

波特率 = F SYS / [16 X (256 – UARTBAUD ) ]

  按下面的公式计算 P_UART_Baud 寄存器的值:

UARTBAUD=256 - F SYS / ( 16 X Baud Rate )

  注: UARTBAUD 即 P_UART_Baud 中的值。

  注:波特率计算结果不能大于 38400 。

表 6 . 10 UART 波特率对照表

波特率 (bps)

P_UART_BBaud 推荐值( @8MHz )

2400

30h

4800

98h

9600

CCh

19200

E6h

38400

F3h

UART 状态寄存器 P_UART_Status ( $48 , R/W )

  读取 UART 状态寄存器 P_UART_Status ( $48 )可获得 UART 运行的一些状态信息,如 UART 中断标志、帧错误信息等;而写该寄存器的相应位则是清除相应位的标志。 P_UART_Status 默认初始值为 #00h ,具体位的功能请参考 表 6.11 :

表 6 . 11 UART 状态寄存器 P_UART_Status ( $48 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

RXIF

TXIF

BUSY

-

-

OERR

PERR

FERR

R

R

R

-

-

R/W

R/W

R/W

 Bit 7  RXIF :接收中断标志
 
       1= 接收数据准备好 ( 满 )
      
       0= 接收数据未准备好
 
  Bit 6  TXIF :发送中断标志
 
       1= 发送数据准备好 ( 空 )
      
       0= 发送数据未准备好
 
  Bit 5  BUSY : UART 正在进行发送标志位
 
       1= 发送正在进行
      
       0= 发送结束,等待下一次发送
      
  Bit [4:3] 保留
 
  Bit 2  OERR :溢出错误标志(一般是前一次接收到的数据尚未读取,而当前又有数据接收进来覆盖原数据而造成的)
 
      读:
     
      1= 发生溢出错误
     
      0= 未发生溢出错误
     
      写:
     
      1= 将标志清零
     
      0= 无效
     
  Bit 1 PERR :奇偶校验错误标志
 
      读:
     
      1= 奇偶校验错误
     
      0= 无奇偶校验错误
     
      写:
     
      1= 将标志清零
     
      0= 无效
     
  Bit 0 FERR :帧错误标志(一般是由于接收不到停止位而产生)
 
      读:
     
      1= 发生帧错误
     
      0= 无帧错误
     
      写:
     
      1= 将标志清零
     
      0= 无效

  UART 数据寄存器 P_UART_Data ( $49 , R/W )

  SPMC65 系列单片机的发送、接收数据寄存器共用 P_UART_Data 一个寄存器。读取 P_UART_Data 寄存器中的值时,会自动清掉 P_UART_Status 寄存器中的接收中断标志位;而写数据到 P_UART_Data 寄存器时,会自动把 P_UART_Status 寄存器中的发送中断标志位(即发送准备好标志位)清零。具体位的功能请参考 表 6.12 :

表 6 . 12 UART 数据寄存器 P_UART_Data ( $49 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

DATA7

DATA6

DATA5

DATA4

DATA3

DATA2

DATA1

DATA0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

  Bit [7:0] UARTDATA [7:0]: UART 数据寄存器

    读: 读取接收到的数据同时 RXIF 标志位清零

    写: 将发送数据写入寄存器同时 TXIF 标志位清零

6.3.3  工作机制

  当 UART 模块成功的接收到一个字节的数据后,会把接收到的数据载入接收缓冲寄存器( P_UART_Data ),如果此时在 P_UART_Status 中的 RXIE 位为 1 ,则会自动将 RXIF 标志位置 1 ;之后读取 P_UART_Data 会自动将 RXIF 标志位清零。

  当 P_UART_Status 中的 TXIE 位为 1 时,若 TXIF 位置 1 则表示 UART 模块完成数据发送并准备好了进行下一次发送,如果状态寄存器中‘ I '标志位为 0 (总中断打开)则会发生一次 UART 发送中断。写数据到 P_UART_Data 寄存器会自动将 TXIF 位清零。 BUSY 为只读的标志位,当其置 1 时代表 UART 模块正在忙,当传输完成 BUSY 标志位会自动清零; P_UART_Status 中的其它标志位还有 OERR 、 PERR 、 FERR ,都为帧错误信息标志,向对应的寄存器位写入 “1” 可清除 OERR (溢出错误标志)、 PERR (奇偶校验错误标志)与 FERR (帧错误标志)。

  在软件向 P_UART_Data 寄存器写入数据后, UART 开始发送。 UART 在 TX 引脚上发送数据按照以下顺序:起始位、 8 位数据 ( 低位在前 ) 、奇偶校验位 ( 奇偶校验使能的情况下有效 ) 、停止位。发送停止位后再经过两个 CPU 时钟周期,寄存器 P_UART_Status 中的 TXIF 位被置 1 。

  当 P_UART_Ctrl 寄存器中的 RXEN 位使能接收功能后,如果 RX 引脚接收到一个开始位的下降沿,标志着接收数据开始;在停止位时间周期内,串口检查以下条件:

  如果满足 RXIF = 0 且 RXIE = 1 的条件,寄存器串口向 P_UART_Data 写入接收字节并置 RXIF 位为 1 ;不满足,则丢失接收数据,不会载入到寄存器 P_UART_Data 中。在停止位时间过了一半之后,串口开始等待 RX 引脚上的下一个开始位下降沿。

  UART 中断:

  与 UART 有关的两个中断:

  •  发送中断

  •  接收中断

  注:发送中断信号实际上是“ 发送数据准备好 ”标志触发的。

  产生 UART 中断需要以下步骤:

  1.  用“ SEI ”指令关闭总的中断开关;

  2. 设置 UART 相关寄存器;

  3. 在 P_UART_Ctrl ( $46 )寄存器使能发送 / 接收中断;

  4. 用“ CLI ”指令打开总的中断开关;

  5. 等待中断产生

【例 7- 5 】: 初始化 UART (发送)中断

  lda  #$F8
   
  sta  P_UART_Ctrl  ; 复位 UART 模块
   
  lda  #01010000B
   
  sta  P_UART_Ctrl  ; UART 发送使能、发送中断使能
   
  lda  #00000111B
   
  sta  P_UART_Status ; 清 UART 错误标志位

•  应用举例

【例 7-6 】: UART 采用查询方式发送一串数据

……

lda #$00

sta P_IOC_Data

sta P_IOC_Attrib

lda #11011111B ; 设置 PC5(Rx) 为输入口, PC4(Tx) 为输出口

sta P_IOC_Dir

lda #$F8

sta P_UART_Ctrl ; 复位 UART 模块

lda #00010000B

sta P_UART_Ctrl ; UART 发送使能

lda #00000111B

sta P_UART_Status ; 清 UART 错误标志位

lda #$CC

sta P_UART_Baud ; 设置波特率为 9600 bps@8MHz

ldx #0

L_TxReady:

lda P_UART_Status

and #01000000B ; 查询发送准备好标志位状态

beq L_TxReady

lda Hello, X

beq L_exitTx

sta P_UART_Data

inx

lda #00000111B

sta P_UART_Status ; 清 UART 错误标志位

jmp L_TxReady ; 循环

L_exitTx:

L_Main:

nop

jmp L_Main

Hello: .BYTE 'Hello World!', 0Ah, 0Dh, 00h

【例 7- 7 】: UART 用查询方式接收数据

ldx #0

L_TestUART1L4:

lda P_UART_Status

and #10000000B ; 发送数据准备好?

beq L_TestUART1L4 ; 没有

lda P_UART_Data ; 接收数据

sta G_RXbuf,X

lda P_UART_Status

and #00000111B ; 发送数据出错?

beq L_TestUART1L5 ; 没有

lda #00000111B ; 清除错误标志

sta P_UART_Status

L_TestUART1L5:

inx

cpx #4 ; 接收数据结束?

bne L_TestUART1L4 ; 没有

6.4 IIC 接口

6.4.1 IIC 接口简述

  IIC(Inter-Integrated Circuit) 功能即内部集成电路总线。 它支持多主机 ( multi-master ) 通讯机制,主机之间相互通信或与其它周边通信时使用两根信号线:一个串行数据线 (SDA) 和一个串行时钟线 (SCL) 。为了避免数据混淆、丢失或阻塞,主从机之间通讯必须有特定的协议。在多主机的 IIC 总线中,主机可以向多个从机发送 / 接收串行数据。数据传送由主机发起,也由主机结束。在一个主机系统中,也可以有多个主机和多个从机。如果多个主机同时企图控制总线,仲裁器会决定那个主机拥有最高优先权。总线上最多可连接的设备数由总线上允许的最大电容值 400 pF 决定,并且还受 IIC 总线最大寻址空间 16 K 限制。

  SPMC65 系列单片机的 IIC 接口特性如下:

■ 两个外部管脚

  · SDA :数据输入 / 输出管脚(与 PC7 复用)

  · SCL :时钟管脚(与 PC6 复用)

■ 支持主机发送 / 接收模式

■ 支持从机发送 / 接收模式

■ 侦测总线仲裁失败

■ 中断发生

■ 可编程的应答信号( ACK )

■ 主模式下可编程的时钟频率

  IIC 接口通常用于和 EEPROM 进行通讯。如 图 6.6 所示为 24C01A 和 SPMC65 系列单片机的应用电路。

图 6 . 6 IIC 接口应用电路

6.4.2  控制寄存器

  IIC 总线控制寄存器 P_IIC_Ctrl ( $4A , R/W )

  写 IIC 总线控制寄存器 P_IIC_Ctrl ( $4A )可以完成对 IIC 接口使能、输出使能、 IIC 中断使能等, P_IIC_Ctrl 的低 3 位为 IIC 时钟频率的选择位。 P_IIC_Ctrl 默认初始值为 #00h ,寄存器每一位的功能请参考 表 6.13 :

表 6 . 13 IIC 总线控制寄存器 P_IIC_Ctrl ( $4A , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

IICEN

-

TXRXEN

IICIEN

ACKEN

SCK2

SCK1

SCK0

R/W

-

R/W

R/W

R/W

R/W

R/W

R/W

 Bit 7  IICEN : IIC 串行接口使能位
 
        1= 使能 IIC 串行接口功能
       
        0= 禁止 IIC 串行接口功能
 
  Bit 6  保留
 
  Bit 5  TXRXEN : IIC 总线数据使能位
 
        1= 使能
       
        0= 禁止
 
  Bit 4  IICIEN : IIC 中断使能位
 
        1= 使能
       
        0= 禁止
 
  Bit 3  ACKEN : IIC 应答使能位
 
        1= 使能应答信号发生
       
        0= 禁止应答信号发生
 
  Bit [2:0] SCK[2:0] : IIC 时钟频率选择位
 
       111= FSYS ÷ 1024
      
       110= FSYS ÷ 512
      
       101= FSYS ÷ 256
      
       100= FSYS ÷ 128
      
       011= FSYS ÷ 64
      
       010= FSYS ÷ 32
      
       001= FSYS ÷ 16
      
       000= FSYS ÷ 8
 
 F SYS :系统时钟频率

  IIC 总线状态寄存器 P_IIC_Status ( $4B , R/W )

  写 IIC 总线状态寄存器 P_IIC_Status ( $4B )可以进行 IIC 总线的模式设置,如主 / 从模式选择、发送 / 接收模式选择,而读 P_IIC_Status 寄存器可以得到当前 IIC 总线工作的状态,如中断标志、总线仲裁信号等。 P_IIC_Status 寄存器默认初始值为 #00h ,其每一位的功能描述请参考 表 6.14 :

表 6 . 14 IIC 总线状态寄存器 P_IIC_Status ( $4B , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

MXT

TXRXSEL

BUSY/SIGGEN

IICIF

ARBITRAT

AAS

AZERO

LRB

R/W

R/W

R/W

R/W

R/W

R

R

R

 Bit 7  MXT : IIC 主 / 从模式选择位
   
       1= 主模式
      
       0= 从模式
   
  Bit 6  TXRXSEL :发送 / 接收选择位
   
       1= 发送模式
      
       0= 接收模式
   
  Bit 5  BUSY/SIGGEN :总线正忙或启动 / 停止信号发生位
      
       读:
      
       1= 总线忙
      
       0= 总线就绪
      
       写:
      
       1= 启动信号
      
       0= 停止信号
      
       注:
   
        向 MXT 和 TXRXSEL 写数据时,保持该位为 0
       
        当 IICIF =1 ,清除 IICIF 标志时,芯片自动忽略该位的任何设置
   
  Bit 4  IICIF : IIC 中断标志
      
       读:
      
       1=IIC 中断发生
      
       0=IIC 中断未发生
      
       写:
      
       1=IICIF 标志位清零
      
       0= 无效
   
  Bit 3  ARBITRAT : IIC 仲裁器状态标志位
   
       1= 总线仲裁器在通讯中仲裁失败
      
       0= 总线仲裁器良好
   
  Bit 2  AAS : IIC 从机寻址状态位
   
       1= 接收到的地址和 IIC 地址寄存器里的值相同
      
       0= 启动信号 / 停止信号已经发生
      
  Bit 1  AZERO : IIC 零地址状态位
   
       1= 接收从地址为 "0x00"
      
       0= 启动 / 停止动作已经发生
   
  Bit 0  LRB : IIC 最后接收位状态标志
   
       1= 最后接收位为 1( 应答信号 ACK 未收到 )
      
       0= 最后接收位为 0( 应答信号 ACK 已收到 )

  IIC 总线数据寄存器 P_IIC_Data ( $4C , R/W )

  SPMC65 系列单片机的 IIC 接口模块为 IIC 总线提供了一个数据寄存器 P_IIC_Data ( $4C )和一个地址寄存器 P_IIC_Address ( $4D ),这两个寄存器的默认初值都为 #00h ;其功能请参考 表 6.15 和 表 6.16 :

表 6 . 15 IIC 总线数据寄存器 P_IIC_Data ( $4C , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

DATA7

DATA6

DATA5

DATA4

DATA3

DATA2

DATA1

DATA0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

 Bit [7:0] IICDATA [7:0] : IIC 总线数据寄存器

   读:接收数据

   写:发送数据

  IIC 总线地址寄存器 P_IIC_Address ( $4D , R/W )

表 6 . 16 IIC 总线地址寄存器 P_IIC_Address ( $4D , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

ADDR7

ADDR6

ADDR 5

ADDR 4

ADDR 3

ADDR 2

ADDR 1

ADDR 0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

 Bit [7:0] IICADDRESS [7:0] : IIC 总线地址寄存器

          从机模式:从机的地址

6.4.3  工作机制

  操作:

  IIC 总线协议对其连接的每个通讯设备都定义了一个地址,当主机启动数据传送时,首先要将它欲与之通讯的那个从机的地址发到总线上,此时所有的从机都监听这个地址信息。在这个地址中,有一位用来定义主机是从从机中读数据还是向从机写数据的。主机和从机在进行数据传送的时候的状态永远是互补的 ( 发送 / 接收 ) 。他们的关系必为以下二者之一:

  •  主机发送,从机接收

  •  从机发送,主机接收

  在这两种情况下,时钟信号都是由主机产生的。

  为了在总线上与其它设备“线与” (wired-AND) 连接,时钟线 (SCL) 和数据线 (SDA) 是开漏输出。外部的上拉电阻用于保证当没有设备拉低总线时,总线保持高电平状态。

图 6.7 为 24C01A 的通讯协议:

图 6 . 7 24C01A IIC 通讯协议

  启动和停止数据传送

  当总线上无数据传送时(空闲时间),时钟线( SCL )和数据线( SDA )通过外部上拉电阻被拉高。启动信号和停止信号决定数据传送的开始和停止,定义如下:

  启动信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据;

  停止信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。

  如 图 6.8 所示为开始信号和停止信号的具体定义。主机产生这两个信号作为数据传送的开始和结束。根据启动信号和停止信号的定义,当数据正在传送时, SDA 只能在 SCL 拉低后才能改变状态,传送新的数据位。

图 6 . 8 开始和停止信号

  地址格式的定义

  SPMC65 系列单片机的 IIC 接口仅支持 7 位地址格式外加 1 位读 / 写标志位。 7 位地址格式如 图 6.9 所示。

图 6 . 9 7 位地址格式

  传送应答( ASK 信号)

  IIC 总线协议规定,所有数据都是一个字节一个字节的发送,每次发送的字节数不做限定。从机每收到一个字节后,都会产生一个应答信号 (ACK) 。

  如果主机没有收到应答信号,则必须停止传送。此时从机必须释放 SDA ,使其恢复为高电平,让主机可以产生停止信号。如 图 6.10 所示为 IIC 总线上的应答信号。

图 6 . 10 IIC 总线应答信号

  如果主机正在接收数据(主机接收模式),除了最后接收的那个字节外,每接收到一个字节都会产生一个应答信号。最后一个字节不产生应答信号,其实也是一种信息,就是为了告诉从机发送结束。然后从机释放 SDA ,让主机产生停止信号。主机也可以在应答信号的脉冲期间,与时钟信号 SCL 组合,产生停止信号,从而结束数据传送。

  通用地址

  IIC 总线上寻址的过程是这样的:在启动信号后传送的第一个字节即主机要访问的从机的地址信息。不同的是:当主机发送的第一个字节为通用地址时,则可以访问所有的从机。理论上将,发送通用地址后,所有的从机都应该向主机发送一个应答信号。

  IIC 协议规定了一个通用地址,它的 7 个地址位和一个 R/W 位均为 0 ,用于呼叫所有的从机。通用地址可以被自动识别。此时,将 AZERO 位置 1 。

  总线仲裁

  多主机模式的系统是通过总线仲裁来协调工作的。当主机 A 输出高电平到 SDA 管脚上时,同时,另一主机 B 输出低电平到 SDA 管脚,将 SDA 线拉低,这种情况下,主机 A 从 SDA 管脚读回的信号为低,与输出不一致,此时, ARBITRAT 位置 1 ,表明总线被另一主机 B 占用。

  从机模式( Slave mode )

  在从机模式下,从机的 SCL (PC6) 和 SDA (PC7) 管脚必须设置为输入。当需要作为 IIC 输出 (slave–transmitter) 时 ,IIC 模块会自动将对应的 IO 口设置为输出。

  当地址值与寄存器 P_IIC_Address 里的值相匹配或者 IIC 模块自动将 ACKEN 位置 1 ,产生应答信号,然后将接收到的数据存入 P_IIC_Data 寄存器。

  从机的设置步骤如下:

  1. 将 PC6 和 PC7 置为悬浮输入

  2. 使能 IIC 模块 ( IICEN= 1)

  3. 使能 IIC 数据输出 (TXRXEN= 1)

  4. 设置从机模式 (MXT= 0, TXRXSEL= 0)

  典型的数据传送步骤如下:(从机模式接收)

  1. 从机在 P_IIC_Address 中设置地址;

  2. 通过查询 IICIF 位,得知一个字节的数据接收完毕;

  3. 当主机在写模式下 (TXRXSEL=0) ,从机从 P_IIC_Data 寄存器中读取接收到的数据;

  4. 当主机在读模式下 (TXRXSEL=1) ,从机将要发送的数据载入寄存器 P_IIC_Data 中;

  5. 清除 IICIF 位。

  主机模式( Master mode )

  在主机模式下, SCL ( PC6 )和 SDA ( PC7 )管脚必须设置为输入。当需要作为 IIC 输出 (master–transmitter) 时 ,IIC 模块会自动将 IO 口设置为输出。

  IIC 的时钟 (SCL) 由主机产生, SPMC65 系列单片机支持 8 种时钟频率(通过 SCK[2:0] 选择),最高达 1MHz@ 8MHz 。设置主机模式的步骤如下:

  1. 将 PC6 和 PC7 置为悬浮输入

  2. 使能 IIC 模块 ( IICEN= 1)

  3. 使能 IIC 数据输出 (TXRXEN= 1)

  4. 设置主机模式 (MXT= 1, TXRXSEL= 1)

  典型的数据发送步骤如下:(主机模式发送)

  1. 在寄存器 P_IIC_Data 中设置从机地址

  2. 通过查询 BUSY 位,得知总线是否就绪可用

  3. 设置 SIGGEN 位,产生启动信号,开始发送寄存器 P_IIC_Data 中的数据。

  4. 通过查询 IICIF 位,得知数据已发送完成

  5. 将下一个要发送的数据载入 P_IIC_Data

  6. 清除 IICIF 标志位

  7. 设置 SIGGEN 位,产生停止信号

  IIC 中断

  SPMC65 系列单片机中,以下事件将导致发生 IIC 中断,并置中断标志位 IICIF 。

  1. 发送一个字节的数据

  2. 接收一个字节的数据

  设置 IIC 中断的步骤如下:

  1. 用 “SEI ” 指令关闭总的中断开关

  2. 设置与 IIC 操作相关的寄存器

  3. 在 P_IIC_Ctrl ( $4A )寄存器中将 IIC 中断使能位置 1

  4. 用“ CLI ”指令打开总的中断开关

  5. 等待中断产生

6.4.4 应用举例

例 7-8 】:主机发送模式的操作(初始化)

 lda  #00000000B
   
  sta  P_IOC_Data
   
  lda  #11000000B
   
  sta  P_IOC_Attrib
   
  lda  #00000000B   ; PC6(SDL) 和 PC7(SDA) 设为悬浮输入
   
  sta  P_IOC_Dir
   
  lda  #10101100B   ; I2C 使能,应答、输出使能, SCL= 62.5KHz
   
  sta  P_IIC_Ctrl
   
  lda  #11010000B   ; 主机模式、发送、清除 IICIF 标志
   
  sta  P_IIC_Status

【例 7-9 】: 主机发送模式操作(数据发送)   

  lda  #10100000B    ; 设置从机地址
   
  sta  P_IIC_Data
 
  L_TestI2CL20:
 
  lda  P_IIC_Status
   
  and  #00100000B    ; 总线忙?
   
  bne  L_TestI2CL20   ; 是
   
  lda  P_IIC_Status
   
  ora  #00100000B    ; 发送启动信号
   
  sta  P_IIC_Status
   
  ldx  #0
 
  L_TestI2CL21:
 
  lda  P_IIC_Status
   
  and  #00010000B   ; 有中断?
   
  beq  L_TestI2CL21  ; 无
   
  lda  T_I2C_Data,X  ;
   
  sta  P_IIC_Data   ; 载入发送数据
   
  lda  P_IIC_Status
   
  ora  #00010000B   ; 清除 IICIF 标志 ( 开始发送 )
   
  sta  P_IIC_Status
 
  inx
 
  cpx  #4       ; 发送结束?
   
  bne  L_TestI2CL21  ; 没
 
  L_TestI2CL3:
 
  lda  P_IIC_Status
   
  and  #00010000B   ; IICIF 置 1 ?
   
  beq  L_TestI2CL3   ; 没有
   
  lda  #11000000B   ; 发送停止位?
   
  sta  P_IIC_Status

【例 7-10 】: 主机发送模式操作(数据接收)   

  lda  #10101100B    ; IIC 使能,应答、输出使能, SCL= 62.5KHz
   
  sta  P_IIC_Ctrl
   
  lda  #11010000B    ; 主机模式、发送、清除 IICIF 标志
   
  sta  P_IIC_Status
   
  lda  #10100000B    ; 设置从机地址 7-bit= $50
   
  sta  P_IIC_Data
   
  lda  #11100000B    ; 发送启动信号
   
  sta  P_IIC_Status
 
  nop
 
  L_TestI2CL4:
 
  lda  P_IIC_Status
   
  and  #00010000B    ; IICIF 置 1 ?
   
  beq  L_TestI2CL4   ; 没有
   
  lda  T_I2C_Data    ; 设置 24C01A 地址
   
  sta  P_IIC_Data
   
  lda  P_IIC_Status
   
  ora  #00010000B    ; 清除 IICIF 标志 ( 开始发送 )
   
  sta  P_IIC_Status
 
  L_TestI2CL41:
 
  lda  P_IIC_Status
   
  and  #00010000B    ; IICIF 置 1 ?
   
  beq  L_TestI2CL41   ; 没有
   
  lda  #10100000B    ; 设置 24C01 从机地址
   
  sta  P_IICS_Data
   
  lda  #10100000B    ; 接收器,发送启动信号
   
  sta  P_IIC_Status
 
  L_TestI2CL42:
 
  lda  P_IIC_Status
   
  and  #00010000B    ; IICIF 置 1 ?
   
  beq  L_TestI2CL42   ; 没有
   
  lda  P_IIC_Status
   
  ora  #00010000B    ; 清除 IICIF 标志 ( 开始发送 )
   
  sta  P_IIC_Status
   
  ldx  #0
 
  L_TestI2CL43:
 
  lda  P_IIC_Status
   
  and  #00010000B    ; IICIF 置 1 ?
   
  beq  L_TestI2CL43   ; 没有
   
  lda  P_IIC_Data   ; 保存接收数据
   
  sta  G_TXbuf,X
   
  inx  
   
  cpx  #3       ; 接收结束?
   
  beq  L_TestI2CL45  ; 是的
   
  cpx  #2       ; 接收完最后一个?
   
  bne  L_TestI2CL44  ; 否
   
  lda  #10100100B   ; 设置应答信号
   
  sta  P_IIC_Ctrl
 
  L_TestI2CL44:
 
  lda  P_IIC_Status
   
  ora  #00010000B   ; 清除 IICIF 标志 ( 开始发送 )
   
  sta  P_IIC_Status
   
  jmp  L_TestI2CL43
 
  L_TestI2CL45:
 
  lda  #10000000B   ; 发送停止信号
   
  sta  P_IIC_Status   

【例 7-11 】: 从机接收模式操作(初始化)

  lda  #00000000B
   
  sta  P_IOC_Data
   
  lda  #11000000B
   
  sta  P_IOC_Attrib
   
  lda  #00000000B    ; PC6(SDL) 和 PC7(SDA) 设为悬浮输入
   
  sta  P_IOC_Dir    ; IIC 使能,应答、输出使能
   
  sta  P_IIC_Ctrl
   
  lda  #00010000B    ; 从机模式、接收、清除 IICIF 标志
   
  sta  P_IIC_Status
   
  lda  #10100000B    ; 设置从机地址 7-bit= $50
   
  sta  P_IIC_Address

【例 7-12 】 : 从机接收模式(发送 / 接收)   

 ldx #0
 
  L_TestI2C2L1:
 
  lda  P_IIC_Status
   
  and  #00010000B     ; IICIF 置 1 ?
   
  beq  L_TestI2C2L1    ; 否
 
  L_TestI2C2L2:
 
  lda  P_IIC_Status
   
  and  #01000000B     ; 接收器模式?
   
  bne  L_TestI2C2L3    ; 否
   
  lda  P_IIC_Data     ; 存储接收数据
   
  sta  G_TXbuf,X
   
  inx  
   
  lda  P_IIC_Status
   
  ora  #00010000B     ; 清除 INTIF
   
  sta  P_IIC_Status
   
  jmp  L_TestI2C2L1
 
  L_TestI2C2L3:       ; 发送模式
 
  lda  P_IIC_Status
 
  and  #00000001B     ; 无应答?
   
  bne  L_TestI2C2L4    ; 是,则结束
   
  lda  G_TXbuf+2,X
   
  sta  P_IIC_Data     ; 发送数据
 
  inx
 
  lda  P_IIC_Status
   
  ora  #00010000B     ; 清除 IICIF
   
  sta  P_IIC_Status
   
  jmp  L_TestI2C2L1
 
  L_TestI2C2L4:
 
  Nop  

版权所有:北京凌阳爱普科技有限公司 京ICP备05061966号 未经许可网站内容严禁复制、转载,任何人不得擅自使用
友情链接:凌阳爱普 嵌入式培训 安卓培训 凌阳大学计划 北京嵌入式培训 深圳嵌入式培训 成都嵌入式培训