📄 i2c.lis
字号:
00A0 ; switch(charState)
00A0 00910000 lds R16,_charState
00A4 1127 clr R17
00A6 053A cpi R16,165
00A8 E0E0 ldi R30,0
00AA 1E07 cpc R17,R30
00AC C1F0 breq L14
00AE 85EA ldi R24,165
00B0 90E0 ldi R25,0
00B2 8017 cp R24,R16
00B4 9107 cpc R25,R17
00B6 2CF0 brlt L17
00B8 L16:
00B8 0F30 cpi R16,15
00BA E0E0 ldi R30,0
00BC 1E07 cpc R17,R30
00BE 31F0 breq L13
00C0 25C0 rjmp L4
00C2 L17:
00C2 003F cpi R16,240
00C4 E0E0 ldi R30,0
00C6 1E07 cpc R17,R30
00C8 81F0 breq L15
00CA 20C0 rjmp L4
00CC X1:
00CC .dbline 100
00CC ; {
00CC L13:
00CC .dbline 102
00CC ; case EE_WRITE://写数据到24C02的ROM
00CC ; {
00CC .dbline 103
00CC ; TWItransmit(charData);
00CC .dbline 103
00CC 20900200 lds R2,_charData
00D0 23B8 out 0x3,R2
00D2 .dbline 103
00D2 85E8 ldi R24,133
00D4 86BF out 0x36,R24
00D6 .dbline 103
00D6 .dbline 103
00D6 .dbline 104
00D6 ; charState=EE_WRITE_OVER;
00D6 85EA ldi R24,165
00D8 80930000 sts _charState,R24
00DC .dbline 105
00DC ; break;
00DC 17C0 rjmp L4
00DE L14:
00DE .dbline 108
00DE ; }
00DE ; case EE_WRITE_OVER://I2C停止
00DE ; {
00DE .dbline 109
00DE ; Stop();
00DE 84E9 ldi R24,148
00E0 86BF out 0x36,R24
00E2 .dbline 110
00E2 ; charState=EE_WRITE_OK;
00E2 85E0 ldi R24,5
00E4 80930000 sts _charState,R24
00E8 .dbline 111
00E8 ; break;
00E8 11C0 rjmp L4
00EA L15:
00EA .dbline 114
00EA ; }
00EA ; case EE_READ:
00EA ; {
00EA .dbline 115
00EA ; Start();
00EA 85EA ldi R24,165
00EC 86BF out 0x36,R24
00EE .dbline 116
00EE ; break;
00EE .dbline 120
00EE ; }
00EE ; //I2C重新启动
00EE ; }
00EE ; break;
00EE 0EC0 rjmp L4
00F0 L18:
00F0 .dbline 123
00F0 ; }
00F0 ; case MR_SLA_ACK:
00F0 ; {
00F0 .dbline 124
00F0 ; MT_NACK;
00F0 85E8 ldi R24,133
00F2 86BF out 0x36,R24
00F4 .dbline 125
00F4 ; break;
00F4 0BC0 rjmp L4
00F6 L19:
00F6 .dbline 129
00F6 ; }
00F6 ; //启动主I2C读方式
00F6 ; case MR_DATA_NOACK:
00F6 ; {
00F6 .dbline 130
00F6 ; charData=TWDR;
00F6 23B0 in R2,0x3
00F8 20920200 sts _charData,R2
00FC .dbline 131
00FC ; Stop();
00FC 84E9 ldi R24,148
00FE 86BF out 0x36,R24
0100 .dbline 132
0100 ; charState=EE_READ_OK;
0100 80E5 ldi R24,80
0102 80930000 sts _charState,R24
0106 .dbline 133
0106 ; break;
0106 02C0 rjmp L4
0108 L3:
0108 .dbline 137
0108 84E9 ldi R24,148
010A 86BF out 0x36,R24
010C .dbline 138
010C L4:
010C .dbline -2
010C L2:
010C 2990 ld R2,y+
010E 2FBE out 0x3f,R2
0110 E991 ld R30,y+
0112 9991 ld R25,y+
0114 8991 ld R24,y+
0116 1991 ld R17,y+
0118 0991 ld R16,y+
011A 2990 ld R2,y+
011C .dbline 0 ; func end
011C 1895 reti
011E .dbend
011E .dbfunc e i2c_write _i2c_write fV
011E ; RomAddress -> R20
011E ; Wdata -> R22
.even
011E _i2c_write::
011E 00D0 rcall push_gset2
0120 422F mov R20,R18
0122 602F mov R22,R16
0124 .dbline -1
0124 .dbline 145
0124 ; }
0124 ; //读取I2C接收数据,I2C停止
0124 ; default:
0124 ; Stop();//I2C停止
0124 ; }
0124 ; }
0124 ;
0124 ; /*
0124 ; 常用TWI操作(主模式写和主模式读)
0124 ; */
0124 ; void i2c_write(unsigned char Wdata,unsigned char RomAddress)
0124 ; {
0124 .dbline 146
0124 ; charData=Wdata;//I2C总线写一个字节
0124 60930200 sts _charData,R22
0128 .dbline 147
0128 ; charAddr=RomAddress;//返回0:写成功
0128 40930100 sts _charAddr,R20
012C .dbline 148
012C ; charState=EE_WRITE;//返回非0:写失败
012C 8FE0 ldi R24,15
012E 80930000 sts _charState,R24
0132 .dbline 149
0132 ; Start();//I2C启动(TWI中断启动)
0132 85EA ldi R24,165
0134 86BF out 0x36,R24
0136 L26:
0136 .dbline 150
0136 L27:
0136 .dbline 150
0136 ; while(charState!=EE_WRITE_OK);
0136 80910000 lds R24,_charState
013A 8530 cpi R24,5
013C E1F7 brne L26
013E .dbline 151
013E ; delay_ms(10);
013E 0AE0 ldi R16,10
0140 10E0 ldi R17,0
0142 00D0 rcall _delay_ms
0144 .dbline -2
0144 L25:
0144 00D0 rcall pop_gset2
0146 .dbline 0 ; func end
0146 0895 ret
0148 .dbsym r RomAddress 20 c
0148 .dbsym r Wdata 22 c
0148 .dbend
0148 .dbfunc e i2c_read _i2c_read fc
0148 ; RomAddress -> R16
.even
0148 _i2c_read::
0148 .dbline -1
0148 .dbline 154
0148 ; }
0148 ; unsigned char i2c_read(unsigned char RomAddress)
0148 ; {
0148 .dbline 155
0148 ; charAddr=RomAddress;
0148 00930100 sts _charAddr,R16
014C .dbline 156
014C ; charState=EE_READ;
014C 80EF ldi R24,240
014E 80930000 sts _charState,R24
0152 .dbline 157
0152 ; Start();//I2C启动
0152 85EA ldi R24,165
0154 86BF out 0x36,R24
0156 L30:
0156 .dbline 158
0156 L31:
0156 .dbline 158
0156 ; while(charState!=EE_READ_OK);
0156 80910000 lds R24,_charState
015A 8035 cpi R24,80
015C E1F7 brne L30
015E .dbline 159
015E ; return charData;
015E 00910200 lds R16,_charData
0162 .dbline -2
0162 L29:
0162 .dbline 0 ; func end
0162 0895 ret
0164 .dbsym r RomAddress 16 c
0164 .dbend
.area bss(ram, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\I2C.c
0000 _charState::
0000 .blkb 1
0001 .dbsym e charState _charState c
0001 _charAddr::
0001 .blkb 1
0002 .dbsym e charAddr _charAddr c
0002 _charData::
0002 .blkb 1
0003 .dbsym e charData _charData c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -