/*******************************************************************************
** Copyright CHINT Group Corp. All Rights Reserved.
** File name: Driver_SPort.C
** Author : ybkj Version : V1.0 Date: 2013-05-09
** Device : BF512
** Compiler : VisualDSP ++
** Description: Sport 驱动程序
** History : // 修改历史记录列表,每条修改记录应包括修改日期、修改
// 者及修改内容简述
1. Date: 2013-05-09 Author: ybkj
Modification:
2. Date: 2013-05-09 Author: ybkj
Modification:
**
*******************************************************************************/
#include "..\Include\MacroHead.h"
INT16S GArr_Sport0_Buffer[8];
static INT8U GV_Sport0_finish = 0;
OS_EVENT *AD7606_Sample_Sem;
INT32U GV_Except_count_dead = 0;
INT32U GV_ResetCounter = 10000;
/*******************************************************************************
** Function : Sport_DMA_Handler // 函数名称
** Abstract : sport接口接受DMA中断 // 函数功能、性能等的描述
** Input : None // 对输入参数的说明
** Output : None // 对输出参数的说明。
** Return : None // 函数返回值的说明
** Calls : None // 被本函数调用的函数清单
** Called By : None
** Influence : None // 对其他函数和参数的影响
** Others : None // 其它说明
*******************************************************************************/
section( "L1_code" )
void Sport_DMA_Handler(void )
{
if(*pSIC_ISR0 & IRQ_DMA3) /*SPORT0 接收 DMA中断*/
{
while(!(*pDMA3_IRQ_STATUS & DMA_DONE)) { /* 等待DMA接收数据完成 */ }
*pDMA3_IRQ_STATUS = DMA_DONE; /*写1清中断,清除中断*/
ssync();
*pDMA3_CONFIG = 0;
ssync();
*pSPORT0_RCR1 = (*pSPORT0_RCR1 &(~ RSPEN)); /* 关闭接受 sport0 RX */
ssync();
EMLib_Background_ISR();
}
}
/*******************************************************************************
** Function : Sport_BUSY_Handler // 函数名称
** Abstract : BUSY不忙信号中断 // 函数功能、性能等的描述
** Input : None // 对输入参数的说明
** Output : None // 对输出参数的说明。
** Return : None // 函数返回值的说明
** Calls : None // 被本函数调用的函数清单
** Called By : None
** Influence : None // 对其他函数和参数的影响
** Others : None // 其它说明
*******************************************************************************/
section( "L1_code" )
void Sport_BUSY_Handler(void )
{
if(*pSIC_ISR1 & IRQ_PFA_PORTF) /*PF15 IO 中断 BUSY*/
{
*pPORTFIO_MASKA &= ~AD7606_BUSY_BITMASK; /*BUSY中断禁止*/
Start_Sport();
*pPORTFIO_CLEAR = AD7606_BUSY_BITMASK;
}
}
/*******************************************************************************
** Function : Init_Sprot0 // 函数名称
** Abstract : SPI 初始化 // 函数功能、性能等的描述
** Input : None // 对输入参数的说明
** Output : None // 对输出参数的说明。
** Return : None // 函数返回值的说明
** Calls : None // 被本函数调用的函数清单
** Called By : None
** Influence : None // 对其他函数和参数的影响
** Others : None // 其它说明
*******************************************************************************/
section( "L1_code" )
void Init_AD7606_Sprot0(void)
{
/*****************************************************************/
/*端口配置*/
/* 使能 SPORT0 主和从接受管脚第一功能*/
*pPORTG_MUX &= ~(BIT3 + BIT4 + BIT5 + BIT10); /* DR0PRI, RFS0, RSCLK0, DR0SEC */
//*pPORTG_MUX &= ~(0x0438);//20140604
ssync();
/*使能外设功能 */
*pPORTG_FER |= PG3 | PG4 | PG5 |PG10; /* DR0PRI, RFS0, RSCLK0, DR0SEC */
ssync();
/*****************************************************************/
/*中断配置*/
*pSIC_IAR1 &= 0xFFFFFFF0;
*pSIC_IAR1 |= P8_IVG(IRQ_NUM_SPORT_STATUS); //sport0 状态中断
*pSIC_IMASK0 |= IRQ_SPORT0_ERR;
ssync();
*pSIC_IAR2 &= 0xFFFFFFF0;
*pSIC_IAR2 |= P16_IVG(IRQ_NUM_SPORT_DMA); //sprot0_RX 和DMA 状态中断
*pSIC_IMASK0 |= IRQ_DMA3;
ssync();
Init_AD7606_PF();
}
/*******************************************************************************
** Function : Start_Sport // 函数名称
** Abstract : 启动Sport接收数据 // 函数功能、性能等的描述
** Input : None // 对输入参数的说明
** Output : None // 对输出参数的说明。
** Return : None // 函数返回值的说明
** Calls : None // 被本函数调用的函数清单
** Called By : None
** Influence : None // 对其他函数和参数的影响
** Others : None // 其它说明
*******************************************************************************/
section( "L1_code" )
void Start_Sport(void)
{
/* sport0 配置寄存器 */
*pSPORT0_RCR1 = 0;
*pSPORT0_RCR1 = //RCKFE | /**/
LARFS | /*晚同步桢*/
LRFS | /*接受同步桢低电平有效*/
RFSR | /*每桢都需要接收同步桢*/
IRFS | /*使用内部接收同步桢*/
IRCLK ; /* 使用内部接收 时钟*/
*pSPORT0_RCR2 = 0x010f; /* 数据长度是16位*/
*pSPORT0_RCLKDIV = 0x000a; /*sport 时钟是1/1 的系统时钟 0x000a*/
*pSPORT0_RFSDIV = 0x0020; /*接收同步桢 在RFS前有32个时钟*/
/*****************************************************************/
/* 配置 DMA3 为 SPORT0 接受 */
*pDMA3_PERIPHERAL_MAP = PMAP_SPORT0RX; /* 映射Sprot接收 给 DMA3 ;外设操作*/
*pDMA3_CONFIG = FLOW_STOP |
WNR | /*从外设数据写到存储器*/
SYNC |
WDSIZE_16 | /*数据宽度为16位*/
DI_EN ; /*使能完成中断*/
*pDMA3_START_ADDR = &GArr_Sport0_Buffer; /* 缓冲区首地址 */
*pDMA3_X_COUNT = 6; /* 接受6个 */
*pDMA3_X_MODIFY = 2; /* 步进2个字节 */
*pDMA3_CONFIG = (*pDMA3_CONFIG | DMAEN); /* 使能DMA */
ssync();
*pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN); /* 使能SPRORT接收 */
ssync();
}
/*******************************************************************************
** Function : Init_AD7606_PF // 函数名称
** Abstract : 初始化AD7606控制管脚 // 函数功能、性能等的描述
** Input : None // 对输入参数的说明
** Output : None // 对输出参数的说明。
** Return : None // 函数返回值的说明
** Calls : None // 被本函数调用的函数清单
** Called By : None
** Influence : None // 对其他函数和参数的影响
** Others : None // 其它说明
*******************************************************************************/
//section("sdram0")
void Init_AD7606_PF(void)
{
/*转换管脚*/
*pPORTF_FER &= (~AD7606_CONVERT_BITMASK); /*当普通 IO用*/
*pPORTFIO_DIR |= AD7606_CONVERT_BITMASK; /*输出*/
// AD7606_Reset();
*pPORTFIO_CLEAR = ( AD7606_CONVERT_BITMASK); /*