📄 com2iic.lss
字号:
IIC_Buffer_In.ucReadP=0;
4e2: 10 92 91 00 sts 0x0091, r1
IIC_Buffer_In.ucWriteP=0;
4e6: 10 92 90 00 sts 0x0090, r1
}
ucIICMode=IIC_MODE_SLAVE_RECEIVE;
4ea: 81 e0 ldi r24, 0x01 ; 1
4ec: 80 93 7e 00 sts 0x007E, r24
ucIICError=IIC_ERROR_ARBITRATION_LOST;
4f0: 83 e8 ldi r24, 0x83 ; 131
4f2: 80 93 94 00 sts 0x0094, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
4f6: 85 ec ldi r24, 0xC5 ; 197
4f8: 80 93 56 00 sts 0x0056, r24
break;
4fc: d7 c0 rjmp .+430 ; 0x6ac
///////////////////////////////////////////
// Slave Recieve Mode
///////////////////////////////////////////
case TW_SR_SLA_ACK:
case TW_SR_GCALL_ACK:
case TW_SR_ARB_LOST_SLA_ACK:
case TW_SR_ARB_LOST_GCALL_ACK:
ucIICMode=IIC_MODE_SLAVE_RECEIVE;
4fe: 81 e0 ldi r24, 0x01 ; 1
500: 80 93 7e 00 sts 0x007E, r24
IIC_Buffer_In.ucWriteP=0;
504: 10 92 90 00 sts 0x0090, r1
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWIE)|_BV(TWEA));
508: 85 ec ldi r24, 0xC5 ; 197
50a: 80 93 56 00 sts 0x0056, r24
break;
50e: ce c0 rjmp .+412 ; 0x6ac
case TW_SR_DATA_ACK:
case TW_SR_GCALL_DATA_ACK:
if(IIC_Buffer_In.ucWriteP<IIC_MAX_BUFFER_LEN)
510: 80 91 90 00 lds r24, 0x0090
514: 80 31 cpi r24, 0x10 ; 16
516: a0 f4 brcc .+40 ; 0x540
{
IIC_BUS_TO_BUFFER;
518: a0 e9 ldi r26, 0x90 ; 144
51a: b0 e0 ldi r27, 0x00 ; 0
51c: 2c 91 ld r18, X
51e: 82 2f mov r24, r18
520: 99 27 eor r25, r25
522: fc 01 movw r30, r24
524: e0 58 subi r30, 0x80 ; 128
526: ff 4f sbci r31, 0xFF ; 255
528: 80 91 23 00 lds r24, 0x0023
52c: 80 83 st Z, r24
52e: 2f 5f subi r18, 0xFF ; 255
530: 2c 93 st X, r18
532: 8f ef ldi r24, 0xFF ; 255
534: 80 93 7f 00 sts 0x007F, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWIE)|_BV(TWEA));
538: 85 ec ldi r24, 0xC5 ; 197
53a: 80 93 56 00 sts 0x0056, r24
53e: b6 c0 rjmp .+364 ; 0x6ac
}
else
{ //Buffer Overlow
// cbi(TWCR,TWEA); //Clear TWEA Disable data ACK and address ACK
TWCR=_BV(TWINT);
540: 80 e8 ldi r24, 0x80 ; 128
542: 80 93 56 00 sts 0x0056, r24
ucIICError=IIC_ERROR_BUFFER_OVERLOW;
546: 85 e8 ldi r24, 0x85 ; 133
548: 80 93 94 00 sts 0x0094, r24
}
break;
54c: af c0 rjmp .+350 ; 0x6ac
case TW_SR_DATA_NACK:
case TW_SR_GCALL_DATA_NACK:
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
54e: 85 ec ldi r24, 0xC5 ; 197
550: 80 93 56 00 sts 0x0056, r24
break;
554: ab c0 rjmp .+342 ; 0x6ac
case TW_SR_STOP:
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
556: 85 ec ldi r24, 0xC5 ; 197
558: 80 93 56 00 sts 0x0056, r24
// sbi(TWCR,TWEA); //Set TWEA Enable data ACK and address ACK
if(ucIICError==IIC_ERROR_NOERROR)
55c: 80 91 94 00 lds r24, 0x0094
560: 88 23 and r24, r24
562: 09 f0 breq .+2 ; 0x566
564: a3 c0 rjmp .+326 ; 0x6ac
{
IIC_Buffer_In.ucReadP=0;
566: 10 92 91 00 sts 0x0091, r1
IIC_Buffer_In.ucIICBufferStatus.bEnAccess=1;
56a: 80 91 93 00 lds r24, 0x0093
56e: 81 60 ori r24, 0x01 ; 1
570: 80 93 93 00 sts 0x0093, r24
}
break;
574: 9b c0 rjmp .+310 ; 0x6ac
///////////////////////////////////////////
// Master Recieve Mode
///////////////////////////////////////////
case TW_MR_SLA_ACK:
ucIICMode=IIC_MODE_MASTER_RECEIVE;
576: 83 e0 ldi r24, 0x03 ; 3
578: 80 93 7e 00 sts 0x007E, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
57c: 85 ec ldi r24, 0xC5 ; 197
57e: 80 93 56 00 sts 0x0056, r24
case TW_MR_DATA_ACK: //Recieve data from slave IIC device
if(IIC_Buffer_In.ucWriteP!=IIC_Buffer_In.ucReadP-1) //ucReadP must initlize
582: 80 91 90 00 lds r24, 0x0090
586: 28 2f mov r18, r24
588: 33 27 eor r19, r19
58a: 80 91 91 00 lds r24, 0x0091
58e: 99 27 eor r25, r25
590: 01 97 sbiw r24, 0x01 ; 1
592: 28 17 cp r18, r24
594: 39 07 cpc r19, r25
596: a1 f0 breq .+40 ; 0x5c0
//with Bytes to read before
//Call IICMasrRecieve
{ // Not last byte to recieve
IIC_BUS_TO_BUFFER;
598: a0 e9 ldi r26, 0x90 ; 144
59a: b0 e0 ldi r27, 0x00 ; 0
59c: 2c 91 ld r18, X
59e: 82 2f mov r24, r18
5a0: 99 27 eor r25, r25
5a2: fc 01 movw r30, r24
5a4: e0 58 subi r30, 0x80 ; 128
5a6: ff 4f sbci r31, 0xFF ; 255
5a8: 80 91 23 00 lds r24, 0x0023
5ac: 80 83 st Z, r24
5ae: 2f 5f subi r18, 0xFF ; 255
5b0: 2c 93 st X, r18
5b2: 8f ef ldi r24, 0xFF ; 255
5b4: 80 93 7f 00 sts 0x007F, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
5b8: 85 ec ldi r24, 0xC5 ; 197
5ba: 80 93 56 00 sts 0x0056, r24
break;
5be: 76 c0 rjmp .+236 ; 0x6ac
}
else
{ //Last byte has come to IIC Bus
IIC_BUS_TO_BUFFER;
5c0: a0 e9 ldi r26, 0x90 ; 144
5c2: b0 e0 ldi r27, 0x00 ; 0
5c4: 2c 91 ld r18, X
5c6: 82 2f mov r24, r18
5c8: 99 27 eor r25, r25
5ca: fc 01 movw r30, r24
5cc: e0 58 subi r30, 0x80 ; 128
5ce: ff 4f sbci r31, 0xFF ; 255
5d0: 80 91 23 00 lds r24, 0x0023
5d4: 80 83 st Z, r24
5d6: 2f 5f subi r18, 0xFF ; 255
5d8: 2c 93 st X, r18
5da: 8f ef ldi r24, 0xFF ; 255
5dc: 80 93 7f 00 sts 0x007F, r24
TWCR=(_BV(TWINT)|_BV(TWEN)|_BV(TWIE));
5e0: 85 e8 ldi r24, 0x85 ; 133
5e2: 80 93 56 00 sts 0x0056, r24
// cbi(TWCR,TWEA); //Clear TWEA send NACK to finish recieve
break;
5e6: 62 c0 rjmp .+196 ; 0x6ac
}
case TW_MR_SLA_NACK: //Slave IIC device did not return a NACK during
//address phase
IIC_STOP; //Slave address error,Release IIC bus
5e8: 80 91 56 00 lds r24, 0x0056
5ec: 85 69 ori r24, 0x95 ; 149
5ee: 80 93 56 00 sts 0x0056, r24
5f2: 10 92 7f 00 sts 0x007F, r1
ucIICMode=IIC_MODE_SLAVE_RECEIVE;
5f6: 81 e0 ldi r24, 0x01 ; 1
5f8: 80 93 7e 00 sts 0x007E, r24
ucIICError=IIC_ERROR_NOT_ACK_SLA;
5fc: 81 e8 ldi r24, 0x81 ; 129
5fe: 80 93 94 00 sts 0x0094, r24
IIC_Buffer_In.ucReadP=0;
602: 10 92 91 00 sts 0x0091, r1
IIC_Buffer_In.ucWriteP=0;
606: 10 92 90 00 sts 0x0090, r1
break;
60a: 50 c0 rjmp .+160 ; 0x6ac
case TW_MR_DATA_NACK:
IIC_STOP;
60c: 80 91 56 00 lds r24, 0x0056
610: 85 69 ori r24, 0x95 ; 149
612: 80 93 56 00 sts 0x0056, r24
616: 10 92 7f 00 sts 0x007F, r1
// sbi(TWCR,TWEA); //Set TWEA to enable ACK
if(IIC_Buffer_In.ucReadP==IIC_Buffer_In.ucWriteP)
61a: 90 91 91 00 lds r25, 0x0091
61e: 80 91 90 00 lds r24, 0x0090
622: 98 17 cp r25, r24
624: 41 f4 brne .+16 ; 0x636
{ //Data receive success
//Enable user program get command from IIC recieve buffer
IIC_Buffer_In.ucIICBufferStatus.bEnAccess=1;
626: 80 91 93 00 lds r24, 0x0093
62a: 81 60 ori r24, 0x01 ; 1
62c: 80 93 93 00 sts 0x0093, r24
ucIICError=IIC_ERROR_NOERROR;
630: 10 92 94 00 sts 0x0094, r1
634: 03 c0 rjmp .+6 ; 0x63c
}
else
{
ucIICError=IIC_ERROR_NOT_ACK_DATA;
636: 82 e8 ldi r24, 0x82 ; 130
638: 80 93 94 00 sts 0x0094, r24
}
IIC_Buffer_In.ucWriteP=0;
63c: 10 92 90 00 sts 0x0090, r1
ucIICMode=IIC_MODE_SLAVE_RECEIVE;
640: 81 e0 ldi r24, 0x01 ; 1
642: 80 93 7e 00 sts 0x007E, r24
break;
646: 32 c0 rjmp .+100 ; 0x6ac
//Same as TW_MT_ARB_LOST
// case TW_MR_ARB_LOST:
// ucIICMode=IIC_MODE_SLAVE_RECEIVE;
// ucIICError=IIC_ERROR_ARBITRATION_LOST;
// IIC_Buffer_In.ucReadP=0;
// IIC_Buffer_In.ucWriteP=0;
// break;
///////////////////////////////////////////
// Slave Transmit Mode
///////////////////////////////////////////
case TW_ST_SLA_ACK:
ucIICMode=IIC_MODE_SLAVE_TRANSMIT;
648: 10 92 7e 00 sts 0x007E, r1
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
64c: 85 ec ldi r24, 0xC5 ; 197
64e: 80 93 56 00 sts 0x0056, r24
case TW_ST_DATA_ACK:
if(IIC_Buffer_Out.ucReadP!=IIC_Buffer_Out.ucWriteP)
652: 90 91 a6 00 lds r25, 0x00A6
656: 80 91 a5 00 lds r24, 0x00A5
65a: 98 17 cp r25, r24
65c: a1 f0 breq .+40 ; 0x686
{ // Data transmit not finish
IIC_BUFFER_TO_BUS;
65e: a6 ea ldi r26, 0xA6 ; 166
660: b0 e0 ldi r27, 0x00 ; 0
662: 2c 91 ld r18, X
664: 82 2f mov r24, r18
666: 99 27 eor r25, r25
668: fc 01 movw r30, r24
66a: eb 56 subi r30, 0x6B ; 107
66c: ff 4f sbci r31, 0xFF ; 255
66e: 2f 5f subi r18, 0xFF ; 255
670: 2c 93 st X, r18
672: 80 81 ld r24, Z
674: 80 93 23 00 sts 0x0023, r24
678: 8f ef ldi r24, 0xFF ; 255
67a: 80 93 7f 00 sts 0x007F, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
67e: 85 ec ldi r24, 0xC5 ; 197
680: 80 93 56 00 sts 0x0056, r24
break;
684: 13 c0 rjmp .+38 ; 0x6ac
}
// Buffer Empty!!
case TW_ST_ARB_LOST_SLA_ACK:
case TW_ST_DATA_NACK:
case TW_ST_LAST_DATA:
//Transfer complet
IIC_Buffer_Out.ucIICBufferStatus.bEnAccess=1;
686: 80 91 a8 00 lds r24, 0x00A8
68a: 81 60 ori r24, 0x01 ; 1
68c: 80 93 a8 00 sts 0x00A8, r24
IIC_Buffer_Out.ucReadP=0;
690: 10 92 a6 00 sts 0x00A6, r1
IIC_Buffer_Out.ucWriteP=0;
694: 10 92 a5 00 sts 0x00A5, r1
ucIICMode=IIC_MODE_SLAVE_RECEIVE;
698: 81 e0 ldi r24, 0x01 ; 1
69a: 80 93 7e 00 sts 0x007E, r24
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
69e: 85 ec ldi r24, 0xC5 ; 197
6a0: 80 93 56 00 sts 0x0056, r24
break;
6a4: 03 c0 rjmp .+6 ; 0x6ac
case TW_BUS_ERROR:
case TW_NO_INFO:
default:
TWCR=(_BV(TWEN)|_BV(TWINT)|_BV(TWEA)|_BV(TWIE));
6a6: 85 ec ldi r24, 0xC5 ; 197
6a8: 80 93 56 00 sts 0x0056, r24
6ac: 23 96 adiw r28, 0x03 ; 3
6ae: f8 94 cli
6b0: de bf out 0x3e, r29 ; 62
6b2: cd bf out 0x3d, r28 ; 61
6b4: df 91 pop r29
6b6: cf 91 pop r28
6b8: ff 91 pop r31
6ba: ef 91 pop r30
6bc: bf 91 pop r27
6be: af 91 pop r26
6c0: 9f 91 pop r25
6c2: 8f 91 pop r24
6c4: 3f 91 pop r19
6c6: 2f 91 pop r18
6c8: 0f 90 pop r0
6ca: 0f be out 0x3f, r0 ; 63
6cc: 0f 90 pop r0
6ce: 1f 90 pop r1
6d0: 18 95 reti
000006d2 <I2C_Send>:
break;
}
// TWCR |= _BV(TWINT); //Write 1 to Clear TWINT
}
///////////////////////////////////////////
//U8 I2C_Send(U8 I2C_Addr, U8* I2C_MsgData , U8 MsgDataLen, U8 s_Timeout )
//其中U8 为 unsigned char。
//参数说明:
//I2C_Addr:发送的目标地址,每个板卡都应该有唯一的I2C通讯地址。
//I2C_MsgData:存放消息数据的缓冲区。
//Msg_DataLen:发送消息的数据长度。
//S_Timeout:发送消息超时的时间,单位为毫秒(ms)。
//返回值:是否发送成功,0:成功;~0:错误代码
///////////////////////////////////////////
U8 I2C_Send(U8 I2C_Addr,U8 * I2C_MsgData,U8 MsgDataLen,U8 s_Timeout)
{
6d2: cf 93 push r28
6d4: df 93 push r29
6d6: cd b7 in r28, 0x3d ; 61
6d8: de b7 in r29, 0x3e ; 62
6da: 25 97 sbiw r28, 0x05 ; 5
6dc: 0f b6 in r0, 0x3f ; 63
6de: f8 94 cli
6e0: de bf out 0x3e, r29 ; 62
6e2: 0f be out 0x3f, r0 ; 63
6e4: cd bf out 0x3d, r28 ; 61
6e6: 89 83 std Y+1, r24 ; 0x01
6e8: 6a 83 std Y+2, r22 ; 0x02
6ea: 7b 83 std Y+3, r23 ; 0x03
6ec: 4c 83 std Y+4, r20 ; 0x04
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -