📄 twi.lis
字号:
0054 ; twi_init();
0054 ;
0054 ; //发送START信号
0054 ; start();
0054 ; TWCR_state = TWCR & 0x80;
0054 ; while((TWCR_state == 0x00))
0054 ; {
0054 ; i++;
0054 ; if(i>=10){error_state=6;break;}
0054 ; TWCR_state = TWCR & 0x80; //轮循等待START信号发送完成
0054 ; }
0054 ;
0054 ; //若START发送成功,发送从机地址
0054 ; if(error_state==0)
0054 ; {
0054 ; TWDR = WriteAddress; //发地址
0054 ; _NOP();
0054 ; _NOP();
0054 ;
0054 ; TWCR = (1 << TWINT) | (1 << TWEN);
0054 ; TWCR_state = TWCR & 0x80;
0054 ; while(TWCR_state == 0x00)
0054 ; {TWCR_state = TWCR & 0x80;} //轮循查询地址是否发送
0054 ; checkstate();
0054 ; }
0054 ;
0054 ; //若从机地址发送成功,向从机发送数据
0054 ; if(error_state==0)
0054 ; {
0054 ; TWDR = data; //发数据
0054 ; _NOP();
0054 ; _NOP();
0054 ; TWCR = (1 << TWINT) | (1 << TWEN);
0054 ; TWCR_state = TWCR & 0x80;
0054 ; while(TWCR_state == 0x00) TWCR_state = TWCR & 0x80; //轮循查询数据是否发送
0054 ; checkstate();
0054 ; }
0054 ;
0054 ; //发送STOP,退出总线控制
0054 ; stop();
0054 ; }
0054 ; //************** twi主机接收,从地址为ReadAaddress的从机接收1个字节*************
0054 ; // 入口参数1:ReadAaddress:从机地址
0054 ; // TWDR中存放的高七位为地址,最低位表示读写控制,0为写,1为读
0054 ; //******************************************************************************
0054 ; void twiReadByte(unsigned char ReadAaddress)
0054 ; {
0054 ; unsigned char TWCR_state;
0054 ; char i=0;
0054 ; error_state=0;
0054 ;
0054 ; //初始化 twi
0054 ; twi_init();
0054 ;
0054 ; //发送START信号
0054 ; start();
0054 ; TWCR_state = TWCR & 0x80;
0054 ; while((TWCR_state == 0x00))
0054 ; {
0054 ; i++;
0054 ; if(i>=10){error_state=7;break;}
0054 ; TWCR_state = TWCR & 0x80; //轮循等待START信号发送完成
0054 ; }
0054 ;
0054 ; //若START信号发送完成,发送读地址,并读取数据
0054 ; if(error_state==0)
0054 ; {
0054 ; TWDR = ReadAaddress; //发地址
0054 ; _NOP();
0054 ; _NOP();
0054 ; TWCR = (1 << TWINT) | (1 << TWEN)|( 1<<TWIE )|(1 << TWEA);
0054 ; while(error_state==0)
0054 ; {i++;if(i>150){error_state=9;break;}};
0054 ; }
0054 ;
0054 ; //发送STOP,退出总线控制
0054 ; stop();
0054 ; }*/
0054 ; //************** twi 中断例程,接收数据 ****************************************
0054 ; //******************************************************************************
0054 ; //twi中断服务程序
0054 ; char twi_isr(void)
0054 ; {
0054 .dbline 192
0054 ; unsigned char TWSR_state;
0054 ; TWSR_state = TWSR & 0xf8;
0054 01B1 in R16,0x1
0056 087F andi R16,248
0058 .dbline 193
0058 ; switch(TWSR_state)
0058 1127 clr R17
005A 0038 cpi R16,128
005C E0E0 ldi R30,0
005E 1E07 cpc R17,R30
0060 39F1 breq L14
0062 80E8 ldi R24,128
0064 90E0 ldi R25,0
0066 8017 cp R24,R16
0068 9107 cpc R25,R17
006A 64F0 brlt L20
006C L19:
006C 0030 cpi R16,0
006E 0107 cpc R16,R17
0070 59F1 breq L18
0072 X0:
0072 0030 cpi R16,0
0074 E0E0 ldi R30,0
0076 1E07 cpc R17,R30
0078 4CF1 brlt L11
007A L21:
007A 0036 cpi R16,96
007C E0E0 ldi R30,0
007E 1E07 cpc R17,R30
0080 A1F0 breq L13
0082 24C0 rjmp L11
0084 L20:
0084 003A cpi R16,160
0086 E0E0 ldi R30,0
0088 1E07 cpc R17,R30
008A D9F0 breq L16
008C 80EA ldi R24,160
008E 90E0 ldi R25,0
0090 8017 cp R24,R16
0092 9107 cpc R25,R17
0094 2CF0 brlt L23
0096 L22:
0096 0838 cpi R16,136
0098 E0E0 ldi R30,0
009A 1E07 cpc R17,R30
009C 79F0 breq L15
009E 16C0 rjmp L11
00A0 L23:
00A0 083F cpi R16,248
00A2 E0E0 ldi R30,0
00A4 1E07 cpc R17,R30
00A6 91F0 breq L11
00A8 11C0 rjmp L11
00AA X1:
00AA .dbline 194
00AA ; {
00AA L13:
00AA .dbline 196
00AA ; //从机接收模式下的中断程序
00AA ; case 0x60: TWCR=0xc5;break; // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
00AA 85EC ldi R24,197
00AC 86BF out 0x36,R24
00AE .dbline 196
00AE 0EC0 rjmp L11
00B0 L14:
00B0 .dbline 197
00B0 ; case 0x80: receive_data = TWDR;TWCR=0xc5;break; // 数据已接收,ACK已返回(接收数据)
00B0 23B0 in R2,0x3
00B2 20920000 sts _receive_data,R2
00B6 .dbline 197
00B6 85EC ldi R24,197
00B8 86BF out 0x36,R24
00BA .dbline 197
00BA 08C0 rjmp L11
00BC L15:
00BC .dbline 198
00BC ; case 0x88: TWCR=0xc5;break; // 数据已接收,NOT ACK已返回(下一步:退出总线)
00BC 85EC ldi R24,197
00BE 86BF out 0x36,R24
00C0 .dbline 198
00C0 05C0 rjmp L11
00C2 L16:
00C2 .dbline 199
00C2 ; case 0xA0: TWCR=0xc5;break; // 接收到STOP或重复的START信号(停止接收数据)
00C2 85EC ldi R24,197
00C4 86BF out 0x36,R24
00C6 .dbline 199
00C6 02C0 rjmp L11
00C8 X2:
00C8 .dbline 215
00C8 ;
00C8 ; /* //主机接收模式下的中断程序
00C8 ; case 0x38: error_state=4;TWCR=0xc5;break; // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
00C8 ; case 0x40: TWCR=0xc5; break; // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
00C8 ; case 0x48: error_state=5;TWCR=0xc5;break; // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
00C8 ; case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,ACK已返回(接收数据)
00C8 ; case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break; // 接收到数据,NOT ACK已返回(下一步:退出总线)
00C8 ;
00C8 ; //从机发送模式
00C8 ; case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
00C8 ; case 0xB8: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
00C8 ; case 0xC0: TWCR= 0xc5;break; // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
00C8 ; case 0xC8: TWCR= 0xc5;break; // TWEA=0,接收到ACK(停止发送数据,退出发送)
00C8 ; */
00C8 ; //其他状态码
00C8 ; case 0xf8: break; // 等待或进行当前传输
00C8 L18:
00C8 .dbline 216
00C8 ; case 0x00: TWCR= 0x95;break; // 非法的START或STOP引起的总线错误(释放总线)
00C8 85E9 ldi R24,149
00CA 86BF out 0x36,R24
00CC .dbline 216
00CC .dbline 217
00CC ; default: break;
00CC L11:
00CC .dbline 219
00CC ; }
00CC ; return receive_data; // 返回接收到的数据
00CC 00910000 lds R16,_receive_data
00D0 .dbline -2
00D0 L9:
00D0 2990 ld R2,y+
00D2 2FBE out 0x3f,R2
00D4 E991 ld R30,y+
00D6 9991 ld R25,y+
00D8 8991 ld R24,y+
00DA 1991 ld R17,y+
00DC 0991 ld R16,y+
00DE 2990 ld R2,y+
00E0 .dbline 0 ; func end
00E0 1895 reti
00E2 .dbsym r TWSR_state 16 c
00E2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -