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

📄 hardware_c.c

📁 是zmac的协议的全部完整的解析.代码例子很全
💻 C
字号:
#include	"Hardware_Ext.h"
#include	"Soft_Timer_Ext.h"
#include	"main_Ext.h"
#include	"CC2420_Ext.h"
#include	"Z_PHY_Ext.h"
#include	"Z_MAC_Ext.h"



/************************************************************************************/
/*	对 CPU 进行初始化																*/
/*	参数:	无																		*/
/*	返回值:无																		*/
/************************************************************************************/
void	Ini_CPU ( void )
{
/*	MEMMAP = 0x2;	*/	/* __DEBUG_RAM */
/*	MEMMAP = 0x1;	*/	/* __IN_CHIP */

	MEMMAP = 0x1;			/* __DEBUG_FLASH */

	#if		VPB_DIV	== 1			/* 配置 FPCLK */
		VPBDIV	= 1;
	#endif

	#if		VPB_DIV	== 2
		VPBDIV	= 2;
	#endif

	#if		VPB_DIV	== 4
		VPBDIV	= 0;
	#endif

	#if		PLL_MULT > 1
		PLLCON	= 1;							/* 配置 PLL */
		PLLCFG	= PLLCFG_MSEL | ( PLLCFG_PSEL << 5 );

		PLLFEED	= 0xaa;
		PLLFEED	= 0x55;
		while( ( PLLSTAT & ( 1 << 10 ) ) == 0 ) {};		/* 等待 PLL 锁定 */
		PLLCON = 3;										/* 连接 PLL */
		PLLFEED	= 0xaa;
		PLLFEED	= 0x55;
	#endif

	/* 设置存储器加速模块 */
	MAMCR =	0;		/* 在设置 MAM 之前,先向 MAMCR 写入0以关闭 MAM */					

	#if	FCCLK <	20000000
		MAMTIM = 1;
	#else
		#if	FCCLK <	40000000
			MAMTIM = 2;
		#else
			MAMTIM = 3;
		#endif
	#endif

	MAMCR =	2;		/* 启动 MAM */

//	Ini_UART1( 1200 );

	Disable_All_INT();		/* 禁止所有中断 */

}



/************************************************************************************/
/*	处理 UART0 接收到的数据。接收到的数据存放于 sUART0_RX_Data 中					*/
/*	参数:	无																		*/
/*	返回值:无																		*/
/************************************************************************************/
void	Process_UART0_Received_Data ( void )
{
	if ( ( sUART0_RX_Data.uiValid_Frames == 0 ) ||
		 ( sUART0_RX_Data.uiPoint != sUART0_RX_Data.uiStart_Of_First_Valid_Frame ) )
	{
		while ( UART0_RX_FLAG )
		{
			sUART0_RX_Data.acRX_Buffer[sUART0_RX_Data.uiPoint] = Read_UART0_RX_DaTa();

			sUART0_RX_Data.uiPoint ++;
			if ( sUART0_RX_Data.uiPoint == UART_RX_BUFFER_SIZE )
				sUART0_RX_Data.uiPoint -= UART_RX_BUFFER_SIZE;

			if ( sUART0_RX_Data.uiPoint == sUART0_RX_Data.uiStart_Of_First_Valid_Frame )
			{
				Flush_UART0_RX_Buffer();
				break;
			}
		}

		Find_Next_Valid_Frame( &sUART0_RX_Data, sUART0_RX_Data.uiEnd_Of_Last_Valid_Frame, TRUE );
	}
	else
		Flush_UART0_RX_Buffer();

	if ( sUART0_RX_Data.uiValid_Frames )
	{
		//Set_LED( LED_4 );
		if ( ! sUART0_RX_Data.bOn_Processing )
			UART0_Prepare_Data();

		OSTaskResume( PRIO_TASK_HANDLE_CC2420 );	/* 激活 CC2420 收发任务 */
	}
//	else
		//Clear_LED( LED_4 );
}




/************************************************************************************/
/*	将 UART0 接收到的数据存放到 asCC2420_TX_Data[] 中等待发送						*/
/*	参数:																			*/
/*			pData:	需要发送的数据													*/
/*	返回值:无																		*/
/************************************************************************************/
void	UART0_Prepare_Data ( void )
{
	PHY_TX_Data_Info	sTx_Data_Info;
	INT16U				uiTemp;

	uiTemp	= sUART0_RX_Data.uiStart_Of_First_Valid_Frame + 4;
	if ( uiTemp >= UART_RX_BUFFER_SIZE )
		uiTemp -= UART_RX_BUFFER_SIZE;
	sTx_Data_Info.pData			= sUART0_RX_Data.acRX_Buffer + uiTemp;

	uiTemp	= sUART0_RX_Data.uiStart_Of_First_Valid_Frame + 1;
	if ( uiTemp >= UART_RX_BUFFER_SIZE )
		uiTemp -= UART_RX_BUFFER_SIZE;
	sTx_Data_Info.uiData_Length	= sUART0_RX_Data.acRX_Buffer[uiTemp] - 4;

	sTx_Data_Info.bACK_Request	= TRUE;
	sTx_Data_Info.bIntra_PAN	= TRUE;
	sTx_Data_Info.ucDest_Addr_Mode	= ADDR_MODE_16BIT;
	sTx_Data_Info.ucSrc_Addr_Mode	= ADDR_MODE_16BIT;
	sTx_Data_Info.uiDest_PAN_ID		= 0xffff;
	sTx_Data_Info.acDest_Address[0]	= 0xff;
	sTx_Data_Info.acDest_Address[1]	= 0xff;

	if ( MAC_Build_Data_Frame( &sTx_Data_Info ) )
	{
		sUART0_RX_Data.uiValid_Frames --;			/* 注意此时即使 uiValid_Frames = 0, 也不删除 */
													/* sUART0_RX_Data.acRX_Buffer[] 中的数据, 数据要等 CC2420 发送完毕之后才删除 */
		sUART0_RX_Data.acRX_Buffer[sUART0_RX_Data.uiStart_Of_First_Valid_Frame] = 0;	/* 删除帧头 */

		if ( sUART0_RX_Data.uiValid_Frames )
			Find_Next_Valid_Frame( &sUART0_RX_Data, sUART0_RX_Data.uiStart_Of_First_Valid_Frame, FALSE );

		sUART0_RX_Data.bOn_Processing = TRUE;
	}
}


/************************************************************************************/
/*	检查 UART0 或 UART1 接收到的数据中的下一个有效帧								*/
/*	参数:																			*/
/*			pRX_Data:	指向需要检查的数据缓冲区的指针								*/
/*			uiStart:	开始查找的位置												*/
/*			bLast:		是否查找最后一个有效数据帧(即查找新接收到的数据帧)		*/
/*						= TRUE, 则说明要查找新接收到的数据帧						*/
/*								如果查找到,需要更新 uiEnd_Of_Last_Valid_Frame 		*/
/*								以及 uiValid_Frames									*/
/*						= FALSE,则说明在使用完一帧数据之后,需要查找下一帧有效数据	*/
/*								如果查找到,更新uiStart_Of_First_Valid_Frame		*/
/*								在这种情况下,uiValid_Frames 在使用之后就被修		*/
/*								改,不在本函数中再次修改							*/
/*	返回值:无																		*/
/************************************************************************************/
void	Find_Next_Valid_Frame ( UART_RX_Data * pRX_Data, INT16U uiStart, BOOL bLast )
{
	INT16U		uiValid_Data_Length;	/* 缓冲区中有效数据的总长度 */
	INT16U		uiNeed_Check_Length;	/* 需要检查的数据长度 */
	INT16U		i, j, k;
	INT16U		uiPosition;
	INT8U		ucFrame_Length;
	INT16U		uiEnd;					/* 帧尾所在的位置 */
	INT8U		ucSum;

	if ( bLast )
	{
		if ( pRX_Data->uiValid_Frames )		/* uiValid_Frames > 0, 说明存在有效数据 */
		{
			if ( pRX_Data->uiEnd_Of_Last_Valid_Frame > pRX_Data->uiStart_Of_First_Valid_Frame )
			{
				uiValid_Data_Length = pRX_Data->uiEnd_Of_Last_Valid_Frame -
									  pRX_Data->uiStart_Of_First_Valid_Frame;

				uiNeed_Check_Length = UART_RX_BUFFER_SIZE - uiValid_Data_Length;
			}
			else
			{
				uiNeed_Check_Length = pRX_Data->uiStart_Of_First_Valid_Frame -
									  pRX_Data->uiEnd_Of_Last_Valid_Frame;
			}
		}
		else
			uiNeed_Check_Length = UART_RX_BUFFER_SIZE;
	}
	else	/* 如果不是查找新接收到的数据帧,则在调用本函数前已经判断出缓冲区中肯 */
	{		/* 定存在有效的数据帧,因此需要查找所有数据,直到查找出有效数据帧为止 */
		uiNeed_Check_Length = UART_RX_BUFFER_SIZE;
	}

	i = 0;
	while ( i < uiNeed_Check_Length )
	{
		uiPosition = uiStart + i;
		if ( uiPosition == UART_RX_BUFFER_SIZE )
			uiPosition -= UART_RX_BUFFER_SIZE;

		if ( pRX_Data->acRX_Buffer[uiPosition] == UART_FRAME_HEADER )		/* 检查帧头 */
		{
			ucFrame_Length	= pRX_Data->acRX_Buffer[uiPosition+1];
			uiEnd			= uiPosition + ucFrame_Length + 1;

			if ( uiEnd >= UART_RX_BUFFER_SIZE )
				uiEnd -= UART_RX_BUFFER_SIZE;

			if ( pRX_Data->acRX_Buffer[uiEnd] == UART_FRAME_END )			/* 检查帧尾 */
			{
				ucSum = 0;
				for ( j=0; j<ucFrame_Length; j++ )
				{
					k = uiPosition + j;
					if ( k >= UART_RX_BUFFER_SIZE )
						k -= UART_RX_BUFFER_SIZE;

					ucSum += pRX_Data->acRX_Buffer[k];
				}

				if ( ucSum == ( INT8U )( pRX_Data->acRX_Buffer[uiEnd-1] ) )	/* 检查校验和 */
				{
					if ( bLast )
					{
						if ( pRX_Data->uiValid_Frames == 0 )
							pRX_Data->uiStart_Of_First_Valid_Frame = uiPosition;
						
						pRX_Data->uiValid_Frames ++;
						pRX_Data->uiEnd_Of_Last_Valid_Frame = uiEnd;
					}
					else
						pRX_Data->uiStart_Of_First_Valid_Frame = uiPosition;

					break;
				}
			}
		}

		i ++;
	}
}



/************************************************************************************/
/*	通过 UART0 发送数据																*/
/*	参数:	uiFrame_Number:	规定了需要发送的 asUART0_TX_Data[] 中					*/
/*							uiFrame_Number 的值										*/
/*			ucSel:			需要发送的数据在 asUART0_TX_Data[] 中的位置				*/
/*							ucSel >= UART_TX_ARRAY_SIZE, 则说明没有指定位置,		*/
/*								需要发送的数据由 uiFrame_Number 确定				*/
/*							ucSel < UART_TX_ARRAY_SIZE, 则指定了有效的发送位置		*/
/*								此时 uiFrame_Number 无效							*/
/*	返回值:无:																		*/
/*	备注:	需要发送的数据存放在 asUART0_TX_Data[] 中, UART 发送数据后, 将已		*/
/*			经发送的数据从 asUART0_TX_Data[] 中 删除								*/
/************************************************************************************/
void	Send_UART0_Data ( INT16U uiFrame_Number, INT8U ucSel )
{
	INT8U		i, j;
	INT8U		ucStart, ucEnd;
	INT8U		ucFrame_Length;
	INT16U		uiTemp_Number;

	if ( ucSel < UART_TX_ARRAY_SIZE )
	{
		ucStart			= ucSel;
		ucEnd			= ucSel;
		uiTemp_Number	= asUART0_TX_Data[ucSel].uiFrame_Number;
	}
	else
	{
		ucStart			= 0;
		ucEnd			= UART_TX_ARRAY_SIZE - 1;
		uiTemp_Number	= uiFrame_Number;
	}

	for ( i=ucStart; i<=ucEnd; i++ )
	{
		if ( asUART0_TX_Data[i].uiFrame_Number == uiTemp_Number )
		{
			ucFrame_Length = asUART0_TX_Data[i].ucLength + 6;

			if ( ucFrame_Length <= MAX_UART_FRAME_LENGTH )	/* 检查帧长度 */
			{
				Build_UART_Frame ( &asUART0_TX_Data[i] );

				for ( j=0; j<ucFrame_Length; j++ )
				{
					UART0_Send_Byte( acUART_TX_Buffer[j] );		/* 发送数据 */
					while ( UART0_Send_Finished == 0 ) {};		/* 等待发送完毕 */
				}
			}
			else
				memset ( ( void * ) &asUART0_TX_Data[i], 0, sizeof ( UART_TX_Data ) );
		}
	}
}



/************************************************************************************/
/*	将存放在 pData 中需要发送的数据构建成指定格式的数据帧							*/
/*	构建完毕的数据帧存放在 acUART_TX_Buffer 中										*/
/*	参数:																			*/
/*			pData:	需要发送的数据													*/
/*	返回值:无																		*/
/************************************************************************************/
void	Build_UART_Frame ( UART_TX_Data *pData )
{
	INT16U		i;
	INT8U		ucSum;

	acUART_TX_Buffer[0]	= UART_FRAME_HEADER;						/* 帧头 */

	acUART_TX_Buffer[1]	= ( INT8S ) ( pData->ucLength + 4 );		/* 长度 */
	acUART_TX_Buffer[2]	= pData->ucTotal_Frames;					/* 总帧数 */
	acUART_TX_Buffer[3]	= pData->ucCurr_Frame;						/* 帧号 */

	memcpy ( acUART_TX_Buffer + 4, ( INT8S * )pData->pData, pData->ucLength );	/* 数据 */

	ucSum = 0;
	for ( i=0; i<pData->ucLength+4; i++ )
		ucSum += acUART_TX_Buffer[i];

	acUART_TX_Buffer[pData->ucLength+4] = ( INT8S ) ucSum;			/* 校验和 */
	acUART_TX_Buffer[pData->ucLength+5] = UART_FRAME_END;				/* 帧尾 */
}

⌨️ 快捷键说明

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