打印

i2c

[复制链接]
1278|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daoyuan345610|  楼主 | 2011-10-20 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
daoyuan345610|  楼主 | 2011-10-20 17:24 | 只看该作者
没人能讲清楚吗~~

使用特权

评论回复
板凳
john_light| | 2011-10-20 17:33 | 只看该作者
Sr就是未经STOP的START

使用特权

评论回复
地板
daoyuan345610|  楼主 | 2011-10-20 18:08 | 只看该作者
3# john_light
SR的时序和ST的时序一样吗~~

使用特权

评论回复
5
hopewise| | 2011-10-20 19:45 | 只看该作者
发个我工作中常用的i2c的读和写子程序,初学者直接调用就可以了
1.要写的例子
        。
        。
        mov      A,0bH                                 
        mov      WORD_ADDRESS,A         ;要写入24c02d的地址是0bh
        mov      A,03H
        mov      WRITE_IN,A                    ;把要存放的内容(本例是数字3)暂时放在变量WRITE_IN里(这个变量在下面的写子程序里提到)
        call       ROM_WRITE                    ;调用写子程序   
        。                                              ;其它内容
        。                    
2.要读的例子
         。
         。
         mov     A,70H                             ;要读24c02d的地址是70h
        mov     WORD_ADDRESS,A          ;把要读的地址内容(本例是数字70h)暂时放在变量WORD_ADDRESS里(这个变量在下面的读子程序里提到
        call      ROM_READ                       ;调用写子程序   
        mov     A,0AAH
        xor      A,READ_OUT                   ;从24c02地址70h读出的内容(即变量READ_OUT里的内容)与数字0AAH 进行xor操作                  
        sz       Z                                    ;从地址70H读出的数据等于0AAH吗?   
        jmp     start_BS                         ;是的,则跳到start_BS处
        。                                             ;不是,则执行下面指令
        。

;*******************************************
;*************************读24C02操作*******
ROM_READ PROC
     clr   read_out
     clr   sda_c
     clr   scl_c
  
     set   sda
     call  DELAY_8us
     set   scl
     call  DELAY_8us
     clr   sda                         ;起始信号
  
     clr   scl
     set   sda                         ;1
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl
     clr   sda                         ;0
     set   scl
     call  DELAY_8us
  
     clr   scl
     set   sda                         ;1
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl     
     clr   sda                         ;0
     set   scl
     call  DELAY_8us
  
  
     clr   scl
     clr   sda                         ;a2=0
     set   scl
     call  DELAY_8us
  
     clr   scl
     set   scl
     call  DELAY_8us  
                        
     clr   scl
     set   scl  
     call  DELAY_8us      
                  
     clr   scl
     clr   sda
     set   scl                         ;写模式
     call  DELAY_8us
  
     clr   scl
     set   sda_c
     set   scl
     call  DELAY_8us
wait:
     sz    sda                         ;等待应答信号
     jmp   wait
     clr   scl                         ;写读操作的地址
     clr   sda_c
     mov   a,08h
     mov   data_8,a

read_address_in:
     clr   sda
     sz    word_address.7
     set   sda
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl
     rl    word_address
     sdz   data_8
     jmp   read_address_in
     set   sda_c
     set   scl
     call  DELAY_8us
FDEV1:
     sz    sda                          ;等待应答信号
     jmp   fdev1
     clr   scl
     clr   sda_c
read_data:
     set   sda
     call  DELAY_8us
     set   scl
     call  DELAY_8us
     clr   sda                          ;起始信号
     clr   scl
  
     set   sda                          ;1
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl
     clr   sda                          ;0
     set   scl
     call  DELAY_8us
  
  
     clr   scl
     set   sda                          ;1
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl      
     clr   sda                          ;0
     set   scl
     call  DELAY_8us
  
     clr   scl
     clr   sda                          ;a2=0
     set   scl
     call  DELAY_8us
  
     clr   scl
     clr   sda
     set   scl  
     call  DELAY_8us   
  
                     
     clr   scl
     clr   sda
     set   scl  
     call  DELAY_8us
                        
     clr   scl
     set   sda                          ;读模式
     call  DELAY_8us
     set   scl
     call  DELAY_8us
  
     clr   scl
     set   sda_c
     set   SCL  
     call  DELAY_8us
w_ack:
     sz    sda                          ;等待应答信号
     jmp   w_ack
     clr   scl
     set   sda_c
            
     mov   a,08h                    
     mov   data_8,a

random_out:
     set   scl
     clr   read_out.7
     sz    sda
     set   read_out.7
     clr   scl
     rl    read_out
     sdz   data_8
     jmp   random_out
     clr   sda_c
     set   sda
     set   scl
     clr   scl
     clr   sda                            ;停止信号
     set   scl
     set   sda
     ret
ROM_READ ENDP
;***************************************************
;**************************延时8us秒****************
DELAY_8us:                             
      mov    a, 1
      mov    disp_ram,a
D8US:
      sdz   disp_ram
      jmp   D8US
      ret

      ret

使用特权

评论回复
6
hopewise| | 2011-10-20 20:04 | 只看该作者
补上写子程序

;**************************************************
;**************************24C02的写操作***********
ROM_WRITE PROC
       clr   sda_c                   ;设输出模式
       clr   scl_c                    ;设为低电平
  
       set   sda                     ;起始信号
       set   scl
       call  DELAY_8us
       clr   sda
       call  DELAY_8us
       clr   scl
       call  DELAY_8us
       set   sda                     ;器件地址1010  
       call  DELAY_8us
       set   scl
       call  DELAY_8us
   
       clr   scl
       clr   sda                     ;0
       set   scl
       call  DELAY_8us
  
       clr   scl
       set   sda                     ;1
       call  DELAY_8us
       set   scl
       call  DELAY_8us
  
       clr   scl     
       clr   sda                     ;0
       set   scl
       call  DELAY_8us
  
       clr   scl
       clr   sda                     ;a2=0
       set   scl
       call  DELAY_8us
  
       clr   scl
       set   scl
       call  DELAY_8us
       clr   scl
       set   scl
       call  DELAY_8us
  
       clr   scl
       clr   sda
       set   scl                     ;R/W=0,设为写模式
       call  DELAY_8us
  
       clr   scl
       set   sda_c                   ;设sda为输入模式
       call  DELAY_8us
       set   scl
       call  DELAY_8us
wait_ack:
       sz    sda                     ;等待应答信号
       jmp   wait_ack
       clr   scl                     ;写地址
       clr   sda_c
       mov   a,08h
       mov   data_8,a
random_write:
      clr   sda
      sz    word_address.7
      set   sda
      call  DELAY_8us
      set   scl
      call  DELAY_8us
  
      clr   scl
      rl    word_address
      sdz   data_8
      jmp   random_write
      set   sda_c
      call  DELAY_8us
      set   scl
      call  DELAY_8us
fdev:
      sz    sda                       ;等待应答信号
      jmp   fdev
      clr   scl                       ;写数据
      clr   sda_c
      mov   a,08h
      mov   data_8,a
data_in:
      clr   sda
      sz    write_in.7
      set   sda
      call  DELAY_8us
      set   scl
      call  DELAY_8us
  
  
      clr   scl
      rl    write_in
      sdz   data_8
      jmp   data_in
      set   sda_c
      set   scl
fdev2:
      sz    sda                       ;等待应答信号
      jmp   fdev2
      clr   scl                     
      clr   sda_c
      clr   sda
      set   scl
      set   sda                        ;停止信号
      mov   a,30h                      ;延时
      mov   data_8,a
      mov   a,10h
      mov   disp_ram,a
delay2:
     sdz   data_8
     jmp   delay2
     sdz    disp_ram
     jmp   delay2
     ret
ROM_WRITE ENDP

使用特权

评论回复
7
NE5532| | 2011-10-20 20:09 | 只看该作者
3# john_light  
SR的时序和ST的时序一样吗~~
daoyuan345610 发表于 2011-10-20 18:08


一样,不过做软I2C要想好各函数之间的电平关系,不要出现漏洞。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

53

帖子

1

粉丝