Chinaunix首页 | 论坛 | 博客
  • 博客访问: 594817
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类:

2008-11-26 00:07:55

E2PROM 93C46是基于SPI总线的,低端的EMC单片机没有SPI总线(EM78P153,EM78P156等),跟I2C总线一样,同样我们可以通过IO口模拟的方式来实现93C46的读写。参考网上很多例子,重新用EMC单片机的语法重写代码,并且调试通过。由于基于EMC单片机功能的限制,不能很好的封装函数和抽象底层。函数基本以汇编的形式调用。对从事EMC单片机的同行应该有所帮助。

本程序是本人原创,基于开源的思想(open resources),你可以任意下载使用和修改本代码。由于暂时对GPL不是很熟悉,那么暂时不加约束,自由的使用吧。如果你有更好的修改意见,可以发一份给我

 

/*
 * 项目:模拟IO口访问SPI总线,访问 93C46 程序
 * 作者:Etual / Etual@163.com
 * 日期:2008-11-25
 */



93c46.dt

 


/*---------------------------------------------------------------------------------
                           93c46 管脚定义
功能 : 管脚定义
入口 : void
出口 : void
---------------------------------------------------------------------------------*/

     ioport_93c46 == 0x06 ; DIO at Port
     port_93c46 == 0x06 ; 93c46 管脚
     CS     ==     0        ; 片选
     CLK      ==     1        ; 时钟CLK
     DIO     ==     2        ; 数据IO    

     HigByte == temp3
     LowByte == temp2
     Addr == temp4
;----------------------------------------------------------------------------------
START MACRO
               bc port_93c46,CLK
               bs port_93c46,DIO
               bs port_93c46,CS
               nop
               bs port_93c46,CLK
ENDM
;----------------------------------------------------------------------------------
STOP MACRO
               bc port_93c46,CS
ENDM
;----------------------------------------------------------------------------------
EWEN MACRO
               START
               mov a,@0x30 ; WRITE ENABLE
               call SendByte
               STOP
ENDM
;----------------------------------------------------------------------------------
EWDS MACRO
               START
               mov a,@0x00 ; WRITE DISABLE
               call SendByte
               STOP
ENDM


/*---------------------------------------------------------------------------------
                            写“字”(双字节)到 93c46程序
功能 : 写一个字到93C46,占用2层堆栈,千万注意!!!!!!!!!
入口 : a: 地址
            temp2: low bit data
            temp3: hig bit data
出口 : void
---------------------------------------------------------------------------------*/


WriteWord_93c46:
              ;---------------------------------
               EWEN
              ;---------------------------------
               START
               mov a,Addr
               or a,@0x40 ; 01 + addr(6bit)
               call SendByte ; WRITE COMMAND
               nop
               mov a,HigByte
               call SendByte
               nop
               mov a,LowByte
               call SendByte
               STOP
               call delay
              ;---------------------------------
               EWDS
              ;---------------------------------
ret

;----------------------------------------------------------------------------------
delay:
               mov a,@0xff
               mov temp0,a
               mov a,@15
               mov temp1,a
delay_loop:
               djz temp0
               jmp delay_loop
               mov a,@0xff
               mov temp0,a
               djz temp1
               jmp delay_loop
ret

/*---------------------------------------------------------------------------------
                            读 93c46 程序
功能 : 读一个字到93C46
入口 : a :地址
出口 : temp1:数据低地址
            temp2:数据高地址
---------------------------------------------------------------------------------*/

ReadWord_93c46:
               START
               mov a,Addr
               or a,@0x80
               call SendByte ; 10 + addr(6bit)
               nop
              ;-------------------------------------
               ior ioport_93c46
               or a,@(1<<DIO) ; 0x04
               iow ioport_93c46
              ;-------------------------------------
               clr LowByte
               clr HigByte
               mov Temp0,@16 ; count
read_loop:
               bc port_93c46,CLK
               nop
               bs port_93c46,CLK
               bc psw,c
               jbc port_93c46,DIO
               bs psw,c
               rlc LowByte
               rlc HigByte
               djnz Temp0,read_loop
              ;--------------------------------------
               ior ioport_93c46
               and a,@~(1<<DIO) ;0xfb
               iow ioport_93c46
              ;--------------------------------------
               STOP
               nop
ret


/*---------------------------------------------------------------------------------
                             93c46送数据/命令程序
功能 : 送命令或者数据到93C46(单字节数据)
             调用格式 mov a,@
                                call SendByte
                         或者 call SendByte
入口 : a
出口 : void
局部变量: Temp0,Temp1
---------------------------------------------------------------------------------*/


SendByte:         
     mov Temp0,a
               mov Temp1,@8 ; 循环8次
send_loop:
               bc port_93c46,CLK
               rlc Temp0
               jbs psw,c
               jmp $+3
               bs port_93c46,DIO
               jmp $+2
               bc port_93c46,DIO
               nop
               bs port_93c46,CLK
               nop
               djnz Temp1,send_loop
ret

阅读(1727) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~