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

📄 com2iic.lss

📁 串口转发IIC程序
💻 LSS
📖 第 1 页 / 共 5 页
字号:
			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 + -