📄 twi.lis
字号:
002C 1501 movw R2,R10
002E 4424 clr R4
0030 5524 clr R5
0032 49E9 ldi R20,153
0034 59E3 ldi R21,57
0036 60E0 ldi R22,0
0038 70E0 ldi R23,0
003A 5A92 st -y,R5
003C 4A92 st -y,R4
003E 3A92 st -y,R3
0040 2A92 st -y,R2
0042 8A01 movw R16,R20
0044 9B01 movw R18,R22
0046 0E940000 xcall div32s
004A A02E mov R10,R16
004C .dbline 124
004C ; if(bitrate_div >= 16)
004C 8A2D mov R24,R10
004E 0031 cpi R16,16
0050 18F0 brlo L16
0052 .dbline 125
0052 ; bitrate_div = (bitrate_div-16)/2;
0052 8051 subi R24,16
0054 A82E mov R10,R24
0056 A694 lsr R10
0058 L16:
0058 .dbline 126
0058 ; TWBR = bitrate_div;
0058 A0B8 out 0x0,R10
005A .dbline -2
005A L15:
005A 0E940000 xcall pop_gset3
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbsym r bitrate_div 10 c
0060 .dbsym r bitrateKHz 10 i
0060 .dbend
0060 .dbfunc e Twi_MasterSend _Twi_MasterSend fc
0060 ; result -> R20
0060 ; i -> R22
0060 ; data -> R10,R11
0060 ; length -> R12
0060 ; deviceAddr -> R14
.even
0060 _Twi_MasterSend::
0060 0E940000 xcall push_gset5
0064 C22E mov R12,R18
0066 E02E mov R14,R16
0068 AA84 ldd R10,y+10
006A BB84 ldd R11,y+11
006C .dbline -1
006C .dbline 143
006C ; }
006C ; /*********************************************************************************************************
006C ; ** 函数名称:Twi_MasterSend
006C ; ** 功能描述:主发送
006C ; ** 输 入: deviceAddr:从机地址
006C ; ** length:数据长度
006C ; ** * data:发送缓冲区指针
006C ; **
006C ; ** 输 出: 发送的字节数
006C ; ** 全局变量:
006C ; ** 调用模块:
006C ; ** 说明:
006C ; ** 注意:
006C ; ** 日 期: 2006年8月29日
006C ; ********************************************************************************************************/
006C ; uint8 Twi_MasterSend(uint8 deviceAddr, uint8 length, uint8* data)
006C ; {
006C .dbline 144
006C ; uint8 i,result=0;
006C 4427 clr R20
006E .dbline 145
006E ; WDR(); //喂狗;
006E A895 wdr
0070 L19:
0070 .dbline 147
0070 L20:
0070 .dbline 147
0070 ; // 等待总线准备完成
0070 ; while(Twi_State); //此处为独占TWI的信号量机制
0070 20901500 lds R2,_Twi_State
0074 2220 tst R2
0076 E1F7 brne L19
0078 .dbline 149
0078 ; // 设置状态
0078 ; Twi_State = TWI_MASTER_TX;
0078 82E0 ldi R24,2
007A 80931500 sts _Twi_State,R24
007E .dbline 151
007E ; // 准备数据
007E ; Twi_DeviceAddrRW = (deviceAddr & 0xFE); // RW 为0: 写操作
007E 8E2D mov R24,R14
0080 8E7F andi R24,254
0082 80931400 sts _Twi_DeviceAddrRW,R24
0086 .dbline 152
0086 ; if(Twi_SendBuffer.status==TWI_DATA_FREE)
0086 20900700 lds R2,_Twi_SendBuffer+7
008A 2220 tst R2
008C 39F4 brne L22
008E .dbline 153
008E ; {
008E .dbline 154
008E ; InitQueue(&Twi_SendBuffer); //清空上次发送的信息
008E 00E0 ldi R16,<_Twi_SendBuffer
0090 10E0 ldi R17,>_Twi_SendBuffer
0092 0E940000 xcall _InitQueue
0096 .dbline 155
0096 ; Twi_SendBuffer.status=TWI_DATA_SEND;
0096 82E0 ldi R24,2
0098 80930700 sts _Twi_SendBuffer+7,R24
009C .dbline 156
009C ; }
009C L22:
009C .dbline 157
009C ; for(i=0; (i<length)&&(Twi_SendBuffer.errorcode!=QUEUE_OVERFLOW); i++)
009C 6627 clr R22
009E 08C0 xjmp L29
00A0 L26:
00A0 .dbline 158
00A0 F501 movw R30,R10
00A2 2191 ld R18,Z+
00A4 5F01 movw R10,R30
00A6 00E0 ldi R16,<_Twi_SendBuffer
00A8 10E0 ldi R17,>_Twi_SendBuffer
00AA 0E940000 xcall _EnQueue
00AE L27:
00AE .dbline 157
00AE 6395 inc R22
00B0 L29:
00B0 .dbline 157
00B0 6C15 cp R22,R12
00B2 20F4 brsh L31
00B4 80910600 lds R24,_Twi_SendBuffer+6
00B8 8130 cpi R24,1
00BA 91F7 brne L26
00BC L31:
00BC .dbline 159
00BC ; EnQueue(&Twi_SendBuffer,*data++);
00BC ; result=i;
00BC 462F mov R20,R22
00BE .dbline 162
00BE ;
00BE ; // 发送开始条件
00BE ; Twi_Start();
00BE 86B7 in R24,0x36
00C0 8F70 andi R24,15
00C2 806A ori R24,160
00C4 86BF out 0x36,R24
00C6 .dbline 163
00C6 ; WDR(); //喂狗;
00C6 A895 wdr
00C8 L32:
00C8 .dbline 164
00C8 L33:
00C8 .dbline 164
00C8 ; while(Twi_State);
00C8 20901500 lds R2,_Twi_State
00CC 2220 tst R2
00CE E1F7 brne L32
00D0 .dbline 165
00D0 ; WDR(); //喂狗;
00D0 A895 wdr
00D2 .dbline 166
00D2 ; i=0;
00D2 6627 clr R22
00D4 19C0 xjmp L36
00D6 L35:
00D6 .dbline 168
00D6 ; while(((TwiErrorCode==TW_MT_SLA_NACK)||(TwiErrorCode==TW_MT_ARB_LOST)||(TwiErrorCode==TW_MT_DATA_NACK))&&i<TWI_FAIL_MAX) //器件不响应或总线仲裁失败
00D6 ; {
00D6 .dbline 169
00D6 ; i++;
00D6 6395 inc R22
00D8 .dbline 170
00D8 ; if((TwiErrorCode==TW_MT_DATA_NACK)&&(Twi_SendBuffer.count==0))
00D8 80910400 lds R24,_TwiErrorCode
00DC 8033 cpi R24,48
00DE 29F4 brne L38
00E0 20900200 lds R2,_Twi_SendBuffer+2
00E4 2220 tst R2
00E6 09F4 brne L38
00E8 .dbline 171
00E8 ; {
00E8 .dbline 172
00E8 ; break;
00E8 1DC0 xjmp L37
00EA L38:
00EA .dbline 174
00EA ; }
00EA ; Delay(255);
00EA 0FEF ldi R16,255
00EC 89DF xcall _Delay
00EE .dbline 175
00EE ; Twi_State = TWI_MASTER_TX;
00EE 82E0 ldi R24,2
00F0 80931500 sts _Twi_State,R24
00F4 .dbline 176
00F4 ; Twi_Start();
00F4 86B7 in R24,0x36
00F6 8F70 andi R24,15
00F8 806A ori R24,160
00FA 86BF out 0x36,R24
00FC .dbline 177
00FC ; WDR(); //喂狗;
00FC A895 wdr
00FE L41:
00FE .dbline 178
00FE L42:
00FE .dbline 178
00FE 20901500 lds R2,_Twi_State
0102 2220 tst R2
0104 E1F7 brne L41
0106 .dbline 179
0106 A895 wdr
0108 .dbline 180
0108 L36:
0108 .dbline 167
0108 80910400 lds R24,_TwiErrorCode
010C 8032 cpi R24,32
010E 41F0 breq L46
0110 80910400 lds R24,_TwiErrorCode
0114 8833 cpi R24,56
0116 21F0 breq L46
0118 80910400 lds R24,_TwiErrorCode
011C 8033 cpi R24,48
011E 11F4 brne L44
0120 L46:
0120 6431 cpi R22,20
0122 C8F2 brlo L35
0124 L44:
0124 L37:
0124 .dbline 181
0124 ; while(Twi_State);
0124 ; WDR(); //喂狗;
0124 ; }
0124 ; Twi_SendBuffer.status=TWI_DATA_FREE;
0124 2224 clr R2
0126 20920700 sts _Twi_SendBuffer+7,R2
012A .dbline 182
012A ; if(i>=TWI_FAIL_MAX)
012A 6431 cpi R22,20
012C 10F0 brlo L48
012E .dbline 183
012E ; {
012E .dbline 184
012E ; return (FALSE);
012E 0027 clr R16
0130 04C0 xjmp L18
0132 L48:
0132 .dbline 187
0132 ; }
0132 ; else
0132 ; {
0132 .dbline 188
0132 ; return (result-Twi_SendBuffer.count);
0132 20900200 lds R2,_Twi_SendBuffer+2
0136 042F mov R16,R20
0138 0219 sub R16,R2
013A .dbline -2
013A L18:
013A 0E940000 xcall pop_gset5
013E .dbline 0 ; func end
013E 0895 ret
0140 .dbsym r result 20 c
0140 .dbsym r i 22 c
0140 .dbsym r data 10 pc
0140 .dbsym r length 12 c
0140 .dbsym r deviceAddr 14 c
0140 .dbend
0140 .dbfunc e Twi_MasterReceive _Twi_MasterReceive fc
0140 ; result -> R20
0140 ; i -> R22
0140 ; data -> R10,R11
0140 ; length -> R12
0140 ; deviceAddr -> R20
.even
0140 _Twi_MasterReceive::
0140 0E940000 xcall push_gset4
0144 C22E mov R12,R18
0146 402F mov R20,R16
0148 A884 ldd R10,y+8
014A B984 ldd R11,y+9
014C .dbline -1
014C .dbline 207
014C ; }
014C ; }
014C ; /*********************************************************************************************************
014C ; ** 函数名称:Twi_MasterReceive
014C ; ** 功能描述:主模式接收
014C ; ** 输 入: deviceAddr:从机地址
014C ; ** length:数据长度
014C ; ** * data 缓冲区指针
014C ; **
014C ; ** 输 出: 返回接收到的字节数
014C ; ** 全局变量:
014C ; ** 调用模块:
014C ; ** 说明:
014C ; ** 注意:
014C ; ** 日 期: 2006年8月29日
014C ; ********************************************************************************************************/
014C ;
014C ; uint8 Twi_MasterReceive(uint8 deviceAddr, uint8 length, uint8* data)
014C ; {
014C .dbline 209
014C ; uint8 i,result;
014C ; WDR(); //喂狗;
014C A895 wdr
014E L52:
014E .dbline 211
014E L53:
014E .dbline 211
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -