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

📄 i2c-master.lst

📁 at90can128底层驱动 有SPI,TWI,总线,CAN接口等
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0162 6180      ORI	R24,0x10
    0163 938000BC  STS	0xBC,R24
(0111)         twi_err  = TWI_TRANSFER_OK;
    0165 2422      CLR	R2
    0166 92200101  STS	twi_err,R2
(0112)         twi_busy = FALSE;         //transfer complete, clear twi_busy
    0168 92200102  STS	twi_busy,R2
(0113)         }
(0114)     break;
    016A C092      RJMP	0x01FD
(0115) 
(0116)     //STATE 30h:   DATA was transmitted, NOT ACK bit received
(0117)     //ACTION:      Transmit STOP
(0118)     case 0x30 :
(0119)     Twi_set_stop();     // Twi_set_stop will also clear twiint flag
    016B 918000BC  LDS	R24,0xBC
    016D 6180      ORI	R24,0x10
    016E 938000BC  STS	0xBC,R24
(0120)     twi_busy = FALSE;
    0170 2422      CLR	R2
    0171 92200102  STS	twi_busy,R2
(0121)     twi_err  = TWI_HOST_ADR_NACK;
    0173 E083      LDI	R24,3
    0174 93800101  STS	twi_err,R24
(0122)     break;
    0176 C086      RJMP	0x01FD
(0123) 
(0124)     //STATE 38h:   Arbitration lost in SLA+W or DATA.
(0125)     //ACTION:      Release bus, enter not addressed SLV mode
(0126)     //             Wait for bus lines to be free
(0127)     case 0x38 :
(0128)     twi_busy = FALSE;
    0177 2422      CLR	R2
    0178 92200102  STS	twi_busy,R2
(0129)     twi_err  = TWI_ARBITRATION_LOST;
    017A E085      LDI	R24,5
    017B 93800101  STS	twi_err,R24
(0130)     Twi_clear_si();
    017D 918000BC  LDS	R24,0xBC
    017F 6880      ORI	R24,0x80
    0180 938000BC  STS	0xBC,R24
(0131)     // #ifdef USER_TWI_FCT_ARBITRATION_LOST_IN_SLA+W_OR_DATA
(0132)     // TWI_fct_arb_lostinSLAorDATA();
(0133)     // #endif
(0134)     break;
    0182 C07A      RJMP	0x01FD
(0135) 
(0136)    //MASTER RECEIVER MODE FOLLOWS
(0137)    //STATE 40h:   SLA+R transmitted, ACK received
(0138)    //ACTION:      Receive DATA, ACK to be returned
(0139)    //PREVIOS STATE: 0x08 or 0x10
(0140)     case 0x40 :               //master receive, after sending
(0141)          if ( twi_message.nbbytes == 1 )
    0183 91800105  LDS	R24,twi_message+2
    0185 3081      CPI	R24,1
    0186 F459      BNE	0x0192
(0142)          {
(0143)             Twi_clear_aa(); // only one data to receive, noACK to be send after the fisrt incoming data
    0187 918000BC  LDS	R24,0xBC
    0189 738F      ANDI	R24,0x3F
    018A 938000BC  STS	0xBC,R24
(0144)             Twi_clear_si();
    018C 918000BC  LDS	R24,0xBC
    018E 6880      ORI	R24,0x80
    018F 938000BC  STS	0xBC,R24
(0145)          }
    0191 C06B      RJMP	0x01FD
(0146)     else if (!twi_message.nbbytes      ) Twi_set_stop(); // special case: no data to read ! clear also twint
    0192 90200105  LDS	R2,twi_message+2
    0194 2022      TST	R2
    0195 F431      BNE	0x019C
    0196 918000BC  LDS	R24,0xBC
    0198 6180      ORI	R24,0x10
    0199 938000BC  STS	0xBC,R24
    019B C061      RJMP	0x01FD
(0147)     else
(0148)         {
(0149)         Twi_set_aa();      //wait on ACK bit
    019C 918000BC  LDS	R24,0xBC
    019E 6480      ORI	R24,0x40
    019F 938000BC  STS	0xBC,R24
(0150)         twi_nb_transmited=0;      //data byte to be received, NOT ACK bit to follow  --> 0x58
    01A1 2422      CLR	R2
    01A2 92200100  STS	twi_nb_transmited,R2
(0151)         }
(0152)     break;
    01A4 C058      RJMP	0x01FD
(0153) 
(0154)     //STATE 48h:   SLA+R transmitted, NOT ACK received
(0155)     //ACTION:      Transmit STOP
(0156)     case 0x48 :
(0157)     Twi_set_stop(); //clear also twint
    01A5 918000BC  LDS	R24,0xBC
    01A7 6180      ORI	R24,0x10
    01A8 938000BC  STS	0xBC,R24
(0158)     twi_busy = FALSE;
    01AA 2422      CLR	R2
    01AB 92200102  STS	twi_busy,R2
(0159)     twi_err  = TWI_HOST_ADR_NACK;
    01AD E083      LDI	R24,3
    01AE 93800101  STS	twi_err,R24
(0160)     break;
    01B0 C04C      RJMP	0x01FD
(0161) 
(0162)     //STATE 50h:   Data has been received, ACK returned
(0163)     //ACTION:      Read DATA. If expecting more continue else STOP
(0164)     case 0x50 : //master receive, received data
(0165)                 //byte and ACK, copy it into
(0166)     *(twi_message.buf+twi_nb_transmited) = Twi_get_data();      //buffer
    01B1 90200106  LDS	R2,twi_message+3
    01B3 90300107  LDS	R3,0x107
    01B5 91E00100  LDS	R30,twi_nb_transmited
    01B7 27FF      CLR	R31
    01B8 0DE2      ADD	R30,R2
    01B9 1DF3      ADC	R31,R3
    01BA 902000BB  LDS	R2,0xBB
    01BC 8220      STD	Z+0,R2
(0167)     twi_nb_transmited++;
    01BD 91800100  LDS	R24,twi_nb_transmited
    01BF 5F8F      SUBI	R24,0xFF
    01C0 93800100  STS	twi_nb_transmited,R24
(0168)     if ( twi_nb_transmited < (twi_message.nbbytes-1) ) Twi_set_aa(); // get more bytes
    01C2 91800105  LDS	R24,twi_message+2
    01C4 5081      SUBI	R24,1
    01C5 90200100  LDS	R2,twi_nb_transmited
    01C7 1628      CP	R2,R24
    01C8 F430      BCC	0x01CF
    01C9 918000BC  LDS	R24,0xBC
    01CB 6480      ORI	R24,0x40
    01CC 938000BC  STS	0xBC,R24
    01CE C02E      RJMP	0x01FD
(0169)     else
(0170)     {
(0171)       Twi_clear_aa();           //only one more byte to come
    01CF 918000BC  LDS	R24,0xBC
    01D1 738F      ANDI	R24,0x3F
    01D2 938000BC  STS	0xBC,R24
(0172)       Twi_clear_si();
    01D4 918000BC  LDS	R24,0xBC
    01D6 6880      ORI	R24,0x80
    01D7 938000BC  STS	0xBC,R24
(0173)     }
(0174)     break;
    01D9 C023      RJMP	0x01FD
(0175) 
(0176)     //STATE 58h:   Data has been received, NOT ACK returned
(0177)     //ACTION:      Read DATA. Generate STOP
(0178)     case 0x58 :
(0179)     *(twi_message.buf+twi_nb_transmited) = Twi_get_data();
    01DA 90200106  LDS	R2,twi_message+3
    01DC 90300107  LDS	R3,0x107
    01DE 91E00100  LDS	R30,twi_nb_transmited
    01E0 27FF      CLR	R31
    01E1 0DE2      ADD	R30,R2
    01E2 1DF3      ADC	R31,R3
    01E3 902000BB  LDS	R2,0xBB
    01E5 8220      STD	Z+0,R2
(0180)     Twi_set_stop();
    01E6 918000BC  LDS	R24,0xBC
    01E8 6180      ORI	R24,0x10
    01E9 938000BC  STS	0xBC,R24
(0181)     twi_busy = FALSE;
    01EB 2422      CLR	R2
    01EC 92200102  STS	twi_busy,R2
(0182)     twi_err  = TWI_RECEIVE_OK;
    01EE E081      LDI	R24,1
    01EF 93800101  STS	twi_err,R24
(0183)     break;
    01F1 C00B      RJMP	0x01FD
(0184) 
(0185)     //if we arrived here, unknown state has occurred.....
(0186)     default :
(0187)     Twi_set_stop();
    01F2 918000BC  LDS	R24,0xBC
    01F4 6180      ORI	R24,0x10
    01F5 938000BC  STS	0xBC,R24
(0188)     twi_busy = FALSE;
    01F7 2422      CLR	R2
    01F8 92200102  STS	twi_busy,R2
(0189)     twi_err  = TWI_UNKNOWN;
    01FA E086      LDI	R24,6
    01FB 93800101  STS	twi_err,R24
(0190)     break;
    01FD 9508      RET
_twi_send_message_polling:
  info                 --> Y,+6
  nbbytes              --> Y,+4
  rw                   --> R20
  slave_addr           --> R22
    01FE 940E02F3  CALL	push_gset2
    0200 2F42      MOV	R20,R18
    0201 2F60      MOV	R22,R16
(0191)     }
(0192) }
(0193) 
(0194) /*****************************************************************************
(0195) 函数介绍:TWI主机模式,查询方式
(0196) 输入参数:	slave_addr:从机地址
(0197) 			rw:=TWI_WRITE发送模式;=TWI_READ接收模式
(0198) 			nbbytes:最大字节数
(0199) 			*info:数据缓存地址
(0200) 输出参数:
(0201) 返回值:twi_err:TWI通讯状态
(0202)  - TWI_TRANSFER_OK		发送完成
(0203)  - TWI_RECEIVE_OK		接收完成
(0204)  - TWI_BUS_ERROR		总线冲突
(0205)  - TWI_HOST_ADR_NACK	从机地址无应答
(0206)  - TWI_HOST_DATA_NACK	从机数据无应答(不存在)
(0207)  - TWI_ARBITRATION_LOST	仲裁失败
(0208)  - TWI_UNKNOWN			TWI状态错误	                
(0209)  - TWI_NOT_FREE			TWI通信忙
(0210)  - TWI_OK				TWI通信开始
(0211) *****************************************************************************/
(0212) unsigned char twi_send_message_polling( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info )
(0213) {
(0214)   twi_message.address = slave_addr;
    0202 93600103  STS	twi_message,R22
(0215)   twi_message.rw = rw;
    0204 93400104  STS	twi_message+1,R20
(0216)   twi_message.nbbytes = nbbytes;
    0206 800C      LDD	R0,Y+4
    0207 92000105  STS	twi_message+2,R0
(0217)   twi_message.buf = info;
    0209 800E      LDD	R0,Y+6
    020A 801F      LDD	R1,Y+7
    020B 92100107  STS	0x107,R1
    020D 92000106  STS	twi_message+3,R0
(0218)   Twi_wait_hw_stop();
    020F 902000BC  LDS	R2,0xBC
    0211 2433      CLR	R3
    0212 FC24      SBRC	R2,4
    0213 CFFB      RJMP	0x020F
(0219)   Disable_twi_interrupt(); //FIXME
    0214 918000BC  LDS	R24,0xBC
    0216 7F8E      ANDI	R24,0xFE
    0217 938000BC  STS	0xBC,R24
(0220)   twi_nb_transmited=0;
    0219 2422      CLR	R2
    021A 92200100  STS	twi_nb_transmited,R2
(0221)   if (!twi_busy)
    021C 90200102  LDS	R2,twi_busy
    021E 2022      TST	R2
    021F F4C9      BNE	0x0239
(0222)   {
(0223)     twi_busy =1;
    0220 E081      LDI	R24,1
    0221 93800102  STS	twi_busy,R24
(0224)     twi_err = TWI_OK;
    0223 E088      LDI	R24,0x8
    0224 93800101  STS	twi_err,R24
(0225)     Twi_set_start();
    0226 918000BC  LDS	R24,0xBC
    0228 6280      ORI	R24,0x20
    0229 938000BC  STS	0xBC,R24
    022B C006      RJMP	0x0232
(0226)     while (twi_busy)
(0227)         {
(0228)         Twi_wait_event();
    022C 918000BC  LDS	R24,0xBC
    022E 7880      ANDI	R24,0x80
    022F 3880      CPI	R24,0x80
    0230 F7D9      BNE	0x022C
(0229)         twi_decode_status();
    0231 DE45      RCALL	_twi_decode_status
    0232 90200102  LDS	R2,twi_busy
    0234 2022      TST	R2
    0235 F7B1      BNE	0x022C
(0230) //        Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
(0231)         }
(0232)    // Twi_set_stop(); RLE
(0233)     return twi_err;
    0236 91000101  LDS	R16,twi_err
    0238 C006      RJMP	0x023F
(0234)   }
(0235)   Twi_set_stop();
    0239 918000BC  LDS	R24,0xBC
    023B 6180      ORI	R24,0x10
    023C 938000BC  STS	0xBC,R24
(0236)   return TWI_NOT_FREE;
    023E E007      LDI	R16,7
    023F 940E02EA  CALL	pop_gset2
    0241 9508      RET
(0237) }
(0238) 
(0239) /*****************************************************************************
(0240) 函数介绍:TWI主机模式,中断方式
(0241) 输入参数:	slave_addr:从机地址
(0242) 			rw:=TWI_WRITE发送模式;=TWI_READ接收模式
(0243) 			nbbytes:最大字节数
(0244) 			*info:数据缓存地址
(0245) 输出参数:
(0246) 返回值:twi_err:TWI通讯状态
(0247)  - TWI_TRANSFER_OK		发送完成
(0248)  - TWI_RECEIVE_OK		接收完成
(0249)  - TWI_BUS_ERROR		总线冲突
(0250)  - TWI_HOST_ADR_NACK	从机地址无应答
(0251)  - TWI_HOST_DATA_NACK	从机数据无应答(不存在)
(0252)  - TWI_ARBITRATION_LOST	仲裁失败
(0253)  - TWI_UNKNOWN			TWI状态错误	                         //接受复位
(0254)  - TWI_NOT_FREE			TWI通信忙
(0255)  - TWI_OK				TWI通信开始
(0256) *****************************************************************************/
(0257) unsigned char twi_send_message_interrupt( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info)
(0258) {
(0259)   twi_message.address = slave_addr;
_twi_send_message_interrupt:
  info                 --> Y,+2
  nbbytes              --> Y,+0
  rw                   --> R18
  slave_addr           --> R16
    0242 93000103  STS	twi_message,R16
(0260)   twi_message.rw = rw;
    0244 93200104  STS	twi_message+1,R18
(0261)   twi_message.nbbytes = nbbytes;
    0246 8008      LDD	R0,Y+0
    0247 92000105  STS	twi_message+2,R0
(0262)   twi_message.buf = info;
    0249 800A      LDD	R0,Y+2
    024A 801B      LDD	R1,Y+3
    024B 92100107  STS	0x107,R1
    024D 92000106  STS	twi_message+3,R0
(0263)   Twi_wait_hw_stop();
    024F 902000BC  LDS	R2,0xBC
    0251 2433      CLR	R3
    0252 FC24      SBRC	R2,4
    0253 CFFB      RJMP	0x024F
(0264)   twi_nb_transmited=0;
    0254 2422      CLR	R2
    0255 92200100  STS	twi_nb_transmited,R2
(0265)   if (!twi_busy)
    0257 90200102  LDS	R2,twi_busy
    0259 2022      TST	R2
    025A F499      BNE	0x026E
(0266)   {
(0267)     twi_err = TWI_OK;
    025B E088      LDI	R24,0x8
    025C 93800101  STS	twi_err,R24
(0268)     twi_busy =1;
    025E E081      LDI	R24,1
    025F 93800102  STS	twi_busy,R24
(0269)     Enable_twi_interrupt();
    0261 918000BC  LDS	R24,0xBC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -