📄 i2c-master.lst
字号:
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 + -