330 likes | 634 Views
SUNPLUS TECHNOLOGY FOR EASY LILE. 基于 SPCA718 的 IOP 实现. 数码影音二部 吴中建 2004/04/28 E-MAIL:WUZHJ@SUNPLUS.COM.CN. SUNPLUS TECHNOLOGY FOR EASY LILE. 目录. IOP 的功能 6502常用指令搭配简介 IOP 的内存的分配 IOP、RISC 与 GPIO 的联系 IOP 具体软件的实现 I2C 简介 Q&A. SUNPLUS
E N D
SUNPLUS TECHNOLOGY FOR EASY LILE 基于SPCA718的IOP实现 数码影音二部 吴中建 2004/04/28 E-MAIL:WUZHJ@SUNPLUS.COM.CN
SUNPLUS TECHNOLOGY FOR EASY LILE 目录 • IOP的功能 • 6502常用指令搭配简介 • IOP的内存的分配 • IOP、RISC与GPIO的联系 • IOP具体软件的实现 • I2C简介 • Q&A
SUNPLUS TECHNOLOGY FOR EASY LILE IOP的功能 • IOP is I/O process。是一个8位的MCU,它用做718的中间处理器。 • 在718中处理一些实时的功能,负责控制周遍的设备,可以响应比较快的动作,减少RISC的负担。 • 通常用于IR的接受,VFD的键扫和送显,GAME手柄的接收,QCODE的接收,I2C通讯 。
SUNPLUS TECHNOLOGY FOR EASY LILE 6502常用指令搭配简介——寄存器 大多数操作都是在此进行 用于间接寻址
SUNPLUS TECHNOLOGY FOR EASY LILE 6502常用指令搭配简介——状态寄存器(P) 进位标志 负数标志 零标志 溢出标志 中断标志 暂停命令标志 十进制模式标志
SUNPLUS TECHNOLOGY FOR EASY LILE 6502常用指令搭配简介——数的表示 • 二进制数的表示: #%00000001或#00000001B • 十进制数的表示: #01或#01D • 十六进制数的表示: #$01或#01H 寄存器的寻址方式请参考6502_inst.pdf,在此不在赘述。
SUNPLUS TECHNOLOGY FOR EASY LILE 6502常用指令搭配简介——常用指令(1) 1, 位置高、置低指令, rmb bit, BYTE ;;置低 smb bit, BYTE ;;置高 这两条指令为对某一个BYTE的其中一位置高,置低,这在写OUTPUT 可用 2, 判断某一位高低而转移到不同的分支 bbr bit, BYTE ,标识 ;;若这一BYTE的bit为低,则程序跳转到标识处执行,否则就顺序执行 bbs bit, BYTE , 标识 ;;若这一BYTE的bit 为高,则程序跳转到标识处执行,否则就顺序执行 3, 程序分支语句: jmp 标识 ;; 它为程序跳转到某一分支执行,跳转的范围较大。 bra 标识 ;; 它为程序跳转到某一分支执行.其实相当与jmp,只是跳转的范围较小。
SUNPLUS TECHNOLOGY FOR EASY LILE 6502常用指令搭配简介——常用指令(2) 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文件
SUNPLUS TECHNOLOGY FOR EASY LILE IOP memory Cache memory 0 $0 $40 Zero page $ff NMI,RESET, IRQ Vector 448 byte $106 Page 1(Stack Area) $1ff $1ff 32 byte 32 byte 32 byte 32 byte $240 $0 ~$40 (I/O area) : 512 byte cache $ffff Only 2 Direct Mapped Cache line, each 32 bytes IOP的内存的分配——I/O and cache
SUNPLUS TECHNOLOGY FOR EASY LILE IOP的内存的分配——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中
SUNPLUS TECHNOLOGY FOR EASY LILE 定时器以初值减,产生溢出中断 Timer A $22 $23 Intr A Overflow Timer B $24 $25 Intr B Overflow SYS_CLK
SUNPLUS TECHNOLOGY FOR EASY LILE gpio_sel_aux gpio_sle IOP、RISC与GPIO的联系 RISC path: gpio_oe[4] gpio_out[4] gpio_in[4] GPIO 0~41 gpio_master Decide GPIO route IOP path: $00 ~$0F Register Select GPIO control path 1: RISC 0:IOP
SUNPLUS TECHNOLOGY FOR EASY LILE RISC 对I/O口如何设置
SUNPLUS TECHNOLOGY FOR EASY LILE IOP 对I/O口如何设置 1、对I/O的置高、置低需要对应的64bit的空间来控制,对应的位写0-置低;写1-置高。在iop.inc中定义如下: GPIO_PROT0 EQU $00 ; 对应GPIO0-7 GPIO_PROT7 EQU $07 ;对应GPIO56-63 2、对I/O的输入、输出也需要对应的64bit的空间来控制,对应的位写0-输入;写1-输出。在iop.inc中定义如下: GPIO_IO0_CFG EQU $08 ;对应GPIO0-7 GPIO_IO0_CFG EQU $08 ;对应GPIO56-63
SUNPLUS TECHNOLOGY FOR EASY LILE IOP与上层的接口 状态标志 时间中断标记 Ir数据 游戏手柄数据 面板按键码值 IOP_DATA0_L …. IOP_DATA7_H (16BYTE) 寄存器 IOP-DATA[8] Vfd_mem[ ]—sent out Qcode_data[ ]--recieve SDRAM space: Sdram_base+ iopya*1024+0x400 $400--$41f(32BYTE) $420--$42a(10BYTE)
SUNPLUS TECHNOLOGY FOR EASY LILE 2K IOP空间具体结构 1:了解Dram中各部分空间很重要,编写程序时请务必有 Stack空间的概念,否则,出现莫名其妙的问题时麻烦 就来了; 2:IOP Code Size亦不能无限扩展,以免冲掉伺服变量 导致系统伺服动作失效。
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——软件的总体架构 Reset 初始化 定时器中断 每100uS发生一次 Virq { 1,清除中断标志 2,用户的计数变 量递减 3,通过data5提供 上层1ms和10ms 的信号 } Mainloop { Qcode service Ir service Vfdr service Vfdw service } 中断返回
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——IR头码的抓取(1) • 判断头码是关键程序 • 提醒您注意几个地方: 1,irq.asm中的rIrCountH 2,rIrCountH与rIrCountLbuf关系。这两个参数在高低电平变化时相互配合,完成时间判定。 3,注意irq 一次循环100us
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——IR头码的抓取(2) • 以NEC为例,时间长度的描述。 例:先9ms LOW,后4.5msHIGH,说明IR HEAD已传来,系统需要接受IR。 rIrCountH记数 ~ IR in 定时100US rIrCountLbuf记数 ~ Timer B
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——IR头码的判断(3) • 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 • 注释:上面的时序描述,完全反映了头码及重复码的判定过程。
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——IR数据的抓取 • cmp #11 // >>11,为1。Else 0 • ror rIrReceiver • ror rIrReceiver+1 • ror rIrReceiver+2 • ror rIrReceiver+3 C C D7 D6 D5 D4 D3 D2 D1 D0 C C
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——IR数据校验和保存 • 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、在数据的接收中,采用顺次从高到低移位。所以,先进入的数据被存入了低位。和示波器中的正好相反。
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——VFD数据的收发(1) • VFD数据的传输是在STB为低电平,CLK为上升沿时进行数据的传输。在程序中,我们就是模仿STB和CLK的时序,进行数据的接收和发送。具体的程序已经注释好了,在此不在讲述。
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——VFD数据的收发(2) • VFD数据的接收用ror rVfddata ;和IR的接收一样。 • VFD数据的发送用lda VFD_BUFFER_BASE,x sta rVfddata • VFD-BUFFER:$400-$41c共28个字节。其中有4B的控制字和24B的数据。在我们程序中只用了16B的数据。
SUNPLUS TECHNOLOGY FOR EASY LILE IOP具体软件的实现——QCODE数据的接收 • 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
SUNPLUS TECHNOLOGY FOR EASY LILE I2C总线简介 • I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。 • 在 I2C总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。 • 标准I2C总线的设备都有一个七位地址,所有连接在I2C总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向SDA线送出低电平作为应答。 • 启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位,0表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。
SUNPLUS TECHNOLOGY FOR EASY LILE I2C器件地址介绍 • 由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。 • 器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2A1A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。
SUNPLUS TECHNOLOGY FOR EASY LILE AT24C系列串行E2PROM • 对于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表示页面寻址位。
SUNPLUS TECHNOLOGY FOR EASY LILE I2C的时序和模拟程序 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; }
SUNPLUS TECHNOLOGY FOR EASY LILE I2C完整的数据传输 读写控制位 启动I2C总线 结束I2C总线 7位器件地址 应答信号 应答信号 传送一个字节数据 应答信号 传送一个字节数据
SUNPLUS TECHNOLOGY FOR EASY LILE Q &A 衷心感谢胡工和潘工细心的讲解和指导! 感谢SVCD全体同仁! 感谢在坐的各位同仁! 谢谢大家!