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);
}
//
//文件结尾
//