📄 mt.lst
字号:
00D7 7840 ANDI R20,0x80
00D8 2344 TST R20
00D9 F3E1 BEQ 0x00D6
(0143) checkstate();
00DA DF80 RCALL _checkstate
(0144) }
(0145)
(0146) //发送STOP,退出总线控制
(0147) stop();
00DB DF6C RCALL _stop
(0148) }
00DC D1A1 RCALL pop_gset4
00DD 9508 RET
_twiReadByte:
TWCR_state --> R10
i --> R20
ReadAaddress --> R22
00DE D1BB RCALL push_gset3
00DF 2F60 MOV R22,R16
(0149) //************** twi主机接收,从地址为ReadAaddress的从机接收1个字节*************
(0150) // 入口参数1:ReadAaddress:从机地址
(0151) // TWDR中存放的高七位为地址,最低位表示读写控制,0为写,1为读
(0152) //******************************************************************************
(0153) void twiReadByte(unsigned char ReadAaddress)
(0154) {
(0155) unsigned char TWCR_state;
(0156) char i=0;
00E0 2744 CLR R20
(0157) error_state=0;
00E1 2422 CLR R2
00E2 92200061 STS 0x61,R2
(0158)
(0159) //初始化 twi
(0160) twi_init();
00E4 DF69 RCALL _twi_init
(0161)
(0162) //发送START信号
(0163) start();
00E5 DF5D RCALL _start
(0164) TWCR_state = TWCR & 0x80;
00E6 B786 IN R24,0x36
00E7 7880 ANDI R24,0x80
00E8 2EA8 MOV R10,R24
00E9 C00A RJMP 0x00F4
(0165) while((TWCR_state == 0x00))
(0166) {
(0167) i++;
00EA 9543 INC R20
(0168) if(i>=10){error_state=7;break;}
00EB 304A CPI R20,0xA
00EC F020 BCS 0x00F1
00ED E087 LDI R24,7
00EE 93800061 STS 0x61,R24
00F0 C005 RJMP 0x00F6
(0169) TWCR_state = TWCR & 0x80; //轮循等待START信号发送完成
00F1 B786 IN R24,0x36
00F2 7880 ANDI R24,0x80
00F3 2EA8 MOV R10,R24
00F4 20AA TST R10
00F5 F3A1 BEQ 0x00EA
(0170) }
(0171)
(0172) //若START信号发送完成,发送读地址,并读取数据
(0173) if(error_state==0)
00F6 90200061 LDS R2,0x61
00F8 2022 TST R2
00F9 F491 BNE 0x010C
(0174) {
(0175) TWDR = ReadAaddress; //发地址
00FA B963 OUT 0x03,R22
(0176) _NOP();
00FB 0000 NOP
(0177) _NOP();
00FC 0000 NOP
(0178) TWCR = (1 << TWINT) | (1 << TWEN)|( 1<<TWIE )|(1 << TWEA);
00FD EC85 LDI R24,0xC5
00FE BF86 OUT 0x36,R24
00FF C008 RJMP 0x0108
(0179) while(error_state==0)
(0180) {i++;if(i>150){error_state=9;break;}};
0100 9543 INC R20
0101 E986 LDI R24,0x96
0102 1784 CP R24,R20
0103 F420 BCC 0x0108
0104 E089 LDI R24,0x9
0105 93800061 STS 0x61,R24
0107 C004 RJMP 0x010C
0108 90200061 LDS R2,0x61
010A 2022 TST R2
010B F3A1 BEQ 0x0100
(0181) }
(0182)
(0183) //发送STOP,退出总线控制
(0184) stop();
010C DF3B RCALL _stop
(0185) }
010D D16E RCALL pop_gset3
010E 9508 RET
_twi_isr:
TWSR_state --> R16
010F 922A ST R2,-Y
0110 930A ST R16,-Y
0111 931A ST R17,-Y
0112 938A ST R24,-Y
0113 939A ST R25,-Y
0114 93EA ST R30,-Y
0115 B62F IN R2,0x3F
0116 922A ST R2,-Y
(0186) //************** twi 中断例程,接收数据 ****************************************
(0187) //******************************************************************************
(0188) //twi中断服务程序
(0189) char twi_isr(void)
(0190) {
(0191) unsigned char TWSR_state;
(0192) TWSR_state = TWSR & 0xf8;
0117 B101 IN R16,0x01
0118 7F08 ANDI R16,0xF8
(0193) switch(TWSR_state)
0119 2711 CLR R17
011A 3800 CPI R16,0x80
011B E0E0 LDI R30,0
011C 071E CPC R17,R30
011D F409 BNE 0x011F
011E C073 RJMP 0x0192
011F E880 LDI R24,0x80
0120 E090 LDI R25,0
0121 1780 CP R24,R16
0122 0791 CPC R25,R17
0123 F40C BGE 0x0125
0124 C035 RJMP 0x015A
0125 3408 CPI R16,0x48
0126 E0E0 LDI R30,0
0127 071E CPC R17,R30
0128 F409 BNE 0x012A
0129 C07D RJMP 0x01A7
012A E488 LDI R24,0x48
012B E090 LDI R25,0
012C 1780 CP R24,R16
012D 0791 CPC R25,R17
012E F0AC BLT 0x0144
012F 3308 CPI R16,0x38
0130 E0E0 LDI R30,0
0131 071E CPC R17,R30
0132 F409 BNE 0x0134
0133 C06A RJMP 0x019E
0134 E388 LDI R24,0x38
0135 E090 LDI R25,0
0136 1780 CP R24,R16
0137 0791 CPC R25,R17
0138 F02C BLT 0x013E
0139 3000 CPI R16,0
013A 0701 CPC R16,R17
013B F409 BNE 0x013D
013C C097 RJMP 0x01D4
013D C098 RJMP 0x01D6
013E 3400 CPI R16,0x40
013F E0E0 LDI R30,0
0140 071E CPC R17,R30
0141 F409 BNE 0x0143
0142 C061 RJMP 0x01A4
0143 C092 RJMP 0x01D6
0144 3508 CPI R16,0x58
0145 E0E0 LDI R30,0
0146 071E CPC R17,R30
0147 F409 BNE 0x0149
0148 C06F RJMP 0x01B8
0149 E588 LDI R24,0x58
014A E090 LDI R25,0
014B 1780 CP R24,R16
014C 0791 CPC R25,R17
014D F034 BLT 0x0154
014E 3500 CPI R16,0x50
014F E0E0 LDI R30,0
0150 071E CPC R17,R30
0151 F409 BNE 0x0153
0152 C05A RJMP 0x01AD
0153 C082 RJMP 0x01D6
0154 3600 CPI R16,0x60
0155 E0E0 LDI R30,0
0156 071E CPC R17,R30
0157 F409 BNE 0x0159
0158 C036 RJMP 0x018F
0159 C07C RJMP 0x01D6
015A 3B08 CPI R16,0xB8
015B E0E0 LDI R30,0
015C 071E CPC R17,R30
015D F409 BNE 0x015F
015E C06C RJMP 0x01CB
015F EB88 LDI R24,0xB8
0160 E090 LDI R25,0
0161 1780 CP R24,R16
0162 0791 CPC R25,R17
0163 F0AC BLT 0x0179
0164 3A00 CPI R16,0xA0
0165 E0E0 LDI R30,0
0166 071E CPC R17,R30
0167 F409 BNE 0x0169
0168 C032 RJMP 0x019B
0169 EA80 LDI R24,0xA0
016A E090 LDI R25,0
016B 1780 CP R24,R16
016C 0791 CPC R25,R17
016D F02C BLT 0x0173
016E 3808 CPI R16,0x88
016F E0E0 LDI R30,0
0170 071E CPC R17,R30
0171 F131 BEQ 0x0198
0172 C063 RJMP 0x01D6
0173 3A08 CPI R16,0xA8
0174 E0E0 LDI R30,0
0175 071E CPC R17,R30
0176 F409 BNE 0x0178
0177 C04B RJMP 0x01C3
0178 C05D RJMP 0x01D6
0179 3C08 CPI R16,0xC8
017A E0E0 LDI R30,0
017B 071E CPC R17,R30
017C F409 BNE 0x017E
017D C053 RJMP 0x01D1
017E EC88 LDI R24,0xC8
017F E090 LDI R25,0
0180 1780 CP R24,R16
0181 0791 CPC R25,R17
0182 F034 BLT 0x0189
0183 3C00 CPI R16,0xC0
0184 E0E0 LDI R30,0
0185 071E CPC R17,R30
0186 F409 BNE 0x0188
0187 C046 RJMP 0x01CE
0188 C04D RJMP 0x01D6
0189 3F08 CPI R16,0xF8
018A E0E0 LDI R30,0
018B 071E CPC R17,R30
018C F409 BNE 0x018E
018D C048 RJMP 0x01D6
018E C047 RJMP 0x01D6
(0194) {
(0195) //从机接收模式下的中断程序
(0196) case 0x60: TWCR=0xc5;break; // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
018F EC85 LDI R24,0xC5
0190 BF86 OUT 0x36,R24
0191 C044 RJMP 0x01D6
(0197) case 0x80: receive_data = TWDR;TWCR=0xc5;break; // 数据已接收,ACK已返回(接收数据)
0192 B023 IN R2,0x03
0193 92200060 STS 0x60,R2
0195 EC85 LDI R24,0xC5
0196 BF86 OUT 0x36,R24
0197 C03E RJMP 0x01D6
(0198) case 0x88: TWCR=0xc5;break; // 数据已接收,NOT ACK已返回(下一步:退出总线)
0198 EC85 LDI R24,0xC5
0199 BF86 OUT 0x36,R24
019A C03B RJMP 0x01D6
(0199) case 0xA0: TWCR=0xc5;break; // 接收到STOP或重复的START信号(停止接收数据)
019B EC85 LDI R24,0xC5
019C BF86 OUT 0x36,R24
019D C038 RJMP 0x01D6
(0200)
(0201) //主机接收模式下的中断程序
(0202) case 0x38: error_state=4;TWCR=0xc5;break; // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
019E E084 LDI R24,4
019F 93800061 STS 0x61,R24
01A1 EC85 LDI R24,0xC5
01A2 BF86 OUT 0x36,R24
01A3 C032 RJMP 0x01D6
(0203) case 0x40: TWCR=0xc5; break; // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
01A4 EC85 LDI R24,0xC5
01A5 BF86 OUT 0x36,R24
01A6 C02F RJMP 0x01D6
(0204) case 0x48: error_state=5;TWCR=0xc5;break; // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
01A7 E085 LDI R24,5
01A8 93800061 STS 0x61,R24
01AA EC85 LDI R24,0xC5
01AB BF86 OUT 0x36,R24
01AC C029 RJMP 0x01D6
(0205) case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,ACK已返回(接收数据)
01AD B023 IN R2,0x03
01AE 92200060 STS 0x60,R2
01B0 0000 NOP
01B1 0000 NOP
01B2 E088 LDI R24,0x8
01B3 93800061 STS 0x61,R24
01B5 EC84 LDI R24,0xC4
01B6 BF86 OUT 0x36,R24
01B7 C01E RJMP 0x01D6
(0206) case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,NOT ACK已返回(下一步:退出总线)
01B8 B023 IN R2,0x03
01B9 92200060 STS 0x60,R2
01BB 0000 NOP
01BC 0000 NOP
01BD E088 LDI R24,0x8
01BE 93800061 STS 0x61,R24
01C0 EC84 LDI R24,0xC4
01C1 BF86 OUT 0x36,R24
01C2 C013 RJMP 0x01D6
(0207)
(0208) //从机发送模式
(0209) case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
01C3 90200064 LDS R2,0x64
01C5 B823 OUT 0x03,R2
01C6 0000 NOP
01C7 0000 NOP
01C8 E885 LDI R24,0x85
01C9 BF86 OUT 0x36,R24
01CA C00B RJMP 0x01D6
(0210) case 0xB8: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
01CB EC85 LDI R24,0xC5
01CC BF86 OUT 0x36,R24
01CD C008 RJMP 0x01D6
(0211) case 0xC0: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
01CE EC85 LDI R24,0xC5
01CF BF86 OUT 0x36,R24
01D0 C005 RJMP 0x01D6
(0212) case 0xC8: TWCR= 0xc5;break; // TWEA=0,接收到ACK(停止发送数据,退出发送)
01D1 EC85 LDI R24,0xC5
01D2 BF86 OUT 0x36,R24
01D3 C002 RJMP 0x01D6
(0213)
(0214) //其他状态码
(0215) case 0xf8: break; // 等待或进行当前传输
(0216) case 0x00: TWCR= 0x95;break; // 非法的START或STOP引起的总线错误(释放总线)
01D4 E985 LDI R24,0x95
01D5 BF86 OUT 0x36,R24
(0217) default: break;
(0218) }
(0219) return receive_data; // 返回接收到的数据
01D6 91000060 LDS R16,0x60
01D8 9029 LD R2,Y+
01D9 BE2F OUT 0x3F,R2
01DA 91E9 LD R30,Y+
01DB 9199 LD R25,Y+
01DC 9189 LD R24,Y+
01DD 9119 LD R17,Y+
01DE 9109 LD R16,Y+
01DF 9029 LD R2,Y+
01E0 9518 RETI
FILE: E:\iccavr\无线+I2C\test1--mt\twimain.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -