#include "Main.h"
//###################################################################
//函数名称:void Init_Sport0_R(void)
//函数描述:初始化sport0的接收。配置为:
// (1)RCKFE=0,LARFS=0,LRFS=0,RFSR =1,IRFS =0,RLSBIT=0,RDTYPE=0,IRCLK=0;
// (2)RXSE=0,SLEN[4:0]=F
//参数说明:无
//###################################################################
void Init_Sport0_R(void)
{
*pSPORT0_RCR1 = 0x0400;
*pSPORT0_RCR2 = 0x0007;
*pSIC_IMASK |= 0x00000200;
register_handler(ik_ivg9,(ex_handler_fn)IVG9_ISR);
}
//###################################################################
//函数名称:void Enable_Sport0_R(void)
//函数描述:使能sport0的接收
//参数说明:无
//###################################################################
void Enable_Sport0_R(void)
{
*pSPORT0_RCR1 |= RSPEN;
}
//###################################################################
//函数名称:void Disable_Sport0_R(void)
//函数描述:关闭sport0的接收
//参数说明:无
//###################################################################
void Disable_Sport0_R(void)
{
*pSPORT0_RCR1 &= ~RSPEN;
}
//###################################################################
//函数名称:void Init_Sport0_DMA_T(int TFS)
//函数描述:初始化sport0的DMA发送。配置为:
// (1)RCKFE=0,LARFS=0,LRFS=0,RFSR =1,IRFS =1,RLSBIT=0,RDTYPE=0,IRCLK=1;
// (2)RXSE=1,SLEN[4:0]=7
//参数说明:TFS:采样率
//###################################################################
void Init_Sport0_DMA_T(int TFS)
{
#if USED_SPORT0
*pSPORT0_TCR1 = 0x0602;
*pSPORT0_TCR2 = 0x0407;
*pSPORT0_TCLKDIV = (Sclk>>1)/(TFS*2)-1;
*pSPORT0_TFSDIV = 0;
*pDMA2_PERIPHERAL_MAP = 0x2000;
*pDMA2_CONFIG = (WDSIZE_8 | DI_EN);
*pDMA2_X_MODIFY = 1;
register_handler(ik_ivg9,(ex_handler_fn)IVG9_ISR);
*pSIC_IMASK |= 0x00000400;
#else
*pSPORT1_TCR1 = 0x0602;
*pSPORT1_TCR2 = 0x0407;
*pSPORT1_TCLKDIV = (Sclk>>1)/(TFS*2)-1;
*pSPORT1_TFSDIV = 0;
*pDMA4_PERIPHERAL_MAP = 0x4000;
*pDMA4_CONFIG = (WDSIZE_8 | DI_EN);
*pDMA4_X_MODIFY = 1;
register_handler(ik_ivg9,(ex_handler_fn)IVG9_ISR);
*pSIC_IMASK |= 0x00001000;
#endif
}
//###################################################################
//函数名称:void Enable_Sport0_DMA_T(unsigned char transmitBuffer[], int num)
//函数描述:使能sport0的DMA发送,不需要启动定时器0进行超时等待
//参数说明:transmitBuffer[]:发送数组
// num:发送数据个数
//###################################################################
void Enable_Sport0_DMA_T(unsigned char transmitBuffer[], int num)
{
#if USED_SPORT0
*pDMA2_START_ADDR = transmitBuffer;
*pDMA2_X_COUNT = num;
*pDMA2_CONFIG |= DMAEN;
*pSPORT0_TCR1 |= TSPEN;
#else
*pDMA4_START_ADDR = transmitBuffer;
*pDMA4_X_COUNT = num;
*pDMA4_CONFIG |= DMAEN;
*pSPORT1_TCR1 |= TSPEN;
#endif
}
//###################################################################
//函数名称:void Sport0_T(unsigned char transmitBuffer[], int num)
//函数描述:使能sport0的DMA发送,需要启动定时器0进行超时等待
//参数说明:transmitBuffer[]:发送数组
// num:发送数据个数
//###################################################################
void Sport0_T(unsigned char transmitBuffer[], int num)
{
if(TrackFlag == 1)
{
Set_Timer0(Sclk*WorkCycle); // 启动定时器0
Enable_Timer0();
}
FPGA_DSP_Commu_Flag = 1;
FPGA_DSP_Commu_Count = 0;
Enable_Sport0_DMA_T(transmitBuffer,num);
}
//###################################################################
//函数名称:void Disable_Sport0_DMA_T(void)
//函数描述:关闭sport0的DMA发送。
//参数说明:无
//###################################################################
void Disable_Sport0_DMA_T(void)
{
#if USED_SPORT0
*pDMA2_CONFIG &= ~DMAEN;
*pSPORT0_TCR1 &= ~TSPEN;
#else
*pDMA4_CONFIG &= ~DMAEN;
*pSPORT1_TCR1 &= ~TSPEN;
#endif
}
//###################################################################
//函数名称:void SPORT_ISR(void)
//函数描述:sport0中断入口函数
//参数说明:无
//###################################################################
unsigned int temp = 0;
unsigned int temp10 = 0;
unsigned int temp11 = 0;
unsigned int temp12 = 0;
unsigned int temp13 = 0;
unsigned int count123 = 0;
void SPORT_ISR(void)
{
unsigned char Temp_Data = 0;
// Sport0发射,不做处理
if(*pDMA2_IRQ_STATUS & 0x0001)
{
*pDMA2_IRQ_STATUS = 0x0001;
}
if(*pDMA4_IRQ_STATUS & 0x0001)
{
*pDMA4_IRQ_STATUS = 0x0001;
}
/////////////////////SPORT0:与FPGA通信中断///////////////////
if(*pSIC_ISR & 0x00000200)
{
Temp_Data = *pSPORT0_RX16;
switch(Sport0ReBufSta)
{
case 'N': // 接收帧头1
{
if(Temp_Data == 0x55)
{
// 500ms超时处理
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
// Set_Timer2(Sclk*0.5);
// Enable_Timer2();
Sport0ReBuf[Sport0ReBufNum++] = Temp_Data;
Sport0ReBufSta = 'M';
}
else
{
Sport0ReBufNum = 0;
}
}break;
case 'M': // 接收帧头2
{
if(Temp_Data == 0x55)
{
// 500ms超时处理
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
// Set_Timer2(Sclk*0.5);
// Enable_Timer2();
Sport0ReBuf[Sport0ReBufNum++] = Temp_Data;
Sport0ReBufSta = 'L';
}
else
{
Sport0ReBufSta = 'N';
Sport0ReBufNum = 0;
}
}break;
case 'L': // 接收长度低8位
{
Sport0ReBufLen = Temp_Data;
Sport0ReBuf[Sport0ReBufNum++] = Temp_Data;
Sport0ReBufSta = 'H';
// 500ms超时处理
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
// Set_Timer2(Sclk*0.5);
// Enable_Timer2();
}break;
case 'H': // 接收长度高8位
{
Sport0ReBuf[Sport0ReBufNum++] = Temp_Data;
Sport0ReBufLen = (Temp_Data<<8) + Sport0ReBufLen;
if(Sport0ReBufLen > SPORT0_REBUF_SIZE || Sport0ReBufLen<1)
{
Sport0ReBufSta = 'N';
Sport0ReBufNum = 0;
}
else
{
Sport0ReBufSta = 'D';
// 500ms超时处理
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
// Set_Timer2(Sclk*0.5);
// Enable_Timer2();
}
}break;
case 'D': // 接收数据内容
{
Sport0ReBuf[Sport0ReBufNum++] = Temp_Data;
// 500ms超时处理
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
// Set_Timer2(Sclk*0.5);
// Enable_Timer2();
if(Sport0ReBufNum == Sport0ReBufLen+4)
{
// Disable_Timer2();
// *pTIMER_STATUS = 0x4004;
temp++;
if(temp>100)
{
temp = temp;
}
OSQPost(SportDataProQ, (void *)Sport0ReBufNum);
Sport0ReBufSta = 'N';
Sport0ReBufNum = 0;
}
}break;
default: break;
}
}
}