基于 spca718 的 iop 实现

31
1 基基 基基 SPCA718 SPCA718 IOP IOP 基基 基基 数数数数数数 数数数 2004/04/ 28 E-MAIL [email protected] SUNPLUS TECHNOLOGY FOR EASY LILE

Upload: dung

Post on 19-Mar-2016

144 views

Category:

Documents


6 download

DESCRIPTION

SUNPLUS TECHNOLOGY FOR EASY LILE. 基于 SPCA718 的 IOP 实现. 数码影音二部 吴中建 2004/04/28 E-MAIL:[email protected]. SUNPLUS TECHNOLOGY FOR EASY LILE. 目录. IOP 的功能 6502常用指令搭配简介 IOP 的内存的分配 IOP、RISC 与 GPIO 的联系 IOP 具体软件的实现 I2C 简介 Q&A. SUNPLUS - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 基于 SPCA718 的 IOP 实现

1

基于基于 SPCA718SPCA718 的的 IOPIOP 实现实现 数码影音二部 吴中建 2004/04/28

E-MAIL : [email protected]

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 2: 基于 SPCA718 的 IOP 实现

2

目录目录IOP 的功能6502 常用指令搭配简介IOP 的内存的分配IOP 、 RISC 与 GPIO 的联系IOP 具体软件的实现I2C 简介Q&A

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 3: 基于 SPCA718 的 IOP 实现

3

IOPIOP 的功能的功能IOP is I/O process 。是一个 8 位的

MCU ,它用做 718 的中间处理器。在 718 中处理一些实时的功能,负责控制周遍的设备,可以响应比较快的动作,减少 RISC 的负担。通常用于 IR 的接受, VFD 的键扫和送显, GAME 手柄的接收, QCODE 的接收, I2C 通讯 。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 4: 基于 SPCA718 的 IOP 实现

4

65026502 常用指令搭配简介常用指令搭配简介——寄存器——寄存器 大多数操作都是在此进行用于间接寻址

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 5: 基于 SPCA718 的 IOP 实现

5

65026502 常用指令搭配简介常用指令搭配简介——状态寄存器(——状态寄存器( PP ))

进位标志零标志

中断标志十进制模式标志

负数标志溢出标志暂停命令标志

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 6: 基于 SPCA718 的 IOP 实现

6

65026502 常用指令搭配简介常用指令搭配简介——数的表示——数的表示 二进制数的表示: #%00000001 或 #00000001B 十进制数的表示: #01 或 #01D 十六进制数的表示: #$01 或 #01H寄存器的寻址方式请参考 6502_inst.pdf ,在此不在赘述。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 7: 基于 SPCA718 的 IOP 实现

7

65026502 常用指令搭配简介常用指令搭配简介——常用指令(——常用指令( 11 ))1, 位置高、置低指令 ,

rmb bit, BYTE ;; 置低 smb bit, BYTE ;; 置高 这两条指令为对某一个 BYTE 的其中一位置高 , 置低 , 这在写 OUTPUT 可用2, 判断某一位高低而转移到不同的分支 bbr bit, BYTE , 标识 ;; 若这一 BYTE 的 bit 为低 , 则程序跳转到标识处执行 , 否则就顺序执行 bbs bit, BYTE , 标识 ;; 若这一 BYTE 的 bit 为高 , 则程序跳转到标识处执行 , 否则就顺序执行3, 程序分支语句 :

jmp 标识 ;; 它为程序跳转到某一分支执行,跳转的范围较大。 bra 标识 ;; 它为程序跳转到某一分支执行 . 其实相当与 jmp ,只是跳转的范围较小。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 8: 基于 SPCA718 的 IOP 实现

8

65026502 常用指令搭配简介常用指令搭配简介——常用指令(——常用指令( 22 ))4, 判断标志位高低而转移到不同的分支 bcc 标识 ;; 若 c 为 0, 则程序跳转到标识处执行 , 否则就顺序执行 bcs 标识 ;; 若 c 为 1, 则程序跳转到标识处执行 , 否则就顺序执行 beq 标识 ;; 若 z 为 1, 则程序跳转到标识处执行 , 否则就顺序执行 bne 标识 ;; 若 z 为 0, 则程序跳转到标识处执行 , 否则就顺序执行5, 比较指令 ,

cmp DATA ; 该指令主要影响标志位 这条指令为 A 中的数和 DATA 的值比较。若 A>=DATA , C=1 ;若

A<DATA,C=0 ;若 A=DATA , Z=1 。所以,经常和 bcs 、 bcc 、 beq 指令配合使用。 cpx 、 cpy 和 cmp 用法相同。其余指令请参考 6502_inst.pdf 文件

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 9: 基于 SPCA718 的 IOP 实现

9

IOPIOP 的内存的分配的内存的分配———— I/O and cacheI/O and cache

$1ff

$ffff

$106

Zero page

Page 1(Stack Area)

0

$ff NMI,RESET, IRQ Vector

$0$40

32 byte

448 byte

$1ff

32 byte

:

$240

IOP memory Cache memory

32 byte

32 byte

512 byte cache

$0 ~$40 (I/O area)

Only 2 Direct Mapped Cache line, each 32 bytes

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 10: 基于 SPCA718 的 IOP 实现

10

IOPIOP 的内存的分配的内存的分配———— IO Area ($00 - $3F)IO Area ($00 - $3F)$00 - $07(RW): 64-bit GPIO Values (置高置低)$08 - $0F(RW): 64-bit GPIO_OE (1 to enable output) (输入输出)$10 - $1F: RISC-IOP IF Registers (数据交换区)$20: INTR_MASK (W), (中断使能寄存器) bit7: NMI, bit2: RISC INTR, bit1: TIMERA bit0: TIMER B$21: INTR_FLAG (RW) (中断响应寄存器) bit7: NMI, bit2: RISC INTR, bit1: TIMERA bit0: TIMER B write 1 to clear interrupt flag$22-$23: TIMER A (Low-High), (定时器) write will cause count from 0 to that value, then may generate interrupt$24-$25: TIMER B 具体的设置在 iop.inc 中

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 11: 基于 SPCA718 的 IOP 实现

11

b0 b15

b0 b15

$22 $23

$24 $25

SYS_CLK

Timer A

Timer B

Intr A

Intr B

Overflow

Overflow

定时器以初值减,产生溢出中断SUNPLUSTECHNOLOGY FOR EASY LILE

Page 12: 基于 SPCA718 的 IOP 实现

12

IOPIOP 、、 RISCRISC 与与 GPIOGPIO 的联系的联系 GPIO

0~41gpio_sel_auxgpio_sle gpio_master

Decide GPIO route

Select GPIO control path

1: RISC 0:IOP

RISC path:gpio_oe[4]gpio_out[4]gpio_in[4]

IOP path:$00 ~$0FRegister

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 13: 基于 SPCA718 的 IOP 实现

13

RISC RISC 对对 I/OI/O 口如何设置口如何设置

数组名 置数组中的位为 1 或 0 功能描述

gpio_master[4] 0 表示该 GPIO 由 IOP 控制 1 表示该 GPIO 由 RISC 控制

gpio_oe[4] 0 设置该 GPIO 口为输入口 1 设置该 GPIO 口为输出口

gpio_out[4] 0 该 GPIO 口输出低电平 1 该 GPIO 口输出高电平

gpio_in[4] 值为 0 表示输入的是低电平 值为 1 表示输入的是高电平

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 14: 基于 SPCA718 的 IOP 实现

14

IOP IOP 对对 I/OI/O 口如何设置口如何设置1 、对 I/O 的置高、置低需要对应的 64bit 的空间来控制,对应的位写 0- 置低;写 1- 置高。在 iop.inc中定义如下: GPIO_PROT0 EQU $00 ; 对应 GPIO0-7

GPIO_PROT7 EQU $07 ; 对应 GPIO56-632 、对 I/O 的输入、输出也需要对应的 64bit 的空间来控制,对应的位写 0- 输入;写 1- 输出。在

iop.inc 中定义如下: GPIO_IO0_CFG EQU $08 ; 对应 GPIO0-7 GPIO_IO0_CFG EQU $08 ; 对应 GPIO56-63

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 15: 基于 SPCA718 的 IOP 实现

15

IOPIOP 与上层的接口与上层的接口 寄存器

IOP-DATA[8]IOP_DATA0_L

….IOP_DATA7_H

(16BYTE)

SDRAM space:Sdram_base+

iopya*1024+0x400

$400--$41f(32BYTE)$420--$42a(10BYTE)

状态标志时间中断标记Ir 数据游戏手柄数据面板按键码值

Vfd_mem[ ]—sent outQcode_data[ ]--recieve

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 16: 基于 SPCA718 的 IOP 实现

16

2K IOP 空间具体结构

1 :了解 Dram 中各部分空间很重要,编写程序时请务必有 Stack 空间的概念,否则,出现莫名其妙的问题时麻烦 就来了;2 : IOP Code Size 亦不能无限扩展,以免冲掉伺服变量 导致系统伺服动作失效。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 17: 基于 SPCA718 的 IOP 实现

17

IOPIOP 具体软件的实现具体软件的实现————软件的总体架构

Reset初始化

Mainloop{ Qcode serviceIr serviceVfdr serviceVfdw service}

每 100uS 发生一次Virq{1 ,清除中断标志2 ,用户的计数变量递减3 ,通过 data5 提供上层 1ms 和 10ms的信号}

定时器中断

中断返回

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 18: 基于 SPCA718 的 IOP 实现

18

IOPIOP 具体软件的实现具体软件的实现———— IRIR 头码的抓取(头码的抓取( 11 ))判断头码是关键程序提醒您注意几个地方: 1 , irq.asm 中的 rIrCountH

2 , rIrCountH 与 rIrCountLbuf 关系。这两个参数在高低电平变化时相互配合,完成时间判定。 3 ,注意 irq 一次循环 100us

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 19: 基于 SPCA718 的 IOP 实现

19

IOPIOP 具体软件的实现具体软件的实现———— IRIR 头码的抓取(头码的抓取( 22 ))以 NEC 为例,时间长度的描述。

例:先 9ms LOW, 后 4.5msHIGH ,说明IR HEAD 已传来,系统需要接受 IR 。

IR in ~

~Timer B

定时 100US rIrCountLbuf 记数

rIrCountH 记数

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 20: 基于 SPCA718 的 IOP 实现

20

IOPIOP 具体软件的实现具体软件的实现———— IRIR 头码头码的判断的判断(( 33 )) lda rIrCountLbuf cmp #80 bcc Irclearcount ;;小于 8ms Irclearcount cmp #98 bcs Irclearcount ;;大于 9.8ms Irclearcount

;;由上判断,将时间限制在 8 到 9.8 之间。在此之间,既为: 9ms lda rIrCountH cmp #50 bcs Irclearcount ;;接下来大于 5ms ( 50*100us = 5ms )

;; Irclearcount cmp #20 bcc Irclearcount ;;小于 2ms Irclearcount cmp #35 bcc Irisrepeat ;;小于 3.5ms Irisrepeat cmp #40 bcc Irclearcount ;;小于 4ms Irclearcount lda #32 注释:上面的时序描述,完全反映了头码及重复码的判定过程。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 21: 基于 SPCA718 的 IOP 实现

21

IOPIOP 具体软件的实现具体软件的实现———— IRIR 数据的抓取数据的抓取 cmp #11 // >>11, 为 1 。 Else 0

ror rIrReceiver

ror rIrReceiver+1

ror rIrReceiver+2

ror rIrReceiver+3

D7 D6 D5 D4 D3 D2 D1 D0

C

C

C C

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 22: 基于 SPCA718 的 IOP 实现

22

IOPIOP 具体软件的实现具体软件的实现———— IRIR 数据校验和保存数据校验和保存 lda rIrReceiver+1 ; 数据原码 eor rIrReceiver ; 数据反码 cmp #FFH ;异或结果与 0FFH 比较 bne Irdataerr ; 不相等,跳转;数据错误 lda rIrReceiver+3 sta IOP_DATA6_H ; 数据正确,保存 IOP_DATA6_H lda rIrReceiver+1 sta IOP_DATA6_L ;save to IOP_DATA6_L 注: 1 、到此为止, IR 的数据已经接收完成并保存到上层接口的寄存器中,上层可以自由调用了。

2 、在数据的接收中,采用顺次从高到低移位。所以,先进入的数据被存入了低位。和示波器中的正好相反。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 23: 基于 SPCA718 的 IOP 实现

23

IOPIOP 具体软件的实现具体软件的实现———— VFDVFD 数据的收发(数据的收发( 11 )) VFD 数据的传输是在 STB 为低电平, CLK 为上升沿时进行数据的传输。在程序中,我们就是模仿 STB 和

CLK 的时序,进行数据的接收和发送。具体的程序已经注释好了,在此不在讲述。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 24: 基于 SPCA718 的 IOP 实现

24

IOPIOP 具体软件的实现具体软件的实现———— VFDVFD 数据的收发(数据的收发( 22 )) VFD 数据的接收用 ror rVfddata ;和 IR 的接收一样。 VFD 数据的发送用 lda VFD_BUFFER_BASE,x sta rVfddata VFD-BUFFER : $400-$41c共 28 个字节。其中有 4B 的控制字和

24B 的数据。在我们程序中只用了 16B 的数据。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 25: 基于 SPCA718 的 IOP 实现

25

IOPIOP 具体软件的实现具体软件的实现———— QCODEQCODE 数据的接收数据的接收 QCODE 数据包括 96bit, 其中 80bit 的数据位和 16bit 的 CRC校验位。我们程序中分两种接收,一种是接收 96bit ;一种是接收 80bit 。 数据接收用 rol rQcodedata,x 接收 96bit : xxyy: lda rQcodedata,x sta QCODE_BUFFER,x inx cpx #12 ;; 接收 12bytes=96bits bne xxyy 接收 80bit : xxyy: lda rQcodedata,x sta QCODE_BUFFER,x inx cpx #10 ;; 接收 10bytes=80bits bne xxyy

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 26: 基于 SPCA718 的 IOP 实现

26

I2CI2C 总线简介总线简介 I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线 SDA ,另一根是时钟线 SCL 。 在 I2C 总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。 标准 I2C 总线的设备都有一个七位地址,所有连接在 I2C 总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向 SDA线送出低电平作为应答。 启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位, 0 表示主机发送数据 ( 写 ) , 1 表示主机接收数据 (读 ) 。被寻址到的从机设备按传送方向位设置为

对应工作方式。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 27: 基于 SPCA718 的 IOP 实现

27

I2CI2C 器件地址介绍器件地址介绍 由于 I2C 总线可挂接多个串行接口器件,在 I2C 总线中每个器件应有唯一的器件地址,按 I2C 总线规则,器件地址为 7 位数据 (即一个 I2C 总线系统中理论上可挂接 128 个不同地址的器件 ) ,它和 1 位数据方向位构成一个器件寻址字节,最低位 D0 为方向位 (读 / 写 ) 。 器件寻址字节中的最高 4 位 (D7 ~ D4) 为器件型号地址,不同的 I2C 总线接口器件的型号地址是厂家给定的,如

AT24C 系列 E2PROM 的型号地址皆为 1010 ,器件地址中的低 3 位为引脚地址 A2A1A0 ,对应器件寻址字节中的D3 、 D2、 D1 位,在硬件设计时由连接的引脚电平给定。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 28: 基于 SPCA718 的 IOP 实现

28

AT24CAT24C 系列串行系列串行 EE22PROMPROM 对于 E2PROM 的片内地址,容量小于 256字节的芯片 (AT24C01/02) , 8位片内寻址 (A0 ~ A7)即可满足要求。然而对于容量大于 256字节的芯片,则 8 位片内寻址范围不够,如 AT24C16 ,相应的寻址位数应为 11 位 (211

=2048) 。若以 256字节为 1页,则多于 8 位的寻址视为页面寻址。在AT24C 系列中对页面寻址位采取占用器件引脚地址 (A2 、 A1 、 A0) 的办法,如 AT24C16 将 A2 、 A1 、 A0 作为页地址。凡在系统中引脚地址用作页地址后,该引脚在电路中不得使用,作悬空处理。 AT24C 系列串行E2PROM 的器件地址寻址字节如表所示,表中 P0P1P2 表示页面寻址位。

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 29: 基于 SPCA718 的 IOP 实现

29

I2CI2C 的时序和模拟程序的时序和模拟程序

void I2cStart(void){

Set_SDA_1;Set_SCL_1;

delay_time(1);Set_SDA_0;

delay_time(1);}

void I2cStop(void){

delay_time(1);Set_SDA_0;Set_SCL_1;

delay_time(1);Set_SDA_1;

}

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 30: 基于 SPCA718 的 IOP 实现

30

I2CI2C 完整的数据传输完整的数据传输

启动I2C总线

7位器件地址

读写控制位

应答信号

传送一个字节数据

应答信号

传送一个字节数据

应答信号

结束I2C总线

SUNPLUSTECHNOLOGY FOR EASY LILE

Page 31: 基于 SPCA718 的 IOP 实现

31

Q &AQ &A

衷心感谢胡工和潘工细心的讲解和指导! 感谢 SVCD 全体同仁! 感谢在坐的各位同仁! 谢谢大家!

SUNPLUSTECHNOLOGY FOR EASY LILE