⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_read.asm

📁 在DM642平台上
💻 ASM
字号:
;;;;;;;;----------初始化i2c外设
I2COAR0   .equ 0x01b40000
i2cier0   .equ 0x01b40004
i2cstr0   .equ 0x01b40008
i2cclkl0  .equ 0x01b4000c
i2cclkh0  .equ 0x01b40010
i2ccnt0   .equ 0x01b40014
i2cdrr0   .equ 0x01b40018
i2csar0   .equ 0x01b4001c
i2cdxr0   .equ 0x01b40020
i2cmdr0   .equ 0x01b40024
i2cisrc0  .equ 0x01b40028
reserved  .equ 0x01b4002c
i2cpsc0   .equ 0x01b40030
i2cpid10  .equ 0x01b40034
i2cpid20  .equ 0x01b40038
          .def loopw
          .def loopw1
          .def loopw2
          .def loopw3
          .def loopr
          .def loopr1
          .def loopr2
         ;.def loopr3          
;;;;;;;;;;传递函数,a31为写地址, b31读数据,      
loopw1:mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;bb=0?
       ldw    *a1,b2
       nop    
       mvkl   1000h,a0 
       mvkh   0h,a0
       and    a0,b2,a0
 [a0]  b      loopw1
       nop    5
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;判断总线忙不忙
       mvkl   66a0h,b2
       mvkh   0h,b2 
       nop
       mvkl   i2cmdr0,a2
       mvkh   i2cmdr0,a2;设定工作模式
       stw    b2,*a2
       nop    9
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始传输数据
       mvk    0h,a8
       mvk    01h,b8;设定数据量 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loopw2:mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;nack=0?
       ldw    *a1,a2
       mvkl   2h,a0 
       mvkh   0h,a0
       and    a0,a2,a0
 [a0]  b      loopw2
       nop    5 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看是否有总线响应
       mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;请求发送数据
       ldw    *a1,b1
       mvkl   10h,a0 
       mvkh   0h,a0
       and    a0,b1,a0
       nop    9
 [!a0] b      loopw2 
       nop    9 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看缓冲器里的数据是否准备好
       cmpeq  a8,b8,a0
 [a0]  b      loopw 
     ;  nop    2  ;这里加延时会出现错误___________________? 
       add    1,a8,a8          
       mvkl   i2cdxr0,a1
       mvkh   i2cdxr0,a1;发送数据的值 
       mvd    a30,b1 ;从机为57h发送55有相应
       nop    3
       stw    b1,*a1
       nop    9  
       mvkl   10h,b1
       mvkh   0h,b1
       bdec   $,b1    
       nop    5
       b      loopw2 
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;; 发送数据

loopw: mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;nack=0?
       ldw    *a1,a2
       mvkl   2h,a0 
       mvkh   0h,a0
       and    a0,a2,a0
 [a0]  b      loopw
       mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;ardy=0
       ldw    *a1,a2
       mvkl   4h,a0 
       mvkh   0h,a0
       and    a0,a2,a0 
 [!a0] b      loopw  
       nop    5  
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看是否成功访问
       mvkl   0a600h,b1
       bdec   $,b1
       nop    5
       mvkl   i2cmdr0,a1
       mvkh   i2cmdr0,a1
       ldw    *a1,b1     
       mvkl   0dfffh,a2
       mvkh   0ffffh,a2                                                                                                                                                                                                                                     
       and    a2,b1,a0
       stw    a0,*a1
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;
       mvkl   i2cmdr0,a1
       mvkh   i2cmdr0,a1
       ldw    *a1,b1   
       mvkl   0800h,a0 
       mvkh   0h,a0
       or     a0,b1,a0
       stw    a0,*a1
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;;;;;
       ;;;;;;;;;;;;;;;;;;;;;;;
       mvkl   0ffffh,b0
       mvkh   0h,b0    
       nop    5
       nop
       bdec   $,b0
       nop    5 
       ;;;;;;;;;;;;;;;;;;发送停止
loopw3: nop    9
       nop    9
       mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;bb=1?
       ldw    *a1,b2
       nop    9
       mvkl   1000h,a0 
       mvkh   0h,a0
       and    a0,b2,a0
       stw    a0,*a1
 [a0]  b      loopw3
       nop    4;;;;;;;;;;;;;;;清忙位
       nop
       nop    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;读数据;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
           mvkl   05dh,a31
           mvkh   00h,a31
       ;   .copy   "i2c_config.asm"
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loopr1:mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;bb=0?
       ldw    *a1,b2
       nop    
       mvkl   1000h,a0 
       mvkh   0h,a0
       and    a0,b2,a0
 [a0]  b      loopr1
       nop    5
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;判断总线忙不忙
       mvkl   064a0h,b2
       mvkh   0h,b2 
       nop
       mvkl   i2cmdr0,a2
       mvkh   i2cmdr0,a2;设定工作模式
       stw    b2,*a2
       nop    9
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始传输数据
       mvk    0h,a8
       mvk    01h,b8;设定数据量 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loopr2:mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;nack=0?
       ldw    *a1,a2
       mvkl   2h,a0 
       mvkh   0h,a0
       and    a0,a2,a0
 [a0]  b      loopr2
       nop    5 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看是否有总线响应
       mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;请求发送数据
       ldw    *a1,b1
       mvkl   8h,a0 
       mvkh   0h,a0
       and    a0,b1,a0
       nop    9
 [!a0] b      loopr2 
       nop    9 
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看缓冲器里的数据是否准备好
       cmpeq  a8,b8,a0
 [a0]  b      loopr 
     ;  nop    2  ;这里加延时会出现错误___________________? 
       mvkl   0E4a0h,b2
       mvkh   0h,b2 
       nop
       mvkl   i2cmdr0,a2
       mvkh   i2cmdr0,a2;设定工作模式
      ; stw    b2,*a2
       nop    9 
       nop    5 
       add    1,a8,a8 
       zero   b10         
       mvkl   i2cdrr0,a1
       mvkh   i2cdrr0,a1;发送数据的值 
      ; mvkl   0h,a10;从机为57h发送55有相应
       ;stw    a10,*a1      
       ldw    *a1,b10
       nop    9
       mvkl   8000h,b2
       mvkh   0h,b2 
       nop
       mvkl   i2cmdr0,a2
       mvkh   i2cmdr0,a2;设定工作模式
       ldw    *a2,b1
       nop    4
       and    b2,b1,b1
       stw    a1,*a2
       nop    9  
loopr4:mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;nack=0?
       ldw    *a1,a2
       mvkl   2000h,a0 
       mvkh   0h,a0
       and    a0,a2,a0
 [!a0] b      loopr4
       NOP
       mvkl   010h,b1
       mvkh   0h,b1
       bdec   $,b1    
       nop    5
       b      loopr2 
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;; 发送数据
       mvkl   0ffffh,b1
       bdec   $,b1 

loopr: mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;ardy=0
       ldw    *a1,a2
       mvkl   4h,a0 
       mvkh   0h,a0
       and    a0,a2,a0 
 [!a0] b      loopr  
       nop    5  
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;察看是否成功访问
       mvkl   0a600h,b1
       bdec   $,b1
       nop    5
       mvkl   i2cmdr0,a1
       mvkh   i2cmdr0,a1
       ldw    *a1,b1     
       mvkl   0dfffh,a2
       mvkh   0ffffh,a2                                                                                                                                                                                                                                     
       and    a2,b1,a0
       stw    a0,*a1
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;
       mvkl   i2cmdr0,a1
       mvkh   i2cmdr0,a1
       ldw    *a1,b1   
       mvkl   0800h,a0 
       mvkh   0h,a0
       or     a0,b1,a0
       stw    a0,*a1
       nop    5
       ;;;;;;;;;;;;;;;;;;;;;;;;;
       ;;;;;;;;;;;;;;;;;;;;;;;
       mvkl   0ffffh,b0
       mvkh   0h,b0    
       nop    5
       nop
       bdec   $,b0
       nop    5 
       ;;;;;;;;;;;;;;;;;;发送停止
loopr3:
       nop    9
       mvkl   i2cstr0,a1
       mvkh   i2cstr0,a1;bb=1?
       ldw    *a1,b2
       nop    9
       mvkl   1000h,a0 
       mvkh   0h,a0
       and    a0,b2,a0
       stw    a0,*a1
      
 [a0]  b      loopr3
       nop
       nop

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -