;Slave.asm
SCL BIT P1.
SDA BIT P1.

;----------------------------
    ORG
RESET:
    SETB    SCL
    SETB    SDA
    CALL    I2C_WAITSTART    ;等待起始信号
    CALL    I2C_RXBYTE        ;接收地址数据
    CLR     C
    CALL    I2C_TXACK        ;回应ACK
    SETB    C                ;读/写 IDATA[80H - FFH]
    RRC     A                ;读/写位->C
    MOV        R0,A             ;地址送入R0
    JC         READDATA         ;C=1(读) C=0(写)
WRITEDATA:
    CALL    I2C_RXBYTE         ;接收数据
    MOV        @R0,A             ;写入IDATA
    INC        R0                 ;地址+1
    CLR        C
    CALL    I2C_TXACK         ;回应ACK
    CALL    I2C_WAITSTOP     ;等待停止信号
    JMP        RESET
READDATA:
    MOV        A,@R0
    INC        R0
    CALL    I2C_TXBYTE        ;发送IDATA数据
    CALL    I2C_RXACK        ;接收ACK
    CALL    I2C_WAITSTOP    ;等待停止信号
    JMP        RESET

;----------------------------
;等待起始信号
;----------------------------
I2C_WAITSTART:
    JNB     SCL,$             ;等待时钟->高
    JB        SDA,$             ;等待数据线下降沿
    JB        SCL,$             ;等待时钟->低
    RET

;----------------------------
;等待结束信号
;----------------------------
I2C_WAITSTOP:
    JNB     SCL,$             ;等待时钟->高
    JNB     SDA,$             ;等待数据线上升沿
    RET

;----------------------------
;发送ACK/NAK信号
;----------------------------
I2C_TXACK:
    MOV     SDA,C             ;送ACK数据
    JNB     SCL,$             ;等待时钟->高
    JB        SCL,$             ;等待时钟->低
    SETB    SDA             ;发送完成
    RET

;----------------------------
;接收ACK/NAK信号
;----------------------------
I2C_RXACK:
    SETB    SDA                ;准备读数据
    JNB        SCL,$            ;等待时钟->高
    MOV        C,SDA            ;读取ACK信号
    JB        SCL,$            ;等待时钟->低
    RET

;----------------------------
;接收一字节数据
;----------------------------
I2C_RXBYTE:
                 ;8位计数
RXNEXT:
    JNB     SCL,$             ;等待时钟->高
    MOV     C,SDA             ;读取数据口
    RLC     A                 ;保存数据
    JB        SCL,$             ;等待时钟->低
    DJNZ    R7,RXNEXT         ;收下一位
    RET

;----------------------------
;发送一字节数据
;----------------------------
I2C_TXBYTE:
                 ;8位计数
TXNEXT:
    RLC     A                 ;移出数据位
    MOV     SDA,C             ;数据送数据口
    JNB     SCL,$             ;等待时钟->高
    JB         SCL,$             ;等待时钟->低
    DJNZ     R7,TXNEXT         ;送下一位
    RET
;----------------------------
;END

模拟I2C从机程序的更多相关文章

  1. 模拟I2C从机

    模拟I2C主机的比较多,但是从机相对主机而言要难很多,这个供大家借鉴. 这个从机程序支持主机对它的随机写和随机读,连续读和连续写没做,有兴趣的可以完善下,呵呵. //Microcontrol CODE ...

  2. STM32F4XX中断方式通过IO模拟I2C总线Master模式

    STM32的I2C硬核为了规避NXP的知识产权,使得I2C用起来经常出问题,因此ST公司推出了CPAL库,CPAL库在中断方式工作下仅支持无子地址 的器件,无法做到中断方式完成读写大部分I2C器件.同 ...

  3. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  4. STM8S 模拟I2C程序

    STM8S的硬件I2C还是存在问题,不敢贸然使用. 于是决定用模拟I2C. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM P ...

  5. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  6. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

  7. JAVA - ATM机程序

    ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...

  8. STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数

    1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...

  9. 关于模拟I2C的一些问题???

    1.在调试BH1750时发现stm32f103rb单片机用模拟I2C通讯时引脚使用开漏模式能正常读出来数据,使用推挽模式则完全无法通讯,发送地址后从机没有应答? https://blog.csdn.n ...

随机推荐

  1. [RxJS] Combination operator: zip

    CombineLatest and withLatestFrom are both AND-style combination operators. In this lesson, we will l ...

  2. cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法

    问题描写叙述:   这段时间机器总是出现一个奇怪的问题:cidaemon.exe进程占用CUP率98%以上,大大影响了电脑的正常使用.资源管理器中出现多个cidaemon.exe进程,强制结束占用cp ...

  3. mybatis0205 一对多查询 复杂

    查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息 1.1sql 主查询表:用户信息 关联查询:订单.订单明细,商品信息 SELECT orders.*, user ...

  4. Hadoop作业调度器

    随着 MapReduce 的流行,其开源实现 Hadoop 也变得越来越受推崇.在 Hadoop 系统中,有一个组件非常重要,那就是调度器.调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计 ...

  5. Tomcat源码分析--转

    一.架构 下面谈谈我对Tomcat架构的理解 总体架构: 1.面向组件架构 2.基于JMX 3.事件侦听 1)面向组件架构 tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成 ...

  6. openwrt advanced configuration

    openwrt高级配置(汗 照着标题就翻译过来了) openwrt Kamikaze 8.09的一般配置文件都在目录 /etc/config 下面,可以使用脚本来调用参数和设置参数. 比如 sbin/ ...

  7. 微软企业库Microsoft Enterprise Library的相关文章链接

    微软企业库4.1学习笔记 http://blog.csdn.net/anyqu/article/category/1228691/3 黄聪:Enterprise Library 5.0 系列教程 ww ...

  8. 限制UITextField/UITextView的输入字数与中文输入之后的英文换行问题

    要限制一个UITextField/UITextView的输入字数,首先想到的应该是通过UITextFieldDelegate/UITextViewDelegate的代理方法来限制,那么如何来更好的限制 ...

  9. ios strong weak 的区别 与 理解

    先一句话总结:strong类保持他们拥有对象的活着,weak类他们拥有的对象被人家一牵就牵走,被人家一干就干死.(strong是一个好大哥所以strong,呵呵,weak是一个虚大哥所以weak,呵呵 ...

  10. 十、C# 异常处理

    1.多异常类型 2.捕捉异常 3.常规catch块 4.异常处理的指导原则 5.定义自定义异常   1.多异常类型 代码要引发任何异常,只需为要引发的异常实例实例附加关键字throw作为前缀.具体选择 ...