历史上的今天
返回首页

历史上的今天

今天是:2025年01月27日(星期一)

正在发生

2018年01月27日 | EMC单片机的IIC程序软件包

2018-01-27 来源:eefocus

本程序已经稳定使用很长一段时间了,如果非要追根求源,应该追溹到1998年,由于本系统是基于IIC EEPROM的,故对2401的读写采用了阻塞的方式,读不到数据或写不入数据就不退出。


本程序是基于447的,也在163上运行过,不过IO的初始化操作需要作些修改,其他可以完全不用修改。

程序开头的几行ADD A,@0xFF是非常有用的,在以后的文章中会有描述。


        程序如下:

      ;SYSTEM CLOCK 4MHz
      ;IO port define
          SDA    == 4
          SCL    == 3

          MSDA    == 0
          MSCL    == 1
          MCS    == 2
          MRST    == 5
          
      ;Register define
          TREG    == 0X10
          TCNT    == 0X11
          GCNT    == 0X12

          IICADDR    == 0X1E
          IICBUF    == 0X28
          IICDAT0    == 0X28
          IICDAT1    == 0X29
          IICDAT2    == 0X2A
          IICDAT3    == 0X2B
          IICDAT4    == 0X2C
          IICDAT5    == 0X2D
          IICDAT6    == 0X2E
          IICDAT7    == 0X2F
          
          INCLUDE "EM78P447S.H"
          
          ORG    0X000
          ADD    A,@0XFF
          ADD    A,@0XFF
          ADD    A,@0XFF
          ADD    A,@0XFF
          ADD    A,@0XFF

      START:
          DISI
          SET P6 P7 PULL UP EN
          CONTR
          MOV    TREG,A
          BC    TREG,7
          MOV    A,TREG
          CONTW
          SET SCL SDA OUTPUT HIGH
          MOV    A,@0XFF
          MOV    TREG,A
          BC    TREG,SCL    SCL OUTPUT
          BC    TREG,SDA    SDA OUTPUT
          MOV    A,TREG
          IOW    IOC6
          BS    R6,SCL        SCL HIGH
          BS    R6,SDA        SDA HIGH

      ;********************************************************************
      ;读入的测试程序,读取2401的0x00~0x07地址内容
      READ_2401:
          MOV    A,@0X00
          MOV    IICADDR,A
          CALL    IIC_R8BYT
          RET

      ;********************************************************************
      ;写入的测试程序,向2401的0x00~0x07地址写入0x00
      WRITE_2401:
          MOV    A,@0X00
          MOV    IICADDR,A
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CLR    IICDAT
          CALL    IIC_W8BYT
          RET

      ;********************************************************************
      ;与MicroChip的2401接口程序
      ;********************************************************************
      ;IIC_W8BYT,向2401的指定地址写入8个字节数据
      ;地址由IICADDR指定,数据存在IICDAT0~IICDAT7
      IIC_W8BYT:
          CALL    IIC_START
          MOV    A,@0XA0
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W8BYT
          MOV    A,IICADDR
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W8BYT
          WRITE 8 BYTES TO 24C01
          MOV    A,@IICBUF
          MOV    R4,A
          MOV    A,@8
          MOV    GCNT,A
      IIC_W8BYT1:
          MOV    A,R0
          INC    R4
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W8BYT
          DJZ    GCNT
          JMP    IIC_W8BYT1
          CALL    IIC_STOP
          RET

      ;********************************************************************
      ;IIC_W1BYT,向2401的指定地址写入1个字节数据
      ;地址由IICADDR指定,数据存在IICDAT0
      IIC_W1BYT:
          CALL    IIC_START
          MOV    A,@0XA0
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W1BYT
          MOV    A,IICADDR
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W1BYT
          WRITE 1 BYTES TO 24C01
          MOV    A,@IICBUF
          MOV    A,IICDAT0
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_W1BYT1
          CALL    IIC_STOP
          RET

      ;********************************************************************
      ;IIC_R8BYT,从2401的指定地址(IICADDR)读入8个字节数据
      IIC_R8BYT:
          CALL    IIC_START
          MOV    A,@0XA0
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R8BYT
          MOV    A,IICADDR
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R8BYT
          CALL    IIC_START
          MOV    A,@0XA1
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R8BYT
          READ 8 BYTES FROM 24C01
          MOV    A,@IICBUF
          MOV    R4,A
          MOV    A,@7
          MOV    GCNT,A
      IIC_R8BYT1:
          CALL    IIC_RBYT
          MOV    R0,A
          INC    R4
          CALL    IIC_SACK
          DJZ    GCNT
          JMP    IIC_R8BYT1
          CALL    IIC_RBYT
          MOV    R0,A
          CALL    IIC_SNACK
          CALL    IIC_STOP
          RET

      ;********************************************************************
      ;IIC_R1BYT,向2401的指定地址读出1个字节数据
      ;地址由IICADDR指定,数据存在IICDAT0
      IIC_R1BYT:
          CALL    IIC_START
          MOV    A,@0XA0
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R1BYT
          MOV    A,IICADDR
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R1BYT
          CALL    IIC_START
          MOV    A,@0XA1
          CALL    IIC_WBYT
          CALL    IIC_CACK
          JBC    R3,GP        IF GP=1 OPTION AGAIN
          JMP    IIC_R1BYT
          READ 1 BYTES FROM 24C01
          CALL    IIC_RBYT
          MOV    IICDAT0,A
          CALL    IIC_SNACK
          CALL    IIC_STOP
          RET

      ;********************************************************************
      ;IIC_START
      IIC_START:
          BS    R6,SCL        SCL=1
          BS    R6,SDA        SDA=1
          CALL    IIC_DELAY
          BC    R6,SDA        SDA=0
          CALL    IIC_DELAY
          RET
          
      ;********************************************************************
      ;IIC_STOP
      IIC_STOP:
          BS    R6,SCL        SCL=1
          BC    R6,SDA        SDA=0
          CALL    IIC_DELAY
          BS    R6,SDA        SDA=1
          CALL    IIC_DELAY
          RET

      ;********************************************************************
      ;IIC_CACK IF ACK,FIIC=0
      IIC_CACK:
          SET SDA INPUT
          IOR    IOC6
          MOV    TREG,A
          BS    TREG,SDA
          MOV    A,TREG
          IOW    IOC6
          BS    R6,SCL        SCL=1
          BC    R3,GP
          JBC    R6,SDA
          BS    R3,GP
          BC    R6,SCL        SCL=0
          SET SDA OUTPUT
          IOR    IOC6
          MOV    TREG,A
          BC    TREG,SDA
          MOV    A,TREG
          IOW    IOC6
          RET

      ;********************************************************************
      ;IIC_SACK
      IIC_SACK:
          BC    R6,SDA        SDA=0
          NOP
          BS    R6,SCL        SCL=1
          CALL    IIC_DELAY
          BC    R6,SCL        SCL=0
          CALL    IIC_DELAY
          RET
          
      ;********************************************************************
      ;IIC_SNACK
      IIC_SNACK:
          BS    R6,SDA        SDA=1
          NOP
          BS    R6,SCL        SCL=1
          CALL    IIC_DELAY
          BC    R6,SCL        SCL=0
          CALL    IIC_DELAY
          RET

      ;********************************************************************
      ;IIC_WBYT
      IIC_WBYT:
          MOV    TREG,A
          MOV    A,@8
          MOV    TCNT,A
      IIC_WBYT1:
          BC    R6,SCL        SCL=0
          JBC    TREG,7
          JMP    IIC_WBIT1
          JMP    IIC_WBIT0
      IIC_WBIT1:
          BS    R6,SDA
          JMP    IIC_WBYT2
      IIC_WBIT0:
          BC    R6,SDA        SDA=X
          JMP    IIC_WBYT2
      IIC_WBYT2:
          RLC    TREG
          CALL    IIC_DELAY
          BS    R6,SCL        SCL=1
          CALL    IIC_DELAY
          DJZ    TCNT
          JMP    IIC_WBYT1
          BC    R6,SCL        SCL=0
          CALL    IIC_DELAY
          RET
          
      ;********************************************************************
      ;IIC_RBYT
      IIC_RBYT:
          MOV    A,@8
          MOV    TCNT,A
          SET SDA INPUT
          IOR    IOC6
          OR    A,@0X10
          IOW    IOC6
      IIC_RBYT1:
          BS    R6,SCL        SCL=1
          JBC    R6,SDA
          JMP    IIC_RBIT1
          JMP    IIC_RBIT0
      IIC_RBIT1:
          BS    TREG,0
          JMP    IIC_RBYT2
      IIC_RBIT0:
          BC    TREG,0        SDA=X
          JMP    IIC_RBYT2
      IIC_RBYT2:
          RLC    TREG
          BC    R6,SCL        SCL=0
          CALL    IIC_DELAY
          DJZ    TCNT
          JMP    IIC_RBYT1
          STORE READ RESULT
          RRC    TREG
          MOV    A,TREG
          MOV    TCNT,A
          SET SDA OUTPUT
          IOR    IOC6
          AND    A,@0XEF
          IOW    IOC6
          RESTORE READ RESULT
          MOV    A,TCNT
          RET

      ;********************************************************************
      ;
      IIC_DELAY:
          NOP
          NOP
          RET
          
          ORG    0XFFF
          JMP    START


推荐阅读

史海拾趣

Embedded Artists公司的发展小趣事

Embedded Artists公司成立于2000年,创始人是一群热衷于嵌入式技术的瑞典工程师。他们看到了嵌入式技术在未来电子产品中的巨大潜力,决定成立一家公司,专注于基于恩智浦处理器的嵌入式解决方案的研发和生产。公司初期面临资金紧张、市场认可度不高等挑战,但他们凭借对技术的热情和不懈的努力,逐渐在行业中树立了口碑。

Cofan Usa Inc公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Cofan Usa Inc公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司成功将产品推向更广泛的消费者群体。同时,公司注重品牌建设,通过精准的市场定位和有效的营销策略,逐渐树立了独特的品牌形象。

CSB公司的发展小趣事

随着国内市场的饱和,CSB公司开始将目光投向海外市场。公司制定了国际化战略,通过设立海外分支机构、拓展国际市场渠道、加强与国际合作伙伴的合作等方式,逐步实现了全球市场的布局。在国际市场上,CSB公司的产品和服务得到了广泛认可,为公司带来了丰厚的回报。

这些故事虽然是对电子行业企业发展的一般性描述,但可能在一定程度上反映了CSB公司或其他类似企业在电子行业中的发展历程。然而,需要注意的是,每个企业的发展道路都是独特的,具体的故事还需根据企业自身的实际情况来编写。

ASPEED Technology公司的发展小趣事

ASPEED的AST2600 BMC与瑞萨电子的I3C器件相结合,为客户提供了设计便捷、带宽增强且系统成本优化的解决方案。这一合作不仅展示了ASPEED在服务器管理领域的实力,还进一步推动了DDR5解决方案对I3C标准的推广使用。通过双方的努力,共同客户在实现向全新高速总线接口飞跃发展的过程中,获得了更加信心满满的设计体验。

BAHCO公司的发展小趣事

一直以来,BAHCO都秉持着创新的设计理念和对品质的极致追求。其鱼和鱼钩的商标不仅代表了公司的品牌形象,更是品质的保证。通过不断的研发和技术创新,BAHCO的产品在功能性、耐用性和舒适性等方面都达到了行业领先水平。这种对品质的不懈追求,使得BAHCO在全球工具市场上获得了广泛的认可和好评。

HIT(日立)公司的发展小趣事
在电路中设置过流、过压等保护电路,以防止电路在异常情况下损坏或引发安全事故。

问答坊 | AI 解惑

继电器应用技巧(原创)

1.要正确选型    要用好继电器,正确选型是很重要的,首先必须对被控对象的性质、特点和使用要求有透彻的了解,并进行周密考虑。对所选继电器的原理、用途、技术参数、结构特点、规格型号要掌握和分析。在此基础上应根据项目实际情况和 ...…

查看全部问答>

调用api拨号上网,能用api更改拨号设置吗

我调用rasdial拨号上网,设置是之前设置好的一个拨号连接,现在我想更改这个拨号连接的设置,让其不用流控,我找了半天ras相关的函数,都没有发现可以进行这些设置的,RasSetCommSettings是在自己写的dll里面更改波特率之类的,但是就是没有更改是 ...…

查看全部问答>

可否把手机等充电器集成到一个开关电源里面?

现在手头充电器太多了 我想能不能订做一个开关电源 把手机、PSP、笔记本电脑等的充电器都集成到一个开关电源里面 接出来不同的接口 这样可以吗?各种充电器是不是就是一个电压转换的作用啊?谢谢各位…

查看全部问答>

兼职MCU,DSP,ARM,FPGA,CPLD芯片程序的破解

本人擅长于MCU,DSP,ARM,FPGA,CPLD程序的破解和电路板的抄板,原理图和PCB的绘制,破解的成功率非常高。同时还承担单片机系统以及中央空调等方面的开发。如有需要请联系我。sale.jiemi@gmail.com …

查看全部问答>

关于定时器的启动位 TR

..今天上课的时候, 老师写了一串代码.. ORG 0000H SJMP MAIN ORG 000BH SJMP INT0 MAIN:MOV TMOD,#01H      MOV A, #FEH      MOV P1,A      MOV TH0, #23H    & ...…

查看全部问答>

请问:用vc++编的界面程序怎么跟人机界面里的伺服驱动器通讯(用232),说下大体思路和注意事项.谢谢了!

请问: 用vc++编的界面程序怎么跟人机界面里的伺服驱动器通讯(用232),说下大体思路和注意事项.谢谢了! 我刚进公司,没做过这个,上司交给我这个任务,要是完不成就要走人了. 请高人指教.分不多了,实在不好意思,重在交流嘛…

查看全部问答>

《智能家居系统》使用芯片手册。

本系统需要使用到的IC资料收集如下:   1. LPC1768: 2. LPC1114: 3. dp83848: 4. 华为GTM900 无线模块 产品描述手册: 5. 24C02: 6. LCD1602: 7. LM2596-5.0: 8. DS18B20: 9. 3.2tft: [ 本帖最后由 zhaojun_xf 于 2010-8-6 06:34 ...…

查看全部问答>

JS16USBDM

用JS16做的USBDM在设备管理器里出现了USBDM BDM Interface, 到这一步接下来应该怎么做呢? …

查看全部问答>

IO口配置为外部中断后,如何获取端口处的电平?

                                 我把一个IO口配置为外部中断输入端口,在程序中又需要用到这个端口来获取外部输入电平的高低。请问如何将它重新配 ...…

查看全部问答>

【求助】看门狗在什么地方喂最优?

我现在一般在中断中喂狗但是发现这样会存在一些弊端。请教各位,在什么地方喂最好,使系统最稳定。…

查看全部问答>