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.

[参考译文] TMS320F28386D:TMS320F28386D

Guru**** 2457760 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1296784/tms320f28386d-tms320f28386d

器件型号:TMS320F28386D
主题中讨论的其他器件:C2000WARE

您好!

我一直使用 TI DSP 工作、在配置 SCI 外设时遇到问题。   

我看到的问题是、我要写入的寄存器实际上没有更改。

我已检查 SCI B 外设的时钟是否启用。

将不胜感激。 以下代码:

谢谢!

丹·布雷西亚

void init_SCI(void)
{
    ScibRegs.SCICTL1.bit.SWRESET        = holdReset;

    //Communication Control Register
    ScibRegs.SCICCR.bit.STOPBITS        = oneStopBit;
    ScibRegs.SCICCR.bit.PARITY          = evenParity; //Doesn't matter because it's disabled
    ScibRegs.SCICCR.bit.PARITYENA       = disableParity;
    ScibRegs.SCICCR.bit.LOOPBKENA       = disableLoopBack;
    ScibRegs.SCICCR.bit.ADDRIDLE_MODE   = pointToPointMode;
    ScibRegs.SCICCR.bit.SCICHAR         = eightBitsPerChar;

    //Control Register 1
    ScibRegs.SCICTL1.bit.RXERRINTENA    = disabledRxErrorInterrupt;
    ScibRegs.SCICTL1.bit.TXWAKE         = txSleep; //--DB Understand this bit better
    ScibRegs.SCICTL1.bit.SLEEP          = rxWake;
    ScibRegs.SCICTL1.bit.TXENA          = txDisable;
    ScibRegs.SCICTL1.bit.RXENA          = rxEnable;

    //Baud Rate
    int x = ( (calculateBaudRateClockDivider(desiredBaudRate, lowSpeedPeripheralClockRate) ) & 0xFF00) >> 8;
    ScibRegs.SCIHBAUD.bit.BAUD = x;
    int y =    (calculateBaudRateClockDivider(desiredBaudRate, lowSpeedPeripheralClockRate) ) & 0x00FF;
    ScibRegs.SCILBAUD.bit.BAUD = y;

    //Control Register 2
    ScibRegs.SCICTL2.bit.RXBKINTENA = rxDisableInterrupt;
    ScibRegs.SCICTL2.bit.TXINTENA   = txDisableInterrupt;

    //Tx FIFO Register
    ScibRegs.SCIFFTX.bit.SCIRST         = sciFIFOReset;
    ScibRegs.SCIFFTX.bit.SCIFFENA       = sciFIFODisable;
    ScibRegs.SCIFFTX.bit.TXFIFORESET    = txFIFOReset;
    ScibRegs.SCIFFTX.bit.TXFFIENA       = txFIFOInterruptDisabled;

    //Rx FIFO Register
    ScibRegs.SCIFFRX.bit.RXFIFORESET    = rxFIFORESET;
    ScibRegs.SCIFFRX.bit.RXFFIENA       = rxFIFOInterruptDisabled;

    //Auto-Baud Detection Register
    ScibRegs.SCIFFCT.bit.CDC    = autoBaudDetectAlignmentDisabled;

    //Debug Behaviour Register
    ScibRegs.SCIPRI.bit.FREESOFT = stopOnSuspend;

    ScibRegs.SCICTL1.bit.SWRESET        = releaseReset;
    return;
}

#include "f2838x_device.h"

#ifndef NAI_VPX_SCI_H_
#define NAI_VPX_SCI_H_


//SCI Communication Control Register (SCICCR) Macros
#define oneStopBit          (0x00)
#define evenParity          (0x00)
#define disableParity       (0x00)
#define disableLoopBack     (0x00)
#define pointToPointMode    (0x00)
#define eightBitsPerChar    (0x07)

//SCI Control Register 1 (SCICTL1) Macros
#define disabledRxErrorInterrupt    (0x00)
#define releaseReset                (0x01)
#define holdReset                   (0x00)
#define txSleep                     (0x00)
#define txWake                      (0x01)
#define rxWake                      (0x01)
#define txEnable                    (0x01)
#define txDisable                   (0x00)
#define rxEnable                    (0x01)
#define rxDisable                   (0x00)

//Baud Rate Calculation & Constants
#define lowSpeedPeripheralClockRate (50000000)  //50MHz
#define desiredBaudRate             (115200)    //115.2kHz

#define calculateBaudRateClockDivider(desiredBaud,LSPCLK) (((LSPCLK) / (8 * (desiredBaud))) - 1)

//SCI Control Register 1 (SCICTL1) Macros
#define rxDisableInterrupt  (0x00)
#define txDisableInterrupt  (0x00)

//SCI Tx FIFO Register (SCIFFTX) Macros
#define sciFIFOReset            (0x00)
#define sciFIFODisable          (0x00)
#define txFIFOReset             (0x00)
#define txFIFOInterruptDisabled (0x00)

//SCI Rx FIFO Register (SCIFFRX) Macros
#define rxFIFORESET             (0x00)
#define rxFIFOInterruptDisabled (0x00)

//Auto-Baud Detection Register
#define autoBaudDetectAlignmentDisabled (0x00)

//Debug Behaviour Register
#define stopOnSuspend   (0x00)

//Function Prototypes
void init_SCI(void);
void SCI_Machine(void);

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

    Dan、您好!

    您的代码是否 在写入寄存器之前调用 InitSysCtrl()? 您使用了什么作为代码的起点?

    谢谢。

    德拉尼

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

    尊敬的 Delaney:

    谢谢你的答复。

    我的代码将 InitSysCtrl()调用 为 void main(void)的第一行。  我原始问题中的子例程仅在稍后的 main 执行中调用。

    值得注意的是、我正在将 SCI 功能添加到我的现有工程中、并且我已有其他外设按预期运行、例如 I2C。

    谢谢。

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

    Dan、您好!

    我采用了 sci_ex1_echoback 示例(来自[C2000ware install]/device_support/f2838x/examples/cpu1/sci/)、并使用上面给出的代码替换了 sci_ex1_echoback.c 文件(以及对 InitSysCtrl ()的调用))、但是我无法复制这个问题。 为了确保这一点、您是否在"Register"视图中打开了持续刷新?

    谢谢。
    德拉尼

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

    尊敬的 Delaney:

    再次感谢您的答复。

    我只是再次选中了、但确实进行了持续刷新的切换。

    我尝试了与您描述的相同的实验、将 echoback.c 替换为我的代码、我能够看到 CPU1上的寄存器更新。  当我尝试调试 CPU2时,我在退出  InitSysCtrl() 子例程时遇到问题。 我想、因为示例项目是为 CPU1设计的。

    需要说明的是、我正在尝试从工程中的 CPU2控制 SCI 外设。  是否需要在 CPU1上执行某些操作才能让 CPU2控制 SCI 外设?

    谢谢!

    丹·布雷西亚

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

    Dan、您好!

    是的、为了控制 CPU2上的 SCI 外设、请将这些行添加到在 CPU1上运行的代码中:

    EALLOW;
    DevCfgRegs.CPUSEL5.bit.SCI_B = 1;
    EDIS;

    这会将 SCIB 的所有权转让给 CPU2。 确保在 CPU2上启用 SCI 外设时钟之前执行这些行(在 CPU2上的 InitSysCtrl ()调用中完成)。 请让我知道这是否解决了问题,如果不是,我可以尝试重复在我的最后。

    谢谢。

    德拉尼

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

    尊敬的 Delaney:

    谢谢你这么多,这解决了我的问题!

    此致、

    丹·布雷西亚