📄 hardware_c.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 + -