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.

LAUNCHXL-F28379D: SCI

Part Number: LAUNCHXL-F28379D

项目是通过sci控制pwm,烧录成功后能脱机运行,现想将串口通信方式从usb改为usb转rs232方式连接GPIO8和GPIO9,烧录成功后通讯未能成功。

项目中代码只将

GPIO_SetupPinMux(42, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(42, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(43, GPIO_MUX_CPU1, 15);
GPIO_SetupPinOptions(43, GPIO_INPUT, GPIO_ASYNC);

改成了

GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);

RS232自检过没有问题,请问为什么行不通呢?

  • 你好,如果使用原来的代码,也就是GPIO42与43,用usb转rs232是可以行通的吗?

  • 42和43是在miniusb里的,没有外部针脚,然后还有个问题是烧录成功后上电不能运行全部代码,但是按了reset后又可以全部运行了,这是为什么?

  • 我在英文论坛上询问看看是否有人知道。

  • 好的,谢谢,得到结果后请联系我,谢谢

  • 你好, 

    RS232自检过没有问题

    您是如何自检的?是不是通过CCS查看SCI相关寄存器看数据是否成功接收等等。

    然后还有个问题是烧录成功后上电不能运行全部代码

    您是如何知道这一点的?代码在哪里停止了? 您是如何烧录程序的?

  • 你好,部分代码见此,烧录上电后只跑到 for循环的if语句之外,也就是进不去if语句。

    烧录是将2837xD_RAM_lnk_cpu1.cmd改成了2837xD_FLASH_lnk_cpu1.cmd 然后选择CPU1-FLASH,之后debug自动烧录成功.上电powrupreset成功后代码运行正常。

    #include "F28x_Project.h"
    //Funktionen Initialisieren
    interrupt void SCI_B_SR(void);
    void SciGpioInitial (void);
    void SciInterruptInitial(void);
    void SciInitial(void);
    void SciWrite(Uint16 a);
    void LaunchxlRun(Uint16 a);
    void LEDkontroller(Uint16 DutyR,Uint16 DutyG,Uint16 DutyB,Uint16 Frequenz);
    void LEDfade(Uint16 R,Uint16 G,Uint16 B,Uint16 Geschwindigkeit);
    void fade(int R,int G,int B,Uint16 Geschwindigkeit);
    void Maschinefehler(Uint16 Fehlernummer,Uint16 Fehlerstatus);
    void Aus();
    void delay();
    Uint16 com[5];
    int i=0;
    int j=0;

    void main(void)
    {
    //System einstellen, Interrupt enable, das muss man in Main-Funktion schreiben.
    InitSysCtrl();
    InitGpio();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    SciInitial();
    EINT;
    for(;;)
    {
    if(i==5)
    {
    LaunchxlRun(com[j]);
    }
    }//ewig Laufendes Programm

    }

    interrupt void SCI_A_SR(void)//gleich wie Interrupt SCIA_RX_INT
    {
    if(i>=5)
    {
    i=0;
    }
    Uint16 ReceivedChar = SciaRegs.SCIRXBUF.all;
    com[i]=ReceivedChar;//jedesmal 8 bits 00-ff in com speichern.
    SciWrite(com[i]);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    i++;
    }
    void SciGpioInitial(void)
    {
    //USB DEBUG
    GPIO_SetupPinMux(42, GPIO_MUX_CPU1, 15);
    GPIO_SetupPinOptions(42, GPIO_OUTPUT, GPIO_PUSHPULL);
    GPIO_SetupPinMux(43, GPIO_MUX_CPU1, 15);
    GPIO_SetupPinOptions(43, GPIO_INPUT, GPIO_ASYNC);

    /* //GPIO8->SCITXDA output
    GPIO_SetupPinMux(8, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(8, GPIO_OUTPUT, GPIO_PUSHPULL);
    //GPIO9->SCIRXDA input
    GPIO_SetupPinMux(9, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC);*/
    }
    void SciInterruptInitial(void)
    {
    //Interrupt benutzten:
    SciaRegs.SCICTL2.bit.RXBKINTENA = 1;


    EALLOW;
    PieVectTable.SCIA_RX_INT = &SCI_A_SR;
    //Interruptfunktion SCIA_RX_INT als was ich gewuecht habe wechseln.
    EDIS;//Setzt EALLOW wieder null.
    IER |= PIEACK_GROUP9;//laut Pie Channel Mapping soll Intterupt Gruppe 9 aktiv sein.
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//PIE enable,PIE Innere Interruptgruppe.
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//SCIB_RX Interrupt enable
    }
    void SciInitial(void)//Baurate, Stopbits und Parity von Serieller Kommunikation einstellen
    {
    SciGpioInitial();
    SciInterruptInitial();
    SciaRegs.SCICTL1.all = 0x0003;
    //SciaRegs.SCICCR.bit.STOPBITS = 0; //0:ein Stopbit;1:zwei Stopbits.
    //SciaRegs.SCICCR.bit.PARITYENA = 0;//Kein Parity noetig
    //SciaRegs.SCICCR.bit.SCICHAR = 0x7;//0x0-0x7 zeigt,dass es in jedem Paket 8 Bit gibt.
    //die 3 sind gleich wie:
    SciaRegs.SCICCR.all = 0x0007;

    SciaRegs.SCIHBAUD.all = 0x0000;
    SciaRegs.SCILBAUD.all = 0x0036;//Bautrate als 115200 einstellen

    SciaRegs.SCICTL1.all = 0x0023;
    //RXENA,TXENA,SWRESET enable
    }
    void SciWrite(Uint16 a)
    {
    while (SciaRegs.SCICTL2.bit.TXRDY != 1) {}// wenn TX nicht ready ist, do nothing.
    SciaRegs.SCITXBUF.all =a;
    }

  • 好的,我跟进给那边。

  • 你好,这可能与你代码放置的位置有关,如果您将代码烧录进flash,那么当设备启动时,它需要“从flash执行”,所以我认为会在reset设备后有效。

  • 我没太理解您说的是什么意思?目前这段代码有两个问题,第一就是将Gpio42和43换成8和9就无法实现sci.通信,第二是烧录进flash后重新上电必须按reset后才能运行。

  • 您好,我刚刚尝试了一下在ram里debug,发现i的初始值为3,也就是说一开始SCIRX的中断就触发了三次

  • 第一就是将Gpio42和43换成8和9就无法实现sci.通信

    如果您发送某些内容、您会在 SCI 寄存器/引脚(使用示波器)中看到它吗? 

    第二是烧录进flash后重新上电必须按reset后才能运行。

    烧录后代码停在哪了?你可以在CCS中暂停程序的执行并检查程序计数器吗?您可以通过将‘PC’添加到expression窗口来执行此操作。之后、您可以检查此地址在 cmd 文件内被定义的位置。

    我刚刚尝试了一下在ram里debug,发现i的初始值为3,也就是说一开始SCIRX的中断就触发了三次

    已反馈给工程师。

  • 我刚刚尝试了一下在ram里debug,发现i的初始值为3,也就是说一开始SCIRX的中断就触发了三次

    你期望看到的是什么?中断触发说明数据被接收。