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.

[参考译文] TMS320F28377D:两个77D 微控制器之间的 SCI 通信

Guru**** 2547860 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/627367/tms320f28377d-sci-communication-between-two-77d-microcontrollers

器件型号:TMS320F28377D

大家好、

我正在使用两个77D 微控制器、并尝试使用 SCI 外设传输数据。  我已经在回送中进行了测试、它们看起来工作正常、但当我尝试让它们相互通信时、它们似乎多次对每个字符进行采样。 我正在使用中断发送和接收、以及空闲线模式。

示例:77D#1使用中断发送'r'和'q'...77D#2接收多个 r 和多个 q……77D#2通过发送'0x0095'、'0x0086'、'0x0064'和'0x0031'...77D#1接收诸如'0x00C5'、0x00C5'、'0x00C5'、'0x00C5'和'0x00C5'等扰频数据

我已关闭回送并检查波特率是否相同。

是否有人对为什么会发生这种情况有任何建议?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

       我不知道会导致器件发送重复消息的与模块本身或硬件相关的任何内容。 我希望这与应用程序代码相关。

    1. 您是否连接了器件之间的接地端?
    2. 您是否看到任何 RX 错误?

    此致、

    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1.是的、两个器件都接地。

    没有、我没有收到任何 RX 错误、我已经注意到...在从 RX 中断中的缓冲区获取数据之前、我进行了检查。

    这是 sci_init 和 ISR

    //
    // sciaTxFifoIsr - SCIA 发送 FIFO ISR
    //
    中断空 sciaTxFifoIsr (空)

    unsigned int i = 0;

    for (;i<4;i++)

    SciaRegs.SCITXBUF.all=ADCDATACu i];//发送数据

    TXRDY_FLAG = 0;

    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;// PIE 组9、INT1 - RX INT

    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
    // SciaRegs.SCICTL2.bit.TXINTENA=0;//禁用 TX 中断
    PieCtrlRegs.PIEIER9.bit.INTx2 = 0;// PIE 组9、int2
    PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK

    //
    // sciaRxFifoIsr - SCIA 接收 FIFO ISR
    //
    中断空 sciaRxFifoIsr (空)

    unsigned int i = 0;
    static unsigned int cnt = 0;


    if (SciaRegs.SCIRXBUF.bit.SCIFFFE || SciaRegs.SCIRXBUF.bit.SCIFFPE)

    //此处的错误处理
    I = 6;//要绕过帧读取,也在此处放置一个断点以进行调试

    for (;i<2;i++)

    rdataA[i]= SciaRegs.SCIRXBUF.bit.SAR;//读取整个帧-尝试将其更改为示例方法

    RXCV_FLAG = 1;//设置标志来指示帧就绪
    CNT++;

    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志

    PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK

    //
    // scia_fifo_init -配置 SCIA FIFO
    //
    void scia_fifo_init()

    SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
    //无奇偶校验,8个字符位,
    //异步模式,空闲线协议
    SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
    //禁用 RX ERR、睡眠、TXWAKE
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCIHBAUD.ALL = 0x0000;
    SciaRegs.SCILBAUD.ALL = SCI_PRD;
    SciaRegs.SCIFFTX.ALL = 0xC022;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;//rst fifo
    SciaRegs.SCIFFRX.ALL = 0x0021;
    SciaRegs.SCIFFRX.bit.RXFFIL = 1;
    SciaRegs.SCIFFCT.all = 0x00;

    SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI
    SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;

    //
    //文件结束
    //

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    您如何验证波特率? 一些好方法是:

    • 检查 XCLKOUT
    • 在运行时读取波特寄存器
    • 使用示波器测量位时间

    您能否使用示波  器观察每个器件的 Tx、通过查看此输出、您应该能够确定问题是在 Tx 侧还是 Rx 侧。

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我会尝试一下。

    我在查看 SCI 外设的文档、在空闲线部分、它指的是 CPU 器件地址、您能告诉我如何查找77D 的地址吗?  

    我想知道、如果问题是我没有在第一个字节中提供地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    您所指的只是 SCI 模块的多处理器模式。

     您是否计划使用点对点通信或多处理器 通信?

    此致、
    Cody