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

📄 i2cint.c

📁 I2C在ARM中rlm 的RTX驱动和程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	            	if (I2C0_suba_num == 2)
	            	{	I20DAT = ((I2C0_suba >> 8) & 0xff);
		       			I20CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C0_suba_num--;
		       			break;	
		       		} 
		       		if(I2C0_suba_num == 1)
		       		{	I20DAT = (I2C0_suba & 0xff);
		       			I20CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C0_suba_num--;
		       			break;	
		       		}
	            	if (I2C0_suba_num == 0)
	            	{	I20CONSET = 0x20;
	               		I20CONCLR = 0x08;
	               		I2C0_suba_en = 0;     				/* 子地址己处理 			*/
	               		break;
	               	}
	            }
	            if (I2C0_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 		*/
	       		{
	       		 	if (I2C0_suba_num > 0)
	            	{	if (I2C0_suba_num == 2)
	            		{	I20DAT = ((I2C0_suba >> 8) & 0xff);
	            			I20CONCLR = 0x28;
	            			I2C0_suba_num--;
	            			break;
	            		}
	            		if (I2C0_suba_num == 1)
	            		{	I20DAT    = (I2C0_suba & 0xff);
	               			I20CONCLR = 0x28;
	               			I2C0_suba_num--;
	               			I2C0_suba_en  = 0;
	               			break;
	               		}
	               	}
	             }
	       		break;
	       case 0x40:	/* 已发送SLA+R,已接收ACK */
	       		if (I2C0_num <= 1)	/* 如果是最后一个字节 */			
	       		{	I20CONCLR = 1 << 2;      				/* 下次发送非应答信号 		*/
	       		}
	       		else
	       		{ 	I20CONSET = 1 << 2;						/* 下次发送应答信号 		*/
	       		}
	       		I20CONCLR = 0x28;							/* 清零SI,STA 				*/
	       		break;
	
	       	case 0x20:	/* 已发送SLA+W,已接收非应答              */
	       	case 0x30:	/* 已发送I2DAT中的数据,已接收非应答     */
	       	case 0x38:	/* 在SLA+R/W或数据字节中丢失仲裁         */
	   		case 0x48:	/* 已发送SLA+R,已接收非应答              */
	         	I20CONCLR = 0x28;
	       		break;   				
		
			case 0x50:	/* 已接收数据字节,已返回ACK */
				*I2C0_buf++ = I20DAT;
				I2C0_num--;
				if (I2C0_num == 1)/* 接收最后一个字节 */
				{  	I20CONCLR = 0x2C;						/* STA,SI,AA = 0 			*/
				}
				else
				{  	I20CONSET = 0x04;						/* AA=1 					*/
				  	I20CONCLR = 0x28;
				}
				break;
			
			case 0x58:	/* 已接收数据字节,已返回非应答 */
				*I2C0_buf++ = I20DAT;     					/* 读取最后一字节数据 		*/
	            I20CONSET = 0x10;        					/* 结束总线 				*/
	            I20CONCLR = 0x28;
	            isr_sem_send (wait_end0_sem);
	            break;
	            
	      	default:
	      		break;
		}
	}
	#endif
	#if USE_I2C_CTRL1 == 1
	/* 读取I2C状态寄存器I2DAT */
	/* 按照全局变量的设置进行操作及设置软件标志 */
	/* 清除中断逻辑,中断返回 */
	if(I21CONSET & 1 << 3)
	{
		switch (I21STAT & 0xF8)
		{	/* 根据状态码进行相应的处理 */
			case 0x08:	/* 已发送起始条件 */				/* 主发送和主接收都有 		*/
				/* 装入SLA+W或者SLA+R */
			 	if(I2C1_suba_en == 1)/* SLA+R */			/* 指定子地址读 			*/
			 	{	I21DAT = I2C1_sla & 0xFE; 				/* 先写入地址 				*/
			 	}
	            else	/* SLA+W */
	            {  	I21DAT = I2C1_sla;        				/* 否则直接发送从机地址 	*/
	            }
	            /* 清零SI位 */
	            I21CONCLR =	(1 << 3)|						/* SI 						*/
	            			(1 << 5);						/* STA 						*/
	            break;
	            
	       	case 0x10:	/*已发送重复起始条件 */ 			/* 主发送和主接收都有 		*/
	       		/* 装入SLA+W或者SLA+R */
	       		I21DAT = I2C1_sla;							/* 重起总线后,重发从地址 	*/
	       		I21CONCLR = 0x28;							/* 清零SI,STA */
	       		break;
	
			case 0x18:
	       	case 0x28:	/* 已发送I2DAT中的数据,已接收ACK */
	       		if (I2C1_suba_en == 0)
	       		{
		       		if (I2C1_num > 0)
		       		{	I21DAT = *I2C1_buf++;
		       			I21CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C1_num--;
		       		}
		       		else	/* 没有数据发送了 */
		       		{		/* 停止总线 */
		       		  	I21CONSET = (1 << 4);				/* STO 						*/
		       			I21CONCLR = 0x28;					/* 清零SI,STA 				*/
		       		  	isr_sem_send (wait_end1_sem);		/* 总线已经停止 			*/
		       		}
	       		}
	            if(I2C1_suba_en == 1)	/* 若是指定地址读,则重新启动总线 				*/
	            { 
	            	if (I2C1_suba_num == 2)
	            	{	I21DAT = ((I2C1_suba >> 8) & 0xff);
		       			I21CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C1_suba_num--;
		       			break;	
		       		} 
		       		if(I2C1_suba_num == 1)
		       		{	I21DAT = (I2C1_suba & 0xff);
		       			I21CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C1_suba_num--;
		       			break;	
		       		}
	            	if (I2C1_suba_num == 0)
	            	{	I21CONSET = 0x20;
	               		I21CONCLR = 0x08;
	               		I2C1_suba_en = 0;     				/* 子地址己处理 			*/
	               		break;
	               	}
	            }
	            if (I2C1_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 		*/
	       		{
	       		 	if (I2C1_suba_num > 0)
	            	{	if (I2C1_suba_num == 2)
	            		{	I21DAT = ((I2C1_suba >> 8) & 0xff);
	            			I21CONCLR = 0x28;
	            			I2C1_suba_num--;
	            			break;
	            		}
	            		if (I2C1_suba_num == 1)
	            		{	I21DAT    = (I2C1_suba & 0xff);
	               			I21CONCLR = 0x28;
	               			I2C1_suba_num--;
	               			I2C1_suba_en  = 0;
	               			break;
	               		}
	               	}
	             }
	       		break;
	       case 0x40:	/* 已发送SLA+R,已接收ACK */
	       		if (I2C1_num <= 1)	/* 如果是最后一个字节 */			
	       		{	I21CONCLR = 1 << 2;      				/* 下次发送非应答信号 		*/
	       		}
	       		else
	       		{ 	I21CONSET = 1 << 2;						/* 下次发送应答信号 		*/
	       		}
	       		I21CONCLR = 0x28;							/* 清零SI,STA 				*/
	       		break;
	
	       	case 0x20:	/* 已发送SLA+W,已接收非应答              */
	       	case 0x30:	/* 已发送I2DAT中的数据,已接收非应答     */
	       	case 0x38:	/* 在SLA+R/W或数据字节中丢失仲裁         */
	   		case 0x48:	/* 已发送SLA+R,已接收非应答              */
	         	I21CONCLR = 0x28;
	       		break;   				
		
			case 0x50:	/* 已接收数据字节,已返回ACK */
				*I2C1_buf++ = I21DAT;
				I2C1_num--;
				if (I2C1_num == 1)/* 接收最后一个字节 */
				{  	I21CONCLR = 0x2C;						/* STA,SI,AA = 0 			*/
				}
				else
				{  	I21CONSET = 0x04;						/* AA=1 					*/
				  	I21CONCLR = 0x28;
				}
				break;
			
			case 0x58:	/* 已接收数据字节,已返回非应答 */
				*I2C1_buf++ = I21DAT;     					/* 读取最后一字节数据 		*/
	            I21CONSET = 0x10;        					/* 结束总线 				*/
	            I21CONCLR = 0x28;
	            isr_sem_send (wait_end1_sem);
	            break;
	            
	      	default:
	      		break;
		}
	}
	#endif
	#if USE_I2C_CTRL2 == 1
	/* 读取I2C状态寄存器I2DAT */
	/* 按照全局变量的设置进行操作及设置软件标志 */
	/* 清除中断逻辑,中断返回 */
	if(I22CONSET & 1 << 3)
	{
		switch (I22STAT & 0xF8)
		{	/* 根据状态码进行相应的处理 */
			case 0x08:	/* 已发送起始条件 */				/* 主发送和主接收都有 		*/
				/* 装入SLA+W或者SLA+R */
			 	if(I2C2_suba_en == 1)/* SLA+R */			/* 指定子地址读 			*/
			 	{	I22DAT = I2C2_sla & 0xFE; 				/* 先写入地址 				*/
			 	}
	            else	/* SLA+W */
	            {  	I22DAT = I2C2_sla;        				/* 否则直接发送从机地址 	*/
	            }
	            /* 清零SI位 */
	            I22CONCLR =	(1 << 3)|						/* SI 						*/
	            			(1 << 5);						/* STA 						*/
	            break;
	            
	       	case 0x10:	/*已发送重复起始条件 */ 			/* 主发送和主接收都有 		*/
	       		/* 装入SLA+W或者SLA+R */
	       		I22DAT = I2C2_sla;							/* 重起总线后,重发从地址 	*/
	       		I22CONCLR = 0x28;							/* 清零SI,STA */
	       		break;
	
			case 0x18:
	       	case 0x28:	/* 已发送I2DAT中的数据,已接收ACK */
	       		if (I2C2_suba_en == 0)
	       		{
		       		if (I2C2_num > 0)
		       		{	I22DAT = *I2C2_buf++;
		       			I22CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C2_num--;
		       		}
		       		else	/* 没有数据发送了 */
		       		{		/* 停止总线 */
		       		  	I22CONSET = (1 << 4);				/* STO 						*/
		       			I22CONCLR = 0x28;					/* 清零SI,STA 				*/
		       		  	isr_sem_send (wait_end2_sem);		/* 总线已经停止 			*/
		       		}
	       		}
	            if(I2C2_suba_en == 1)	/* 若是指定地址读,则重新启动总线 				*/
	            { 
	            	if (I2C2_suba_num == 2)
	            	{	I22DAT = ((I2C2_suba >> 8) & 0xff);
		       			I22CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C2_suba_num--;
		       			break;	
		       		} 
		       		if(I2C2_suba_num == 1)
		       		{	I22DAT = (I2C2_suba & 0xff);
		       			I22CONCLR = 0x28;					/* 清零SI,STA 				*/
		       			I2C2_suba_num--;
		       			break;	
		       		}
	            	if (I2C2_suba_num == 0)
	            	{	I22CONSET = 0x20;
	               		I22CONCLR = 0x08;
	               		I2C2_suba_en = 0;     				/* 子地址己处理 			*/
	               		break;
	               	}
	            }
	            if (I2C2_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 		*/
	       		{
	       		 	if (I2C2_suba_num > 0)
	            	{	if (I2C2_suba_num == 2)
	            		{	I22DAT = ((I2C2_suba >> 8) & 0xff);
	            			I22CONCLR = 0x28;
	            			I2C2_suba_num--;
	            			break;
	            		}
	            		if (I2C2_suba_num == 1)
	            		{	I22DAT    = (I2C2_suba & 0xff);
	               			I22CONCLR = 0x28;
	               			I2C2_suba_num--;
	               			I2C2_suba_en  = 0;
	               			break;
	               		}
	               	}
	             }
	       		break;
	       case 0x40:	/* 已发送SLA+R,已接收ACK */
	       		if (I2C2_num <= 1)	/* 如果是最后一个字节 */			
	       		{	I22CONCLR = 1 << 2;      				/* 下次发送非应答信号 		*/
	       		}
	       		else
	       		{ 	I22CONSET = 1 << 2;						/* 下次发送应答信号 		*/
	       		}
	       		I22CONCLR = 0x28;							/* 清零SI,STA 				*/
	       		break;
	
	       	case 0x20:	/* 已发送SLA+W,已接收非应答              */
	       	case 0x30:	/* 已发送I2DAT中的数据,已接收非应答     */
	       	case 0x38:	/* 在SLA+R/W或数据字节中丢失仲裁         */
	   		case 0x48:	/* 已发送SLA+R,已接收非应答              */
	         	I22CONCLR = 0x28;
	       		break;   				
		
			case 0x50:	/* 已接收数据字节,已返回ACK */
				*I2C2_buf++ = I22DAT;
				I2C2_num--;
				if (I2C2_num == 1)/* 接收最后一个字节 */
				{  	I22CONCLR = 0x2C;						/* STA,SI,AA = 0 			*/
				}
				else
				{  	I22CONSET = 0x04;						/* AA=1 					*/
				  	I22CONCLR = 0x28;
				}
				break;
			
			case 0x58:	/* 已接收数据字节,已返回非应答 */
				*I2C2_buf++ = I22DAT;     					/* 读取最后一字节数据 		*/
	            I22CONSET = 0x10;        					/* 结束总线 				*/
	            I22CONCLR = 0x28;
	            isr_sem_send (wait_end2_sem);
	            break;
	            
	      	default:
	      		break;
		}
	}
	#endif
    VICVectAddr = 0x00;              					/* 中断处理结束 			*/
}




⌨️ 快捷键说明

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