📄 at24c01.lis
字号:
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 + -