📄 my_2000-0618.c
字号:
Length = 0;
CommRecvBuff[Length++] = temp;
}
else if (CommRecvFlg) //如果接收完包头
{
CommRecvBuff[Length++] = temp; //把接收到的值传给接收缓冲器
if(Length == MaxLength) //接收完判断接收数据的几种状态
{ // have receive a frame successfully
if(CommRecvBuff[0] == 0x80) //如果是正常数据
{
Cpld2_cpu_DataFlg = 1; //此位在主程序里允许往 编码器里送数
// P3 ^=0xc0; // ?????
}
if((CommRecvBuff[0] == 0xFF) && (CommRecvBuff[1] == 0x48) && (CommRecvBuff[2] == 0x40))
{
//CmdCmx2000LoopFlg = 1;
CmdCmx2000StartFlg = 1; //声码启动指令
ceshi=0;
}
if((CommRecvBuff[0] == 0xFF) && (CommRecvBuff[1] == 0x48) && (CommRecvBuff[2] == 0x41))
{
CmdCmx2000LoopFlg= 1; //声码自环指令
//CmdCmx2000StartFlg = 1;
}
CommRecvFlg = 0;
//TR1 = 0; // stop timer
Length = 0;
MaxLength = 0;
//CommEnableInterrupt(FALSE); // disable UART1 interrupt
}
}
}
EA=1; //使能中断
}
void init2K(void)
{
rx2KProcess = 0;
tx2kProcess = 3;/*等待缓冲区数据*/
rx2KCnt = 17;/*16个数据位+1个STRB使能位*/
tx2KCnt = 17;/*16个数据位+1个STRB使能位*/
rx2KCntB = 24;
tx2KCntB = 12;
CHAN_S_STRB = 1;/*读写选通无效*/
CHAN_R_STRB = 1;
timer2Init(); //T2初始化
}
void isrTimer2(void) interrupt 5 //和2000读写的函数
{
/*产生2400读写时钟脉冲*/
if(phase == 0)
{
phase = 1;
CHAN_CLK = 1;
}
else
{
phase = 0;
CHAN_CLK = 0;
}
if(phase == 1)/*下降沿采数*/
{
if(encoder_recv==0) //只有把接收到的信息发完才能为0
{
if(rx2KProcess == 0)/*Receive 16bit one by one*/
{/*receive one bit*/
switch(rx2KCnt)
{
case 17:
CHAN_S_STRB = 0;/*给出STRB信号*/
rx2KCnt--;
break;
case 0:
CHAN_S_STRB = 1;/*撤销STRB信号*/
rx2KProcess = 1;/*进入到下一个状态*/
rx2KCntB--;/*已经接收了一个16位*/
rx2KCnt = 17;/*重新赋值*/
break;
default:
{
if(CHAN_TXD == 1)
buffer2k[24 - rx2KCntB]|= 0x0001 << (rx2KCnt - 1); // rx2KCntB初值是24
else
buffer2k[24 - rx2KCntB] &= ~(0x0001 << (rx2KCnt - 1));
rx2KCnt--;
break;
}
}
}
if(rx2KProcess == 1)/*重复接收接下来的23字*/
{
if(rx2KCntB == 23)/*除首次接收外,需要判断第一个16位是不是有效的*/
{
if(pBuffer2kHead != buffer2k[0])
{
rx2KCntB = 24;
rx2KProcess = 0;/*是无效包,继续接收*/
}
}
else
{
/*没接收完一帧?*/
if(rx2KCntB > 0)
{
rx2KProcess = 0;/*进入接收下一个16bit状态*/
}
else
{
/*接收完一个帧,延时20ms,准备接收下一帧*/
rx2KProcess = 2;
/*下次延时20ms*/
}
}
}
if(rx2KProcess == 2)/*延时状态*/
{
// if(++clockCntR == 500)/*计数500次,55K频率,每中断一次时间小于19us,所以1000次中断延时小于20ms*/
rx2KProcess = 0;
encoder_recv=1; //从2000接收完标志位 在发送给CPLD结束后置0
}
}
}
if(phase == 1)/*上升沿给2000送数*/
{
/*tx process*/
if(TX_2000_BIT==0) //只有在接到CPLD的值附给发送2000数据缓冲区里后
{
if(tx2kProcess == 0)/*发送数据 Transmit 16bit one by one*/
{
switch(tx2KCnt)
{
case 17:
CHAN_R_STRB = 0;/*给出STRB信号*/
// sendBuf = *(pBuffer2kTail + 12 + (12 - tx2KCntB));
if(sendBuf[12 - tx2KCntB] & 0x8000)
CHAN_RXD = 1;
else
CHAN_RXD = 0;
sendBuf[12 - tx2KCntB] *= 2;
tx2KCnt--;
break;
case 0:
CHAN_R_STRB = 1;/*撤销STRB信号*/
tx2kProcess = 1;/*进入到下一个状态*/
tx2KCntB--;/*已经发送了一个16位*/
tx2KCnt = 17;/*重新赋值*/
break;
default:
{
if(sendBuf[12 - tx2KCntB] & 0x8000)
CHAN_RXD = 1;
else
CHAN_RXD = 0;
sendBuf[12 - tx2KCntB] *= 2;
tx2KCnt--;
break;
}
}
}
if(tx2kProcess == 1)/*重复发送接下来的11字*/
{
if(tx2KCntB > 0)
{
tx2kProcess = 0;
}
else
{
/*发送完一个帧,延时20ms,准备接收下一帧*/
tx2kProcess = 3;
}
}
if(tx2kProcess == 2)/*延时状态*/
{
//if(++clockCntS == 500)/*计数500次,55K频率,每中断一次时间小于19us,所以1000次中断延时小于20ms*/
tx2kProcess = 3;
TX_2000_BIT=1; //CPU给2000发送结束标志
}
if(tx2kProcess == 3)/*中转状态*/
{
tx2KCntB = 12;
tx2kProcess = 4;/*先发送包头*/
}
/*tx process*/
if(tx2kProcess == 4)/*先发包头 Transmit 16bit one by one*/
{
switch(tx2KCnt)
{
case 17:
CHAN_R_STRB = 0;/*给出STRB信号*/
if(PreLoad2k[12 - tx2KCntB] & 0x8000)
CHAN_RXD = 1;
else
CHAN_RXD = 0;
PreLoad2k[12 - tx2KCntB] *= 2;
tx2KCnt--;
break;
case 0:
CHAN_R_STRB = 1;/*撤销STRB信号*/
tx2kProcess = 5;/*进入到下一个状态*/
tx2KCntB--;/*已经发送了一个16位*/
tx2KCnt = 17;/*重新赋值*/
break;
default:
{
if(PreLoad2k[12 - tx2KCntB] & 0x8000)
CHAN_RXD = 1;
else
CHAN_RXD = 0;
PreLoad2k[12 - tx2KCntB] *= 2;
tx2KCnt--;
break;
}
}
}
if(tx2kProcess == 5)
{
if(tx2KCntB > 0)
{
tx2kProcess = 4;/*重复发送接下来的11个字的包头*/
}
else
{
/*包头发送完毕,开始发送数据*/
tx2kProcess = 0;
tx2KCntB = 12;
}
}
}
}
TF2H = 0;// Reset Interrupt
}
void codecConf()
{
#pragma asm
MOV R6,#02H
MOV R7,#53H
ACALL TLV320CONFIG;
MOV R6,#04H
MOV R7,#08H
ACALL TLV320CONFIG;
MOV R6,#06H
MOV R7,#01H
ACALL TLV320CONFIG;
MOV R6,#08H
MOV R7,#0e9H
ACALL TLV320CONFIG;
#pragma endasm
#pragma asm
TLV320CONFIG: MOV A,R6
MOV R5,#8
MOV R4,#8
_TLV320CONFIG_WRITE_H: RLC A
JNB CODEC_SCLK,$
MOV CODEC_DCSI,C
JB CODEC_SCLK,$
DJNZ R5,_TLV320CONFIG_WRITE_H
MOV A,R7
_TLV320CONFIG_WRITE_L: RLC A
JNB CODEC_SCLK,$
MOV CODEC_DCSI,C
JB CODEC_SCLK,$
DJNZ R4,_TLV320CONFIG_WRITE_L
JNB CODEC_SCLK,$
SETB CODEC_DCSI
JB CODEC_SCLK,$
JNB CODEC_SCLK,$
JB CODEC_SCLK,$
JNB CODEC_SCLK,$
JB CODEC_SCLK,$
JNB CODEC_SCLK,$
JB CODEC_SCLK,$
JNB CODEC_SCLK,$
JB CODEC_SCLK,$
JNB CODEC_SCLK,$
JB CODEC_SCLK,$
RET
#pragma endasm
}
main()
{
CODEC_DCSI = 1; //给C10 写指令用
ceshi=1; //测试用
/*初始化*/
pca0Init();/*关看门狗*/
PORT_Init();/*初始化端口*/
OSCILLATOR_Init();/*切换到外部晶体*/
Interrupts_Init();
// clkmulInit();
Timer_Init(); //T1初始
/*10&2K初始化*/
SLEEP_2K = 0; //置高激活 为休眠状态
RST_2K = 0;
delay();
RST_2K = 1;
delay();
codecConf(); //配置CODEC-DCSI CODEC-SCLK
UART_Init(); //串口初始化
LINK_INTP = 0;//在主程序里要处理
KEY_RESET=1;//在主程序里要处理
InitComm(); // 和CPLD通信端口初始化
init2K(); //初始化和2000通信的函数的各项参数值 和 T2的初始值
rxRecFirst(); //检测ERF 并打开TR2
while(1)
{
CommRecvData(); //置接收标志位 CommRecvingFlg=1 接受有效 主要是把 Length请零
if(CmdCmx2000StartFlg )//果CPLD传给CPU数据FF 48 40 启动码
{
if(Cpld2_cpu_DataFlg) //如果在接收完CPLD传给CPU的数据 接收完包 0X80 的以后所有数此位为1
{
if(TX_2000_BIT) // 往2000传送结束才会为1
{
unsigned char i;
sendBuf[0]=(unsigned int)CommRecvBuff[0]<<8+(unsigned int)CommRecvBuff[1];
sendBuf[1]=(unsigned int)CommRecvBuff[2]<<8+(unsigned int)CommRecvBuff[3];
sendBuf[2]=(unsigned int)CommRecvBuff[4]<<8+(unsigned int)CommRecvBuff[5];
sendBuf[3]=(unsigned int)CommRecvBuff[6]<<8+(unsigned int)CommRecvBuff[7];
sendBuf[4]=(unsigned int)CommRecvBuff[8]<<8+0x0000;
for(i=0;i<8;i++)
{
sendBuf[4+i]=0x0000;
}
EA=0;
Cpld2_cpu_DataFlg = 0;
EA=1;
TX_2000_BIT=0; //CPU可以传递给2000
}
}
}
if(encoder_recv) //CPU从2000接收完
{
if(!CmdCmx2000LoopFlg) //如果2000不是循环 使用状态
{
CommSend2Cpld2(); //是CPU发给CPLD数据的函数 CPU给CPLD发送数据完 encoder_recv = 0
}
else //自环 调试用
{
unsigned char i;
if(TX_2000_BIT) // 往2000传送结束才会为1
{
for(i = 0; i < 12; i++)
{
sendBuf[i]=buffer2k[11+i];
}
TX_2000_BIT=0;
}
encoder_recv = 0; //这时CPU才能接2000的数据
}
}
if(!KEY_RESET)
{
timer1_counter = 4; //10ms x 1 = 10ms delay to debounce
timer1_expired = 0;
TR1 = 1;
while(!timer1_expired);
timer1_expired = 0;
if(!KEY_RESET); // soft reset
RSTSRC = 0x10; //产生一次系统复位
}
if(LINK_INTP)
{
timer1_counter = 4; //10ms x 1 = 10ms delay to debounce
timer1_expired = 0;
TR1 = 1;
while(!timer1_expired);
timer1_expired = 0;
if(LINK_INTP)
{
RST_2K = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -