OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » TMS320LF2407,PC 请教:TMS320LF2407与PC机串行通讯的

共2条 1/1 1 跳转至

TMS320LF2407,PC 请教:TMS320LF2407与PC机串行通讯的问题。

院士
2006-12-22 22:43:00    评分
TMS320LF2407,PC 请教:TMS320LF2407与PC机串行通讯的问题。



关键词: TMS320LF2407     请教     串行     通讯     问题    

院士
2006-12-22 22:43:00    评分
2楼
问 我利用2407的SCI模块与PC机进行串行通讯,DSP外围使用MAX232芯片,上位机程序使用VB编写。问题是:如果先启动PC并打开上位机的通讯程序,然后再给DSP上电运行,这时一切正常,DSP能够正确收到PC的数据;但是,如果先给DSP上电运行,后打开电脑,再运行上位机程序,那么DSP就收不到PC机发来的数据。就是说,跟上电顺序有关系,为什么会出现这个情况?请高手不吝赐教。
下面是DSP的中断子程序:
void SCI_REC()                                 
{
    *(rxpoint+n)=SCIRXBUF;                           
    
    //缓冲区为0字节时,收到该起始字符,则开始接收。
    //收到的不是起始字符,总是拒绝接收。
    if(*(rxpoint) != 0xAA) //0xAA是起始字符
    {
        n = 0;
    }
    else
    {
        n++;
    }
    
    if(n > 10)    //协议中每帧不超过10个字符;
    {
        n = 0;
    }
    IFR = IFR|0X0010;  //清除IFR中相应的中断标志
    T2INTcounter=10;
    enable();          //开总中断因为一进入中断服务程序总中断就自动关闭
} 1: 朋友,能把你的主程序传给我么?朋友,能把你的主程序传给我么?我也在做2407和上位机的通信程序
e-mail:songym525@sina.com 2: 应该是程序的问题DSP先上电,在pc上电的时候,一般都会有扰动,这样DSP就会收到错误的字节,如果没有合适的处理,后面帧的接收都会错位,你看看是不是这样 3: re:但是我在中断程序中已经设置了
//收到的不是起始字符,总是拒绝接收。
    if(*(rxpoint) != 0xAA) //0xAA是起始字符
    {
        n = 0;
    }
    else
    {
        n++;
    }
如果开始时有抖动的话,也是拒绝接收这些错误的直接。知道PC机发来起始字符才开始接收并保存的。 4: 建议改进调试方法,开个buffer,然后把开机到开始正常通讯的所有数据都保存下来,分析分析再分析:),应该来说,软件的问题应该比较大,因为我也调试过这样的程序。再说,你第一贴,写的是收不到,那你这个拒收的程序处完全可以设置断点来调试的啊:) 5: 呵呵我不是这样写的
能收到 PC 过来的数据

但是 DSP 发不去?
请问你的 能发出来么?

就是DSPPC 反数据
的程序 能发个给我么?

lanvst@hotmail.com
void SCI_REC()                                 
{
    receive[i++]= * SCIRXBUF;                           
    
    if(i>9) i=0 return;    
   
    IFR = 0X0010;  //清除IFR中相应的中断标志
    
    enable();          //开总中断因为一进入中断服务程序总中断就自动关闭
}

接收这么写的      数组 和 I 声明为全局变量 ,内部的声明 接受不全
呵呵  
   6: hi我认为是你电脑的程序有问题,你可以用电脑和电脑连一下试试,用你的程序给别的串口调试软件发数据,看能不能收到. 7: 不太明白你的意思,不过我得这样写的,2812的程序接收中断isr
interrupt void ScibRx(void)
{        
    Uint16 tmp;
    
    PieCtrl.PIEACK.bit.ACK9 = 1;         // clear responding acknowledge bit    
    tmp = ScibRegs.SCIRXBUF.bit.RXDT;
}
发送程序
ScibRegs.SCITXBUF = ACK;          
while(0 == ScibRegs.SCICTL2.bit.TXRDY) {
}
8: 程序这样写是比较可靠的interrupt void ScibRx(void)
{        
    Uint16 tmp;
    
    PieCtrl.PIEACK.bit.ACK9 = 1;         // clear responding acknowledge bit    
    tmp = ScibRegs.SCIRXBUF.bit.RXDT;
}
发送程序
{
ScibRegs.SCITXBUF = ACK;          
while(0 == ScibRegs.SCICTL2.bit.TXRDY) {
}

=============
怀疑问题处在时序上。注意收发双方的时序。 9: rePC机开关机对串口是有影响的,我以前碰到过PC机关机把我设计的目标板搞死的现象,后来证明是我目标板软件设计有bug 10: 2407上电或复位时先清几次接收缓冲区 11: 一点也读不出信息,还是读出的有误?偶遇到过类似的问题!

不知是从2407一点也读不出信息,还是读出的有误??

如果是读出的数值有误,可能是上电时给buffer中写了一些错误信息造成的,

如果一点信息也读不出来,可以先把2407屏蔽了,让RxD和TxD直接相连,查看一下上电顺序有无影响,缩小故障范围,然后再解决! 12: re注意一点:当SCI模块发生接收错误中断时程序也会进入中断服务子程序。
所以,你应该在你程序的开始就判断是否有接受错误标志,如果是就应该复位SCI模块,然后再接收。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]