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