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

📄 at24c01.lis

📁 通过MEGA128的串口对I2C芯片24c01的读写程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00DE 31C0              xjmp L9
 00E0           X1:
 00E0                   .dbline 74
 00E0           ;     }
 00E0           L12:
 00E0                   .dbline 76
 00E0           ;     else                      //如果ad_dst所在的数据块末尾地址 < ad_dst + num, 就先写入ad_dst所在的数据块末尾地址与 ad_dst 之差个数据
 00E0           ;     {
 00E0                   .dbline 77
 00E0           ;           p_rsc=wt24c_fc(p_rsc, ad_dst, n);
 00E0 A882              std y+0,R10
 00E2 9701              movw R18,R14
 00E4 0B85              ldd R16,y+11
 00E6 1C85              ldd R17,y+12
 00E8 8BDF              xcall _wt24c_fc
 00EA 1C87              std y+12,R17
 00EC 0B87              std y+11,R16
 00EE                   .dbline 78
 00EE           ;       if(syserr!=0) return;
 00EE 20900000          lds R2,_syserr
 00F2 2220              tst R2
 00F4 09F0              breq L16
 00F6                   .dbline 78
 00F6 25C0              xjmp L9
 00F8           L16:
 00F8                   .dbline 80
 00F8           ;               
 00F8           ;               num-=n;     //更新剩下数据个数
 00F8 CA18              sub R12,R10
 00FA DB08              sbc R13,R11
 00FC                   .dbline 81
 00FC           ;         ad_dst+=n;    //更新剩下数据的起始地址
 00FC EA0C              add R14,R10
 00FE FB1C              adc R15,R11
 0100 13C0              xjmp L19
 0102           L18:
 0102                   .dbline 85
 0102           ; 
 0102           ;         //把剩下数据写入器件
 0102           ;         while(num>=PAGE_SIZE) //先按PAGE_SIZE为长度一页一页的写入
 0102           ;         {
 0102                   .dbline 86
 0102           ;                       p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
 0102 88E0              ldi R24,8
 0104 8883              std y+0,R24
 0106 9701              movw R18,R14
 0108 0B85              ldd R16,y+11
 010A 1C85              ldd R17,y+12
 010C 79DF              xcall _wt24c_fc
 010E 1C87              std y+12,R17
 0110 0B87              std y+11,R16
 0112                   .dbline 87
 0112           ;               if(syserr!=0) return;
 0112 20900000          lds R2,_syserr
 0116 2220              tst R2
 0118 09F0              breq L21
 011A                   .dbline 87
 011A 13C0              xjmp L9
 011C           L21:
 011C                   .dbline 89
 011C C601              movw R24,R12
 011E 0897              sbiw R24,8
 0120 6C01              movw R12,R24
 0122                   .dbline 90
 0122 C701              movw R24,R14
 0124 0896              adiw R24,8
 0126 7C01              movw R14,R24
 0128                   .dbline 91
 0128           L19:
 0128                   .dbline 84
 0128 C601              movw R24,R12
 012A 8830              cpi R24,8
 012C E0E0              ldi R30,0
 012E 9E07              cpc R25,R30
 0130 40F7              brsh L18
 0132                   .dbline 93
 0132           ;               
 0132           ;             num-=PAGE_SIZE;           //更新剩余数据个数
 0132           ;               ad_dst+=PAGE_SIZE;      //更新剩下数据的起始地址
 0132           ;               }
 0132           ;         
 0132           ;               if(num)                 //把最后剩下的小于一个PAGE_SIZE长度的数据写入器件
 0132 8030              cpi R24,0
 0134 8907              cpc R24,R25
 0136 29F0              breq L23
 0138           X2:
 0138                   .dbline 94
 0138           ;                       wt24c_fc(p_rsc, ad_dst, num);
 0138 C882              std y+0,R12
 013A 9701              movw R18,R14
 013C 0B85              ldd R16,y+11
 013E 1C85              ldd R17,y+12
 0140 5FDF              xcall _wt24c_fc
 0142           L23:
 0142                   .dbline 95
 0142           L13:
 0142                   .dbline -2
 0142           L9:
 0142 2196              adiw R28,1
 0144 0E940000          xcall pop_gset5
 0148 2496              adiw R28,4
 014A                   .dbline 0 ; func end
 014A 0895              ret
 014C                   .dbsym r n 10 i
 014C                   .dbsym r num 12 i
 014C                   .dbsym r ad_dst 14 i
 014C                   .dbsym l p_rsc 11 pc
 014C                   .dbend
 014C                   .dbfunc e rd24c _rd24c fV
 014C           ;              t -> R10
 014C           ;            num -> R22,R23
 014C           ;         ad_rsc -> R12,R13
 014C           ;          p_dst -> R20,R21
                        .even
 014C           _rd24c::
 014C 0E940000          xcall push_gset4
 0150 6901              movw R12,R18
 0152 A801              movw R20,R16
 0154 6885              ldd R22,y+8
 0156 7985              ldd R23,y+9
 0158                   .dbline -1
 0158                   .dbline 108
 0158           ;     }
 0158           ; }
 0158           ; /*************************************************************************
 0158           ; ** 函数名称: 
 0158           ; ** 功能描述: 从24cxx读出数据
 0158           ; ** 输 入: *p_dst要读入数据的主机内存地址指针; ad_rsc要输出数据的i2c的地址(整形); num数据个数(整形)
 0158           ; ** 输出        : 
 0158           ; ** 全局变量: 无
 0158           ; ** 调用模块: 
 0158           ; ** 说明:ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
 0158           ; ** 注意:
 0158           ; **************************************************************************/
 0158           ; void rd24c(unsigned char *p_dst, unsigned int ad_rsc, unsigned int num)
 0158           ; {
 0158                   .dbline 109
 0158           ;     unsigned char t=0;
 0158 AA24              clr R10
 015A                   .dbline 112
 015A           ; 
 015A           ;       #if e2prom<32
 015A           ;       t=ad_rsc>>8;
 015A 5601              movw R10,R12
 015C AB2C              mov R10,R11
 015E BB24              clr R11
 0160                   .dbline 113
 0160           ;       t<<=1;
 0160 AA0C              lsl R10
 0162                   .dbline 116
 0162           ;       #endif
 0162           ;       
 0162           ;       i2cstart();                                     //发送起始信号
 0162 0E940000          xcall _i2cstart
 0166                   .dbline 118
 0166           ;               
 0166           ;       if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
 0166 0A2D              mov R16,R10
 0168 0056              subi R16,96    ; addi 160
 016A 0E940000          xcall _i2cwt
 016E 0831              cpi R16,24
 0170 B1F4              brne L26
 0172                   .dbline 119
 0172           ;       {       
 0172                   .dbline 123
 0172           ;               #if e2prom>16
 0172           ;               i2cwt(ad_rsc>>8);               //ad_rsc的高位,  发送要读出数据的地址
 0172           ;               #endif
 0172           ;               i2cwt(ad_rsc);                  //ad_rsc的低位
 0172 0C2D              mov R16,R12
 0174 0E940000          xcall _i2cwt
 0178                   .dbline 125
 0178           ;                               
 0178           ;               i2cstart();                             //再发送起始信号
 0178 0E940000          xcall _i2cstart
 017C                   .dbline 126
 017C           ;               i2cwt(R_ADD_COM+t);             //发送SLA_R, 读命令字节及器件地址
 017C 0A2D              mov R16,R10
 017E 0F55              subi R16,95    ; addi 161
 0180 0E940000          xcall _i2cwt
 0184                   .dbline 128
 0184           ;                               
 0184           ;               for(;num>0;num--)
 0184 08C0              xjmp L31
 0186           L28:
 0186                   .dbline 129
 0186                   .dbline 130
 0186 0E940000          xcall _i2crd
 018A FA01              movw R30,R20
 018C 0083              std z+0,R16
 018E                   .dbline 131
 018E 4F5F              subi R20,255  ; offset = 1
 0190 5F4F              sbci R21,255
 0192                   .dbline 132
 0192           L29:
 0192                   .dbline 128
 0192 6150              subi R22,1
 0194 7040              sbci R23,0
 0196           L31:
 0196                   .dbline 128
 0196 6030              cpi R22,0
 0198 6707              cpc R22,R23
 019A A9F7              brne L28
 019C           X4:
 019C                   .dbline 133
 019C           ;               {
 019C           ;                   *p_dst=i2crd();             //从器件读出一个字节
 019C           ;                       p_dst++;
 019C           ;               }
 019C           ;       }
 019C 03C0              xjmp L27
 019E           L26:
 019E                   .dbline 134
 019E           ;       else syserr=ERR_SLAW;           //写字节命令及器件地址错或对方无应答
 019E 81E0              ldi R24,1
 01A0 80930000          sts _syserr,R24
 01A4           L27:
 01A4                   .dbline 136
 01A4           ;               
 01A4           ;       i2cstop();
 01A4 0E940000          xcall _i2cstop
 01A8                   .dbline -2
 01A8           L25:
 01A8 0E940000          xcall pop_gset4
 01AC                   .dbline 0 ; func end
 01AC 0895              ret
 01AE                   .dbsym r t 10 c
 01AE                   .dbsym r num 22 i
 01AE                   .dbsym r ad_rsc 12 i
 01AE                   .dbsym r p_dst 20 pc
 01AE                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile D:\avrvi\AVRVi_m128_Starter_Kit\USART_24C01\source\lib\AT24C01.c
 0000           _syserr::
 0000                   .blkb 1
 0001                   .dbsym e syserr _syserr c

⌨️ 快捷键说明

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