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

📄 twi.lis

📁 PTR8000无线通信模块的单片机控制程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -