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.
不是道是不是配置有无,发送端给过来的数据无法触发fifo接收中断,发送已验证ok,但是接收一直有问题,以下为部分代码:
void scia_fifo_init()
{
SciaRegs.SCICCR.all=0x0007;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIFFTX.all=0xC021;
SciaRegs.SCIFFRX.all=0xC022;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all=0x0023;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
}
void scia_loopback_init()
{
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
int16 BAUDRATE=SCI_PRD;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCIHBAUD =BAUDRATE>>8;
SciaRegs.SCILBAUD =BAUDRATE;
SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
interrupt void sciaRxFifoIsr(void)
{
Uint16 i;
for(i=Scia_Rx_Cnt;i<(2+Scia_Rx_Cnt);i++)
{
if(i!=Scia_RxBL)
Scia_RxBUF[i]=SciaRegs.SCIRXBUF.all; // Read data
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
Scia_Rx_Cnt+=2;
if(Scia_Rx_Cnt>=Scia_RxBL)
{
COM1Rx_CheckSum();
}
}
void COM1Rx_CheckSum(void)
{
int i;
unsigned char checksum;
for(i=0;i<Scia_RxBL-1;i++)
{
checksum+=Scia_RxBUF[i];
}
if(checksum==Scia_RxBUF[Scia_RxBL-1])
{
Scia_Rece_Complete=1;
Scia_Dataprocess();
}
else
{
Scia_Rece_Complete=0;
}
Scia_Rx_Cnt=0;
}
void Scia_Dataprocess(void)
{
Scia_Requestrpm=Scia_RxBUF[6];
Scia_Actualrpm=Scia_Requestrpm*30;
}
gpio引脚配置应该没啥问题,而且我的发送数据已经被成功接收,以下是我的main函数代码,不知道pie级的中断设置是否正确
InitGpio();
UART_Simulation_GPIO_Init();
InitSysCtrl();
InitSciGpio();
// Disable and clear all CPU interrupts:
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
PieVectTable.SCITXINTA = &sciaTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
//
InitCpuTimers(); // For this example, only initialize the Cpu Timers
EnableInterrupts();
scia_fifo_init(); // Initialize the SCI FIFO
scia_loopback_init(); // Initalize SCI for digital loop back
CPUTimer_Userset(&CpuTimer0,10,100);
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
PieVectTable.TINT1 = &cpu_timer1_isr;
PieVectTable.TINT2 = &cpu_timer2_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIEIER1.bit.INTx7=1;
// Enable interrupts required for this example
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
IER = 0x100; // Enable CPU INT
// EINT;
IER |= M_INT1;
IER |= M_INT13;
IER |= M_INT14;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
CpuTimer0Regs.PRD.all = mSec1;
CpuTimer1Regs.PRD.all = mSec5;
CpuTimer2Regs.PRD.all = mSec1000;
Scia_Rx_Init();
for(;;)
{
if(Scia_Txwait>=500)
{
Scia_Txwait=0;
scia_xmit_sendchar();
GPIO_UART1_SendChar();
}
}
PIE中断我看到你已经打开了,你有试一下controlSUITE中的例程吗?另外注意就是进中断有FIFO的级别的,你设置是SciaRegs.SCIFFRX.all=0x0022,就表示只有接收超过2个数据,才会进中断。
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
IER = 0x100; // Enable CPU INT
接收的数据是12字节,每次开中断我处理两个字节,12个字节处理完计算checksum,就是不知道问题出在哪里
interrupt void sciaRxFifoIsr(void)
{
Uint16 i;
for(i=Scia_Rx_Cnt;i<(2+Scia_Rx_Cnt);i++)
{
if(i!=Scia_RxBL)
Scia_RxBUF[i]=SciaRegs.SCIRXBUF.all; // Read data
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
Scia_Rx_Cnt+=2;
if(Scia_Rx_Cnt>=Scia_RxBL)
{
COM1Rx_CheckSum();
}