// Included Files
//
#include "driverlib.h"
#include "device.h"
//
// Globals
//
//
// Send data for SCI-A
//
uint16_t sDataA[2];
//
// Received data for SCI-A
//
uint16_t rDataA[2];
//
// Used for checking the received data
//
uint16_t rDataPointA;
uint16_t a=0,b=0;
//
// Function Prototypes
//
__interrupt void scicTXFIFOISR(void);
__interrupt void scicRXFIFOISR(void);
void initSCIAFIFO(void);
void error(void);
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
//
// Setup GPIO by disabling pin locks and enabling pullups
//
Device_initGPIO();
//
// GPIO28 is the SCI Rx pin.
//
GPIO_setMasterCore(90, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_90_SCIRXDC);
GPIO_setDirectionMode(90, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(90, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(90, GPIO_QUAL_ASYNC);
//
// GPIO29 is the SCI Tx pin.
//
GPIO_setMasterCore(89, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_89_SCITXDC);
GPIO_setDirectionMode(89, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(89, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(89, GPIO_QUAL_ASYNC);
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
Interrupt_register(INT_SCIC_RX, scicRXFIFOISR);
Interrupt_register(INT_SCIC_TX, scicTXFIFOISR);
//
// Initialize the Device Peripherals:
//
initSCIAFIFO();
sDataA[0] = 0x0055;
Interrupt_enable(INT_SCIC_RX);
Interrupt_enable(INT_SCIC_TX);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
//
// IDLE loop. Just sit and loop forever (optional):
//
for(;;);
}
//
// error – Function to halt debugger on error
//
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
//
// scicTXFIFOISR – SCIA Transmit FIFO ISR
//
__interrupt void scicTXFIFOISR(void)
{
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_TXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
b++;
}
//
// scicRXFIFOISR – SCIA Receive FIFO ISR
//
__interrupt void scicRXFIFOISR(void)
{
SCI_readCharArray(SCIC_BASE, rDataA, 1);
SCI_clearOverflowStatus(SCIC_BASE);
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
a++;
}
//
// initSCIAFIFO – Configure SCIA FIFO
//
void initSCIAFIFO()
{
//
// 8 char bits, 1 stop bit, no parity. Baud rate is 9600.
//
SCI_setConfig(SCIC_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule(SCIC_BASE);
//SCI_enableLoopback(SCIC_BASE);
SCI_resetChannels(SCIC_BASE);
SCI_enableFIFO(SCIC_BASE);
//
// RX and TX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIC_BASE, (SCI_INT_TXFF | SCI_INT_RXFF));
SCI_disableInterrupt(SCIC_BASE, SCI_INT_RXERR);
SCI_setFIFOInterruptLevel(SCIC_BASE, SCI_FIFO_TX1, SCI_FIFO_RX1);
SCI_performSoftwareReset(SCIC_BASE);
SCI_resetTxFIFO(SCIC_BASE);
SCI_resetRxFIFO(SCIC_BASE);
#ifdef AUTOBAUD
//
// Perform an autobaud lock.
// SCI expects an 'a' or 'A' to lock the baud rate.
//
SCI_lockAutobaud(SCIC_BASE);
#endif
}
//
// End of file
//
配置串口SCIC,89,90脚,FIFO,1级深度触发中断,之后不做任何处理。
在中断处理函数中加入观察变量ab能够发现,仿真的时候不断进入发送中断,有时又不断进入接收中断。
ab的数值一直在非常大的范围变化。
IDE CCS7 launchpad
user5029276:
回复 mangui zhang:
初始化配置之后不做任何动作,也就是不发送也不接收,中断服务函数里就只有清除中断标志位的操作,所以不明白为什么会一直进中断。
// Included Files
//
#include "driverlib.h"
#include "device.h"
//
// Globals
//
//
// Send data for SCI-A
//
uint16_t sDataA[2];
//
// Received data for SCI-A
//
uint16_t rDataA[2];
//
// Used for checking the received data
//
uint16_t rDataPointA;
uint16_t a=0,b=0;
//
// Function Prototypes
//
__interrupt void scicTXFIFOISR(void);
__interrupt void scicRXFIFOISR(void);
void initSCIAFIFO(void);
void error(void);
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
//
// Setup GPIO by disabling pin locks and enabling pullups
//
Device_initGPIO();
//
// GPIO28 is the SCI Rx pin.
//
GPIO_setMasterCore(90, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_90_SCIRXDC);
GPIO_setDirectionMode(90, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(90, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(90, GPIO_QUAL_ASYNC);
//
// GPIO29 is the SCI Tx pin.
//
GPIO_setMasterCore(89, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_89_SCITXDC);
GPIO_setDirectionMode(89, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(89, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(89, GPIO_QUAL_ASYNC);
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
Interrupt_register(INT_SCIC_RX, scicRXFIFOISR);
Interrupt_register(INT_SCIC_TX, scicTXFIFOISR);
//
// Initialize the Device Peripherals:
//
initSCIAFIFO();
sDataA[0] = 0x0055;
Interrupt_enable(INT_SCIC_RX);
Interrupt_enable(INT_SCIC_TX);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
//
// IDLE loop. Just sit and loop forever (optional):
//
for(;;);
}
//
// error – Function to halt debugger on error
//
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
//
// scicTXFIFOISR – SCIA Transmit FIFO ISR
//
__interrupt void scicTXFIFOISR(void)
{
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_TXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
b++;
}
//
// scicRXFIFOISR – SCIA Receive FIFO ISR
//
__interrupt void scicRXFIFOISR(void)
{
SCI_readCharArray(SCIC_BASE, rDataA, 1);
SCI_clearOverflowStatus(SCIC_BASE);
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
a++;
}
//
// initSCIAFIFO – Configure SCIA FIFO
//
void initSCIAFIFO()
{
//
// 8 char bits, 1 stop bit, no parity. Baud rate is 9600.
//
SCI_setConfig(SCIC_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule(SCIC_BASE);
//SCI_enableLoopback(SCIC_BASE);
SCI_resetChannels(SCIC_BASE);
SCI_enableFIFO(SCIC_BASE);
//
// RX and TX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIC_BASE, (SCI_INT_TXFF | SCI_INT_RXFF));
SCI_disableInterrupt(SCIC_BASE, SCI_INT_RXERR);
SCI_setFIFOInterruptLevel(SCIC_BASE, SCI_FIFO_TX1, SCI_FIFO_RX1);
SCI_performSoftwareReset(SCIC_BASE);
SCI_resetTxFIFO(SCIC_BASE);
SCI_resetRxFIFO(SCIC_BASE);
#ifdef AUTOBAUD
//
// Perform an autobaud lock.
// SCI expects an 'a' or 'A' to lock the baud rate.
//
SCI_lockAutobaud(SCIC_BASE);
#endif
}
//
// End of file
//
配置串口SCIC,89,90脚,FIFO,1级深度触发中断,之后不做任何处理。
在中断处理函数中加入观察变量ab能够发现,仿真的时候不断进入发送中断,有时又不断进入接收中断。
ab的数值一直在非常大的范围变化。
IDE CCS7 launchpad
user5029276:
回复 mangui zhang:
还有一个问题,似乎使用SCI_writeCharArray这个函数会触发接收中断。不知道什么原因。
// Included Files
//
#include "driverlib.h"
#include "device.h"
//
// Globals
//
//
// Send data for SCI-A
//
uint16_t sDataA[2];
//
// Received data for SCI-A
//
uint16_t rDataA[2];
//
// Used for checking the received data
//
uint16_t rDataPointA;
uint16_t a=0,b=0;
//
// Function Prototypes
//
__interrupt void scicTXFIFOISR(void);
__interrupt void scicRXFIFOISR(void);
void initSCIAFIFO(void);
void error(void);
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
//
// Setup GPIO by disabling pin locks and enabling pullups
//
Device_initGPIO();
//
// GPIO28 is the SCI Rx pin.
//
GPIO_setMasterCore(90, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_90_SCIRXDC);
GPIO_setDirectionMode(90, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(90, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(90, GPIO_QUAL_ASYNC);
//
// GPIO29 is the SCI Tx pin.
//
GPIO_setMasterCore(89, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_89_SCITXDC);
GPIO_setDirectionMode(89, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(89, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(89, GPIO_QUAL_ASYNC);
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
Interrupt_register(INT_SCIC_RX, scicRXFIFOISR);
Interrupt_register(INT_SCIC_TX, scicTXFIFOISR);
//
// Initialize the Device Peripherals:
//
initSCIAFIFO();
sDataA[0] = 0x0055;
Interrupt_enable(INT_SCIC_RX);
Interrupt_enable(INT_SCIC_TX);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
//
// IDLE loop. Just sit and loop forever (optional):
//
for(;;);
}
//
// error – Function to halt debugger on error
//
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
//
// scicTXFIFOISR – SCIA Transmit FIFO ISR
//
__interrupt void scicTXFIFOISR(void)
{
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_TXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
b++;
}
//
// scicRXFIFOISR – SCIA Receive FIFO ISR
//
__interrupt void scicRXFIFOISR(void)
{
SCI_readCharArray(SCIC_BASE, rDataA, 1);
SCI_clearOverflowStatus(SCIC_BASE);
SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
a++;
}
//
// initSCIAFIFO – Configure SCIA FIFO
//
void initSCIAFIFO()
{
//
// 8 char bits, 1 stop bit, no parity. Baud rate is 9600.
//
SCI_setConfig(SCIC_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule(SCIC_BASE);
//SCI_enableLoopback(SCIC_BASE);
SCI_resetChannels(SCIC_BASE);
SCI_enableFIFO(SCIC_BASE);
//
// RX and TX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIC_BASE, (SCI_INT_TXFF | SCI_INT_RXFF));
SCI_disableInterrupt(SCIC_BASE, SCI_INT_RXERR);
SCI_setFIFOInterruptLevel(SCIC_BASE, SCI_FIFO_TX1, SCI_FIFO_RX1);
SCI_performSoftwareReset(SCIC_BASE);
SCI_resetTxFIFO(SCIC_BASE);
SCI_resetRxFIFO(SCIC_BASE);
#ifdef AUTOBAUD
//
// Perform an autobaud lock.
// SCI expects an 'a' or 'A' to lock the baud rate.
//
SCI_lockAutobaud(SCIC_BASE);
#endif
}
//
// End of file
//
配置串口SCIC,89,90脚,FIFO,1级深度触发中断,之后不做任何处理。
在中断处理函数中加入观察变量ab能够发现,仿真的时候不断进入发送中断,有时又不断进入接收中断。
ab的数值一直在非常大的范围变化。
IDE CCS7 launchpad
user5029276:
回复 mangui zhang:
非常感谢。调试了一个月才发现是硬件的问题。
发送的数据被器件反射回来。造成的中断嵌套。