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

📄 comunic.c

📁 数字信号处理中的多缓冲口的AD转换编程程序,希望对大家有用
💻 C
字号:
/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*                                                                            */
/*  MODULE NAME... Mcbsp											          */
/*  FILENAME...... comunication.c   										  */
/*  DESCRIPTION:  															  */
/*  This is an fuction which is just for comunication                             */	
/*                                                                            */
/*  作者:黄林生                                                               */
/*  版本:1.0                                                                  */
/*  日期:06.10.24                                                             */
/******************************************************************************/

#include <csl.h>
#include <csl_chip.h>
#include <csl_i2c.h>
#include <csl_irq.h>
#include <csl_gpt.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_emif.h>
#include <csl_emifBhal.h>
#include <csl_std.h>
#include "check.h"
#include "type.h"
#include "protocol.h"
#include "DEC5502_MCBSP_inti.h"
#include "DEC5502_MCBSP_work.h"
#include "i_cmplx.h"
#include "math.h"
#include "E2PROM_Function.h"
#include "CODEC.h"
#include "E2PROM_Function.h"
#include "CODEC.h"

#undef  CODEC_ADDR
#define CODEC_ADDR 0x1A

PmcbspForDec5502 psend;
short Buffer[1024];
uint mcbspx[FRAMLENGTH];
uint mcbspr[FRAMLENGTH];
int k,mod,number=0,s;

/***********************************************************************/
//系统缓冲区的定义:
//系统缓冲区的定义:
//第1个字节 :数据准备好
//第2个字节 :出现故障
//第3个字节 :有新帧
//第4个字节 :中断超时
//第5个字节 :较验出错

#define RECEIVE_RDY     0x1
#define MCBSP_ERR       0x2
#define RECEIVE_NEW     0x3
#define INT_ERR         0x4
#define CH_ERROR     0x5
unsigned int sys_statbuff[6];
uint RevBuffer[FRAMLENGTH];

/***********************************************************************/
interrupt void McbspRevIsr(void);
interrupt void Timer0Isr(void);
  
/***********************************************************************/
/*	函数声明:	MCBSP数据发送; 发送命令帧时用此函数                    */
/*                                                                     */
/*	函数功能:	每次发送一帧的长度                                     */
/*                                                                     */
/*	参数:		addr,发送数据的地址                                    */
/***********************************************************************/
extern void mcbsp_tx(unsigned int * addr)
{
	int tempdata,tempnum;
	unsigned int check = 0;

    for(tempnum=0;tempnum<(FRAMLENGTH-1);tempnum++)
	{
	    tempdata=*(addr++);
	    check=check^tempdata;	 
    	while (!MCBSP_xrdy(hMcbsp));                       
    	    MCBSP_write16(hMcbsp,tempdata);
   	}
	if(tempnum==(FRAMLENGTH-1))
    {
    	*addr=check;
    	while (!MCBSP_xrdy(hMcbsp));                       
            MCBSP_write16(hMcbsp,check);
    }
	tempnum=0; 
}

/***********************************************************************/
/*	函数声明:	MCBSP数据接收                                          */
/*                                                                     */
/*	函数功能:	响应中断,读取MCBSP的接收BUFFER内的数据,将数据        */
/*			    放在RevBuffer变量中                                    */
/*                                                                     */
/*  参数:                                                             */
/*              Channel:    有效的串口句柄			    			   */
/*	            datarevlength:  每次从缓冲区读取的长度                 */
/*	            recvaddr:    缓冲区的首址                              */
/*                                                                     */
/*  返回值      0:接收完成  				             			   */
/*              1:数据未准备好                                        */
/*              0xFFFF:串口接收错误                                    */
/*              2:中断超时错误                                        */
/*              3: 较验出错                                            */
/***********************************************************************/
unsigned int mcbsp_rx(unsigned int * recvaddr)
{
	unsigned int check = 0;
	int j=0;
	//数据未准备好
	if(datarevlength<FRAMLENGTH)
	{ 
	   sys_statbuff[RECEIVE_RDY]=1;
	   return 1;
	}
	//中断超时
	if(timeout==0)
	{
	   sys_statbuff[INT_ERR]=1;
	   datarevlength=0;
	   timeout = 0x8000;
	   return 2;
    }
    //串口接收错误
   	if(datarevlength>FRAMLENGTH)
	{ 
       sys_statbuff[RECEIVE_RDY] = 0;
	   sys_statbuff[MCBSP_ERR]=1;
	   datarevlength=0;
	   timeout = 0x8000;
	   return 0xffff;
    }
    //接收完成
	if(datarevlength==FRAMLENGTH)
	{
 	   for(j = 0; j<FRAMLENGTH-1;j++)
       {
	       *(recvaddr++) = RevBuffer[j];
	       check = check ^RevBuffer[j];
       }
       //接收校验
       *recvaddr = RevBuffer[j];
	   if((*recvaddr) == check)
	   {
	      sys_statbuff[CH_ERROR] = 0;
		  sys_statbuff[RECEIVE_RDY] = 0;
       }
       //校验出错
       else
	   {
	      sys_statbuff[CH_ERROR] = 1;
		  sys_statbuff[RECEIVE_RDY] = 0;
	      datarevlength=0;
	      timeout = 0x8000;
	      return 3;		   		
	   }
	   sys_statbuff[RECEIVE_NEW]=1;
  	   datarevlength=0;
	   timeout = 0x8000;
	   return 0;
    }
}
	
/***********************************************************************/
/*  函数声明:	串口接收状态,并设置相应的寄存器默认值  	               */
/*                                                                     */
/*  返回值      0:接收完成  				         				   */
/*              1:数据未准备好                                        */
/*              0xFFFF:串口接收错误                                    */
/*              2:中断超时错误                                        */
/*              3: 较验出错                                            */
/***********************************************************************/
int mcbsp_status()
{
	/*中断超时错误*/
	if(sys_statbuff[INT_ERR] ==1)
	{
		sys_statbuff[INT_ERR] = 0;
		return 2;  	
	}
	/*串口接收错误*/
	if(sys_statbuff[MCBSP_ERR] == 1)
	{
		sys_statbuff[MCBSP_ERR] = 0;
		return 0xffff;
	}
	/*数据较验出错*/
	if(sys_statbuff[CH_ERROR] == 1)
	{
		sys_statbuff[CH_ERROR] = 0;
		return 3;
	}
	/*数据未准备好*/
	if(sys_statbuff[RECEIVE_NEW] != 1)
	{
		return 1;
	}
	/*接收完成*/
	else
	{
		sys_statbuff[RECEIVE_NEW] = 0;
	}
	return 0;
}
/***********************************************************************/
/*  函数声明:	接收中断的中断程序                                     */
/***********************************************************************/
void interrupt McbspRevIsr(void)		
{
	if(MCBSP_rrdy(hMcbsp) == 1)
	{  
       RevBuffer[datarevlength] =MCBSP_read16(hMcbsp);
       datarevlength++;
    }
    timeout--;   
}
/***********************************************************************/
/*	函数名:		Timer0Isr() 								    	   */
/*                                                                     */
/* 	功能:		定时5s后打开指示灯D5。只要McBSP出错,不论发送接收,D5亮*/
/***********************************************************************/
interrupt void Timer0Isr(void)
{ 
    GPIODIR |= 0x80;	// config the GPIO7 as output pin 
    GPIODATA |= 0x80;	// 打开指示灯D5
}
/***********************************************************************/
//	函数名:		inti_Com()	
//  功能:      通讯的初始化							    	   		
/***********************************************************************/
inti_Com()
{
  psend=(PmcbspForDec5502)(&mcbspx[0]);
  for(k=0;k<FRAMLENGTH;k++)
	{
		mcbspx[k]=0;
		mcbspr[k]=0;
		RevBuffer[k]=0;
	}
  return;
}   
/***********************************************************************/
//	函数名:		Com_Datareq()	
//  功能:     	要求进行数据发送						    	       	
/***********************************************************************/ 
Com_Datareq(unsigned int sample,Uint16 num_datasend)
{   
      psend=(PmcbspForDec5502)(&mcbspx[0]);   
	  psend->Length=FRAMLENGTH;
      psend->Type=FRAME_CMD;
      psend->Mutul=FRAME_SING;
      psend->Data[0]=DATA_SEND;
      psend->Data[1]=sample;
      psend->Data[2]=num_datasend;
      mcbsp_tx((unsigned int *) psend);
}
/***********************************************************************/
//	函数名:		Com_Checkerr()	
//  功能:     	通知主机程序通讯出错,准备重发						  		
/***********************************************************************/
Com_Checkerr(Uint16 check_err)
{     psend=(PmcbspForDec5502)(&mcbspx[0]);
      psend->Length = FRAMLENGTH;
	  psend->Type = FRAME_CMD;
	  psend->Data[0] = check_err;
	  psend->Mutul = FRAME_SING;
}
/***********************************************************************/
//	函数名:		Com_Datasend()	
//  功能:     	通过判断number是否为0来决定是否把sample的值赋给s,防止
//              进入sample的值不变。
//  参数:      
//             psend:      是指向结构体的指针
//             FRAME_END:  结束帧

⌨️ 快捷键说明

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