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.

[参考译文] TMS320F28388S:UART SCI 中断

Guru**** 2465220 points
Other Parts Discussed in Thread: TMS320F28388S, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1495939/tms320f28388s-uart-sci-interrupt

器件型号:TMS320F28388S
Thread 中讨论的其他器件: C2000WARE

工具与软件:

您好!

   我正在研究 SCI-UART (TMS320F28388S)。

  取了 devicelib 中的 sci_ex2_loopback_interrupts 示例、该示例刚刚注释的 loopback 函数  

  但无法获得输出是什么问题  

  我附上了供参考的代码  

  

//
//包含的文件
//
#include "driverlib.h"
#include "device.h"

//
// Globals (全局变量)
//

//
//为 SCI-A 发送数据
//
uint16_t sDataA[2];

//
//已接收的 SCI-A 数据
//
uint16_t rDataA[2];

//
//用于检查接收到的数据
//
uint16_t rDataPointA;

//
//函数原型
//
_interrupt void sciaTXFIFOISR (void);
_interrupt void sciaRXFIFOISR (void);
void initSCIAFIFO (void);
void 错误(void);

//
// Main (主菜单)
//
void main (void)

uint16_t i;

//
//初始化器件时钟和外设
//
device_init();

//
//通过禁用引脚锁定和启用上拉来设置 GPIO
//
device_initGPIO();

//
// GPIO28是 SCI Rx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCIRXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCIRXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_QUAL_ASYNC);

//
// GPIO29是 SCI Tx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCITXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCITXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCITXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_QUAL_ASYNC);

//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
Interrupt_initModule();

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
INTERRUPT_REGISTER (INT_SCIA_RX、sciaRXFIFOISR);
INTERRUPT_REGISTER (INT_SCIA_TX、sciaTXFIFOISR);

//
//初始化设备外设:
//
initSCIAFIFO();

//
//初始化发送数据。 数据的时间间隔
//将更新下一次传输
//
for (I = 0;I < 2;I++)

sDataA[i]= i;
}

rDataPointA = sDataA[0];

INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);

// Interrupt_enableInPieCtrl (9);// PIE 组9控制 SCI 中断(RX、TX)

interrupt_clearACKGroup (interrupt_ACK_group9);

//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

//
//空闲循环。 只需永远坐下来循环(可选):
//
for (;;);
}

//
// error -出错时停止调试器的函数
//
void 错误(void)

GPIO_writePin (31、1);//打开 GPIO31上的 LED 以进行调试(可选)
asm (" ESTOP0");//测试失败!! 停下来!
(;;);
}

//
// sciaTXFIFOISR - SCIA 发送 FIFO ISR
//
_interrupt void sciaTXFIFOISR (void)

uint16_t i;

//在写入之前确保 TX FIFO 不是满的
while (SCI_getTxFIFOStatus (SCIA_BASE)=SCI_FIFO_TX16);


SCI_writeCharArray (SCIA_BASE、sDataA、2);

//
//为下一个周期递增发送数据
//
for (I = 0;I < 2;I++)

sDataA[i]=(sDataA[i]+ 1)和0x00FF;
}

SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);

//
//发出 PIE ACK
//
interrupt_clearACKGroup (interrupt_ACK_group9);
}

//
// sciaRXFIFOISR - SCIA 接收 FIFO ISR
//
_interrupt void sciaRXFIFOISR (void)

uint16_t i;

SCI_readCharArray (SCIA_BASE、rDataA、2);

//
//检查接收到的数据
//
for (I = 0;I < 2;I++)

if (rDataA[i]!=(rDataPointA + I)& 0x00FF)

error();
}
}

rDataPointA =(rDataPointA + 1)& 0x00FF;

如果(SCI_getOverflowStatus (SCIA_BASE))

SCI_clearOverflowStatus (SCIA_BASE);
}

SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_RXFF);

//
//发出 PIE ack
//
interrupt_clearACKGroup (interrupt_ACK_group9);
}

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

//
// 8个字符位、1个停止位、无奇偶校验。 波特率为9600。

//uint16_t sysClockFreq = SYSCTL_getClock (DEVICE_OSCSRC_FREQ);
SCI_performSoftwareReset (SCIA_BASE);

SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |)
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule (SCIA_BASE);
// SCI_enableLoopback (SCIA_BASE);
SCI_resetChannels (SCIA_BASE);
SCI_enableFIFO (SCIA_BASE);

//
// RX 和 TX FIFO 中断已启用
//
SCI_enableInterrupt (SCIA_BASE、(SCI_INT_RXFF | SCI_INT_TXFF));
SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);

//
//当 FIFO 处于状态时、发送 FIFO 会产生中断
//位小于或等于16个字中的2个
//接收 FIFO 会在 FIFO 处于状态时产生中断
//位大于16个字中的2个
//
SCI_setFIFOInterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX2);
//SCI_performSoftwareReset (SCIA_BASE);

SCI_resetTxFIFO (SCIA_BASE);
SCI_resetRxFIFO (SCIA_BASE);
}

//
//文件结尾
//

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

    TX 运行正常、但 RX 不工作  

    请检查随附的代码  

    #include "driverlib.h"
    #include "device.h"

    // Globals (全局变量)
    char txString[50];//发送缓冲区
    volatile uint16_t txIndex = 0;//发送索引

    char receivedData[50];//接收到的消息的缓冲区
    char rxBuffer[50];//用于接收的数据的缓冲区
    volatile uint16_t rxIndex = 0;//接收索引

    //函数原型
    _interrupt void sciaTXFIFOISR (void);
    _interrupt void sciaRXFIFOISR (void);
    void initSCIAFIFO (void);
    void sendString (const char *str);
    bool receiveString (char *buffer、uint16_t buffersize);
    void printToSCI (const char *str);

    // Main (主菜单)
    void main (void)

    device_init();
    device_initGPIO();

    GPIO_setControllerCore (DEVICE_GPIO_PIN_SCIRXDA、GPIO_CORE_CPU1);
    GPIO_setPinConfig (DEVICE_GPIO_CFG_SCIRXDA);
    GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_DIR_MODE_IN);
    GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_QUAL_ASYNC);

    GPIO_setControllerCore (DEVICE_GPIO_PIN_SCITXDA、GPIO_CORE_CPU1);
    GPIO_setPinConfig (DEVICE_GPIO_CFG_SCITXDA);
    GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (DEVICE_GPIO_PIN_SCITXDA、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_QUAL_ASYNC);

    Interrupt_initModule();
    interrupt_initVectorTable();

    INTERRUPT_REGISTER (INT_SCIA_RX、sciaRXFIFOISR);
    INTERRUPT_REGISTER (INT_SCIA_TX、sciaTXFIFOISR);

    initSCIAFIFO();

    INTERRUPT_ENABLE (INT_SCIA_RX);
    INTERRUPT_ENABLE (INT_SCIA_TX);
    interrupt_enablePIE();
    interrupt_clearACKGroup (interrupt_ACK_group9);

    EINT;
    ERTM;

    while (1)

    if (receiveString (receivedData、sizeof (receivedData))

    sendString (receivedData);//回显收到的消息
    //printf ("recented data\n");

    }
    //sendString ("欢迎");
    }
    }

    void sendString (const char *str)

    strncpy (txString、str、sizeof (txString)- 1);
    txString[sizeof (txString)- 1]='\0';//确保空终止
    txIndex = 0;
    SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXFF);
    }

    bool receiveString (char * buffer、uint16_t buffersize)

    if (rxBuffer[0]!='\0')

    strncpy (buffer、rxBuffer、buffersize - 1);
    Buffer[bufferSize - 1]='\0';
    memset (rxBuffer、0、sizeof (rxBuffer));
    printToSCI ("received:");
    printToSCI (缓冲器);
    printToSCI ("\n");
    返回 true;
    }
    返回 false;
    }

    _interrupt void sciaTXFIFOISR (void)

    if (txString[txIndex]!='\0')

    SCI_writeCharBlockingNonFIFO (SCIA_BASE、txString[txIndex]);
    txIndex++;
    }
    设计

    txIndex = 0;
    SCI_disableInterrupt (SCIA_BASE、SCI_INT_TXFF);
    }
    SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
    interrupt_clearACKGroup (interrupt_ACK_group9);
    }

    _interrupt void sciaRXFIFOISR (void)

    printf ("data is coming");
    char receivedChar = SCI_readCharBlockingNonFIFO (SCIA_BASE);

    if (rxIndex < sizeof (rxBuffer)- 1)

    rxBuffer[rxIndex++]= receivedChar;
    if (receivedChar =='\n"|| receivedChar =='\r')

    rxBuffer[rxIndex]='\0';
    rxIndex = 0;
    }
    }
    设计

    rxIndex = 0;
    memset (rxBuffer、0、sizeof (rxBuffer));
    }

    如果(SCI_getOverflowStatus (SCIA_BASE))

    SCI_clearOverflowStatus (SCIA_BASE);
    }
    SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_RXFF);
    interrupt_clearACKGroup (interrupt_ACK_group9);
    }

    void initSCIAFIFO()

    SCI_performSoftwareReset (SCIA_BASE);

    SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、
    (SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE);

    SCI_enableModule (SCIA_BASE);
    SCI_resetChannels (SCIA_BASE);
    SCI_enableFIFO (SCIA_BASE);

    SCI_enableInterrupt (SCIA_BASE、(SCI_INT_RXFF | SCI_INT_TXFF));
    SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);

    SCI_setFIFOInterruptLevel (SCIA_BASE、SCI_FIFO_TX1、SCI_FIFO_RX1);

    SCI_resetTxFIFO (SCIA_BASE);
    SCI_resetRxFIFO (SCIA_BASE);
    }

    void printToSCI (const char *str)

    while (* str!='\0')

    SCI_writeCharBlockingNonFIFO (SCIA_BASE、* str++);
    }
    }

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

    尊敬的 Tejashri:

    请测试 C2000ware 的独立(未更改)示例、并确保它适合您。 这将确认您的硬件设置正确。  

    此致、

    Delaney

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

    Helllo,

      您能告诉我我需要采用哪一个示例名称来分享我吗  

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

    尊敬的 Tejashri:

    我建议从 C2000ware 路径中的 sci_ex3_echoback 示例开始:[C2000ware install]\driverlib\f2838x\examples\c28x\sci。 此示例将通过与 PC 上的 COM 端口通信来帮助您验证硬件设置。 您可能唯一需要修改的是根据您的特定板修改的 GPIO 配置。 您使用的是 LaunchPad 还是 controlCARD?

    此致、

    Delaney