This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: SCI通讯

Part Number: TMS320F28335

应用SCI的A组通讯,做一个简单的收发控制,作为从机,将接受到的数据通过一个数组原路返回给上位机(ComMonitor)。将发送任务函数放入到定时器0中,设置定时器周期为10ms,可以正常收发信息,接受和发送的数据一致,但是将定时器设置为1ms,返回和发送信息完全不一样。SCI的时钟频率为默认的LSPCLK设置。这个问题是和定时器周期有关吗?

  • 你好,发送任务函数中,您是如何实现发送任务的?也是通过SCI吗?方便提供函数代码吗?

  • 只是进行数据赋值,把接受的数据放到一个数组里边,然后再把这个数组里的数据给到发送寄存器。也是通过SCI进行的。

    发送代码如下

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void scitx_a(void)
    {
    int i = 0;
    for(i=0;i<RXD_iSciA;i++)
    {
    SciaRegs.SCITXBUF = tdata[i];
    while(0==SciaRegs.SCICTL2.bit.TXEMPTY); //TEXMPTY :0 SCITXBUF or TXSHF contain data
    }
    RXD_iSciA = 0;
    SCIA_TX_L; //
    SCIA_RX_H;
    }
    void SCI_work(void)
    {
    int i = 0;
    for(i=0;i<RXD_iSciA;i++)
    {
    tdata[i]=rdata[i];
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这个是在Timer0中运行的

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    interrupt void TIM0_IRQn(void)
    {
    LED_work(&LED_count);
    SCI_work();
    scitx_a();
    // SCIA_RX_H;
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 你还试过别的周期吗?只有10ms能够正常收发?

  • 你好,尝试过5ms和50ms也可以收发,但是会经常报错误,看错误标志位提示是停止位丢失。1ms的也会有这个错误,而且更奇怪的是1ms的时候接受和发送的数据不一致(基本都不对),在5ms的时候是偶尔不对。

  • 还想请问一下,通过SWRESET复位错误标志位,是否对会后续通讯有影响。

  • 好的,我咨询资深工程师后回复您。

  • 好的,很感谢您

  • 尝试过5ms和50ms也可以收发,但是会经常报错误,看错误标志位提示是停止位丢失。1ms的也会有这个错误,而且更奇怪的是1ms的时候接受和发送的数据不一致(基本都不对),在5ms的时候是偶尔不对。

    你好,传输所需数据需要多少时间?您计时器ISR中没有类似配置,是将其放在了普通函数流程中吗?您应该试试将其放在Timer ISR中。

  • 你好,传输数据具体时间没有计算,但是很短。具体配置为波特率为19200,上位机发送的数据为12 34 56,发送周期为300ms;28335这边发送数据的函数是放在Timer0里边的,周期为分别设置过1ms,5ms,10ms,50ms,5ms以上收发数据基本一致,只是偶尔会出现停止位丢失(通过寄存器的标志位看到的),1ms的收发数据不一致。上面回答中有收发数据的配置。以下为Timer0的配置。  

    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQn;        //Timer0
    EDIS;

    interrupt void TIM0_IRQn(void)
    {

    LED_work(&LED_count);
    SCI_work();
    scitx_a();                         //数据发送
    // SCIA_RX_H;
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;

    }

    ConfigCpuTimer(&CpuTimer0,150,1000);     //1ms

  • 好的,我已向相关工程师跟进。

  • 好的,谢谢,期待您的消息

  • 感谢您提供更多信息。 不使用定时器时是否偶尔会丢失停止位、或者仅在使用定时器时才会丢失停止位? 

  • 还没尝试过不用定时器,我后边尝试一下再回复

  • 好的,期待您的回复。

  • 你好,试过不用定时器也会有问题。那个提示停止位丢失导致不能进入中断,通过复位已经解决了。现在的问题是如果单独接受一个字节的数据没有问题,例如数据01,但是当接受多个字节的数据时,就会导致接受的数据有错误,例如主机发送的数据为01 00 02,有时候从机接受的数据就变为其他数据了。

  • 已向资深工程师咨询。但由于节假日,工程师那边回复会有延迟。我一旦得到回复会立即回复您。谢谢您的耐心。

  • 抱歉工程师由于节假日,将延期给您的回复。(大概要等到1月4号) 

  • 非常高兴停止位的问题解决了。

    但是当接受多个字节的数据时,就会导致接受的数据有错误

    你可以描述一下当多个字节数据被接收时错误是什么吗?

    你可以试试添加两个停止位而不是一个吗?