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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
*********************************************************************************************************/
void TaskWrite (void *pdata)
{
	#if OS_CRITICAL_METHOD == 3    
    	OS_CPU_SR  cpu_sr;
	#endif
	
	INT8U 	ucErr = 0;
	INT8U 	ucAck = 2;
	INT8U 	ucWriteBuf[514];			
			
	INT16U 	usWriteLen = 0;
	
	for (;;) {
	 
    	OSSemPend(Write_Sem,0,&ucErr);									/*  等待写信号量				*/
        
        ucErr = usbDevWritePort1(&ucAck,1,200);							/*  应答PC机					*/
    	
    	if (ucErr == USB_NO_ERR) {							
    								
    		ucErr = usbDevReadPort2(&ucWriteBuf[2],
    		                        I2C_2.len,
    		                        200);								/*  从PC机读取待写入数据		*/
  											    		
       		if (ucErr == USB_NO_ERR) {						
       								
    		    usWriteLen = WriteCAT24C04 (I2C_2.offset,
    		    							&ucWriteBuf[2],
    		                             	I2C_2.len); 				/*  向CAT24C04写入数据			*/   		
    			
    			ucWriteBuf[0] = (INT8U)(usWriteLen / 256);				/*  成功写入字节数高字节		*/
    			ucWriteBuf[1] = (INT8U)(usWriteLen % 256);				/*  成功写入字节数低字节		*/
       			
       			usbDevWritePort1(&ucWriteBuf[0],
       			                 2,
       			                 200);									/*  向PC机发送已写入字节数		*/
       		}
   	  	}
    }
}

/*********************************************************************************************************
** Function name:		ReadCAT24C04
** Descriptions:        从CAT24C04中读取数据
** input parameters:    usOffset	CAT24C04读操作起始地址0-511
**						ucRcvBuf	接收数据缓冲区指针
**						usReadLen	待读取字节数1-512					
** output parameters:	无						
** Returned value:      读取成功:实际读取字节数
**						读取失败:0
*********************************************************************************************************/
INT16U ReadCAT24C04 (INT16U usOffset,
                     INT8U *ucRcvBuf,
                     INT16U usReadLen)
{
	INT8U  ucPageAddr   = 0;									
	INT16U usHaveRcvLen = 0;
	
	ucPageAddr = (INT8U)(usOffset&0xFF);								/*  页内操作起始地址			*/
	
	if(usOffset < 256) {												/*  若起始地址在第1页范围内		*/
	
		if((usOffset+usReadLen) > 256) {								/*  若需要跨页操作				*/
		
			usHaveRcvLen = I2cRead (CAT24C04_FirstPage,
			                        ucRcvBuf,
			                        &ucPageAddr,
			                        1,
			                        (256-(int16)usOffset));				/*  先从第1页读取部分数据		*/
			ucPageAddr=0;				
			
			usHaveRcvLen += I2cRead (CAT24C04_SecondPage,
			 				         &ucRcvBuf[usHaveRcvLen],
			 				  		 &ucPageAddr,
			 				  		 1,
			 				  		 (int16)(usReadLen-usHaveRcvLen));	/*  再从第2页读取剩余部分数据	*/
			
		} else {														/*  若操作仅在第1页内进行		*/
												
			usHaveRcvLen = I2cRead (CAT24C04_FirstPage,
			                 		ucRcvBuf,
			                 		&ucPageAddr,
			                 		1,
			                 		(int16)usReadLen);					/*  从第1页读取数据				*/
		}

	} else {															/*  操作仅在第2页内进行			*/
									
		usHaveRcvLen = I2cRead (CAT24C04_SecondPage,
		                 		ucRcvBuf,
		                 		&ucPageAddr,
		                 		1,
		                 		(int16)usReadLen);						/*  从第2页读取数据				*/
	}
	
	return (usHaveRcvLen == usReadLen)?usHaveRcvLen:0;					/*  返回操作结果				*/

}

/*********************************************************************************************************
** Function name:		PageWrite
** Descriptions:        以页为单位向CAT24C04写入数据
** input parameters:    ucAddr		器件地址
**						ucOffset	页内偏移地址0x00-0xFF
**						pucWriteBuf	写入数据缓冲区指针
**						usWriteLen	待写入字节数					
** output parameters:	无						
** Returned value:      实际写入的字节数
*********************************************************************************************************/
INT16U PageWrite (INT8U ucAddr,
				  INT8U ucOffset,
				  INT8U *pucWriteBuf,
				  INT16U usWriteLen)
{
	INT8U i       = 0;
	INT8U ucPages = 0;
	INT8U ucNums  = 0;
	
	INT8U ucBufTmp[PAGE_SIZE_CAT1025 + 1];									
	INT16U usHaveWriteLen = 0;
	
	ucPages = (INT8U)(usWriteLen / PAGE_SIZE_CAT1025);					/*  整数页						*/
	ucNums  = (INT8U)(usWriteLen % PAGE_SIZE_CAT1025);					/*  不足整数页部分				*/
	
	ucBufTmp[0] = ucOffset;					    						/*  页内偏移地址				*/

	for (i = 0; i < ucPages; i++) {
	
		memcpy(&ucBufTmp[1], pucWriteBuf, PAGE_SIZE_CAT1025);		  	/*  将待写入数据复制到写入缓冲区*/
		
		usHaveWriteLen += I2cWrite(ucAddr,
						   		   ucBufTmp, 
						   		   PAGE_SIZE_CAT1025 + 1);   			/*  写入数据并累加已写入的字节数*/
		
		usHaveWriteLen -= 1;											/*  写入的有效数据字节数		*/
						   
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);		  			    	/*  延时10ms					*/
												  				    	
   		pucWriteBuf += PAGE_SIZE_CAT1025;								/*  更新缓冲区指针				*/
	   	ucBufTmp[0]  += PAGE_SIZE_CAT1025;
	}

	if (ucNums > 0) {													/*  下面写不够整数页的字节数	*/
																		
		memcpy(&ucBufTmp[1], pucWriteBuf, ucNums);
		
		usHaveWriteLen += I2cWrite (ucAddr, 
									ucBufTmp, 
									ucNums + 1);						/*  写入不足一页部分数据		*/
		usHaveWriteLen -= 1;											/*  写入的有效数据字节数		*/
		
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);							/*  延时10ms					*/
 	}
	
	return usHaveWriteLen;												/*  返回实际写入的字节数		*/
}

/*********************************************************************************************************
** Function name:		Write_FM24CL04
** Descriptions:        向CAT24C04中写入数据
** input parameters:    usOffset	CAT24C04写操作起始地址0-511
**						pucWriteBuf	待写入数据缓冲区指针
**						usWriteLen	待写入字节数					
** output parameters:	无						
** Returned value:      写入成功:实际读取字节数
**						写入失败:0
*********************************************************************************************************/
INT16U WriteCAT24C04 (INT16U usOffset,
					  INT8U *pucWriteBuf,
					  INT16U usWriteLen)
{
	INT16U usHaveWriteLen = 0;											/*  已写入字节数				*/
		
	if(usOffset < 256) {												/*  若起始地址在第1页范围内		*/
	
		if((usOffset+usWriteLen) > 256) {								/*  若需要跨页操作				*/
			
			usHaveWriteLen += PageWrite (CAT24C04_FirstPage,
								    	 usOffset,
								    	 &pucWriteBuf[0],
								    	 (256-usOffset));				/*  先向第1页写入部分数据		*/
		
			usHaveWriteLen += PageWrite (CAT24C04_SecondPage,
									 	 0,
									 	 &pucWriteBuf[usHaveWriteLen],
									 	 (usWriteLen-usHaveWriteLen));	/*  再向第2页写入剩余部分数据	*/
			
			if(usHaveWriteLen!=usWriteLen) {
				return 0;
			} else {
				return	(usHaveWriteLen);								/*  返回写入的有效数据字节数	*/
			}
			
		} else {														/*  操作仅在第1页内进行			*/
				
			usHaveWriteLen=PageWrite (CAT24C04_FirstPage,
								      usOffset,
								      &pucWriteBuf[0],
								      usWriteLen);						/*  写入数据					*/
		}
			
	} else {															/*  若在第2页内操作				*/
	
		usHaveWriteLen=PageWrite (CAT24C04_SecondPage,
								  usOffset,
								  &pucWriteBuf[0],
								  usWriteLen);							/*  写入数据					*/
		
	}
	
	return (usHaveWriteLen == usWriteLen)?usHaveWriteLen:0;				/*  返回操作结果				*/
										
}


/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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