请问SCI接收中断子程序是不是不能运行时间太久?我想在里面写一个CAN发送程序,结果发现收到的SCI发过来得数是乱码,请问是什么原因?
unsigned int i=0;
interrupt void scibrxisr(void);
void Scib_init(void);
void Ecana_mbox_init(void);
int a[5];
int DATA=0;
unsigned long po=0;
int o=0;
void main(void)
{
struct ECAN_REGS ECanaShadow;
InitSysCtrl();//设置系统时钟等
InitSciGpio();//设置Sci口,SCIB,18,19
InitECanaGpio();//设置CAN通讯口,ECANB,16,17
Scib_init(); // SCI-B设置
InitECana(); //ECANB设置
Ecana_mbox_init();//ECANB邮箱设置
/*以下为中断设置,用到SCI接受中断*/
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibrxisr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
IER|=M_INT9; // Enable CPU INT
EINT;//开全局中断
for(;;);//循环等待
}
interrupt void scibrxisr(void)//中断服务子程序
{ struct ECAN_REGS ECanaShadow;
DATA=ScibRegs.SCIRXBUF.all; // Read data
a[i]=DATA;
ECanaMboxes.MBOX6.MDL.all =a[i];
i++;
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS6 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA6 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA6 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
if(i>4) i=0;
po++; // Issue PIE ac
PieCtrlRegs.PIEACK.all|=0x100;
}
void Scib_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0001; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.RXBKINTENA =1;// ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCIHBAUD =0x00;
ScibRegs.SCILBAUD =0x28;//波特率115200
// ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
// ScibRegs.SCIFFTX.all=0xC028;
// ScibRegs.SCIFFRX.all=0x2025;
// ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0021; // Relinquish SCI from Reset
}
void Ecana_mbox_init()
{
struct ECAN_REGS ECanaShadow;
ECanaMboxes.MBOX6.MSGID.all = 0x80002015; // Extended Identifier
/* Configure Mailbox under test as a Transmit mailbox */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD6 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* Enable Mailbox under test */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME6 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* Write to DLC field in Master Control reg */
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX6.MSGCTRL.bit.TPL = 0;
}
Hank Zhao:
接收中断子程序时间太长的话,再有数据过来的话就无法及时响应了。
请问SCI接收中断子程序是不是不能运行时间太久?我想在里面写一个CAN发送程序,结果发现收到的SCI发过来得数是乱码,请问是什么原因?
unsigned int i=0;
interrupt void scibrxisr(void);
void Scib_init(void);
void Ecana_mbox_init(void);
int a[5];
int DATA=0;
unsigned long po=0;
int o=0;
void main(void)
{
struct ECAN_REGS ECanaShadow;
InitSysCtrl();//设置系统时钟等
InitSciGpio();//设置Sci口,SCIB,18,19
InitECanaGpio();//设置CAN通讯口,ECANB,16,17
Scib_init(); // SCI-B设置
InitECana(); //ECANB设置
Ecana_mbox_init();//ECANB邮箱设置
/*以下为中断设置,用到SCI接受中断*/
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibrxisr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
IER|=M_INT9; // Enable CPU INT
EINT;//开全局中断
for(;;);//循环等待
}
interrupt void scibrxisr(void)//中断服务子程序
{ struct ECAN_REGS ECanaShadow;
DATA=ScibRegs.SCIRXBUF.all; // Read data
a[i]=DATA;
ECanaMboxes.MBOX6.MDL.all =a[i];
i++;
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS6 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA6 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA6 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
if(i>4) i=0;
po++; // Issue PIE ac
PieCtrlRegs.PIEACK.all|=0x100;
}
void Scib_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0001; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.RXBKINTENA =1;// ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCIHBAUD =0x00;
ScibRegs.SCILBAUD =0x28;//波特率115200
// ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
// ScibRegs.SCIFFTX.all=0xC028;
// ScibRegs.SCIFFRX.all=0x2025;
// ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0021; // Relinquish SCI from Reset
}
void Ecana_mbox_init()
{
struct ECAN_REGS ECanaShadow;
ECanaMboxes.MBOX6.MSGID.all = 0x80002015; // Extended Identifier
/* Configure Mailbox under test as a Transmit mailbox */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD6 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* Enable Mailbox under test */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME6 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* Write to DLC field in Master Control reg */
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX6.MSGCTRL.bit.TPL = 0;
}
wei li20:
回复 Hank Zhao:
我觉得CAN程序不需要很长时间啊。。。如果这样我有什么其他办法可以实现我SCI收到一个数据就传给CAN呢?
请问SCI接收中断子程序是不是不能运行时间太久?我想在里面写一个CAN发送程序,结果发现收到的SCI发过来得数是乱码,请问是什么原因?
unsigned int i=0;
interrupt void scibrxisr(void);
void Scib_init(void);
void Ecana_mbox_init(void);
int a[5];
int DATA=0;
unsigned long po=0;
int o=0;
void main(void)
{
struct ECAN_REGS ECanaShadow;
InitSysCtrl();//设置系统时钟等
InitSciGpio();//设置Sci口,SCIB,18,19
InitECanaGpio();//设置CAN通讯口,ECANB,16,17
Scib_init(); // SCI-B设置
InitECana(); //ECANB设置
Ecana_mbox_init();//ECANB邮箱设置
/*以下为中断设置,用到SCI接受中断*/
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibrxisr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
IER|=M_INT9; // Enable CPU INT
EINT;//开全局中断
for(;;);//循环等待
}
interrupt void scibrxisr(void)//中断服务子程序
{ struct ECAN_REGS ECanaShadow;
DATA=ScibRegs.SCIRXBUF.all; // Read data
a[i]=DATA;
ECanaMboxes.MBOX6.MDL.all =a[i];
i++;
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS6 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA6 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA6 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
if(i>4) i=0;
po++; // Issue PIE ac
PieCtrlRegs.PIEACK.all|=0x100;
}
void Scib_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0001; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.RXBKINTENA =1;// ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCIHBAUD =0x00;
ScibRegs.SCILBAUD =0x28;//波特率115200
// ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
// ScibRegs.SCIFFTX.all=0xC028;
// ScibRegs.SCIFFRX.all=0x2025;
// ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0021; // Relinquish SCI from Reset
}
void Ecana_mbox_init()
{
struct ECAN_REGS ECanaShadow;
ECanaMboxes.MBOX6.MSGID.all = 0x80002015; // Extended Identifier
/* Configure Mailbox under test as a Transmit mailbox */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD6 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* Enable Mailbox under test */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME6 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* Write to DLC field in Master Control reg */
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX6.MSGCTRL.bit.TPL = 0;
}
rookiecalf:
回复 wei li20:
中断一般只做简单的接受发送动作,处理过程交由主循环。运行时间不能凭主观猜测,可以仿真测定具体执行周期,如果执行的时间不足以影响SCI的工作,在此进行处理也不会出问题。
但是不出问题,不代表方法是最合理的。
请问SCI接收中断子程序是不是不能运行时间太久?我想在里面写一个CAN发送程序,结果发现收到的SCI发过来得数是乱码,请问是什么原因?
unsigned int i=0;
interrupt void scibrxisr(void);
void Scib_init(void);
void Ecana_mbox_init(void);
int a[5];
int DATA=0;
unsigned long po=0;
int o=0;
void main(void)
{
struct ECAN_REGS ECanaShadow;
InitSysCtrl();//设置系统时钟等
InitSciGpio();//设置Sci口,SCIB,18,19
InitECanaGpio();//设置CAN通讯口,ECANB,16,17
Scib_init(); // SCI-B设置
InitECana(); //ECANB设置
Ecana_mbox_init();//ECANB邮箱设置
/*以下为中断设置,用到SCI接受中断*/
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibrxisr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
IER|=M_INT9; // Enable CPU INT
EINT;//开全局中断
for(;;);//循环等待
}
interrupt void scibrxisr(void)//中断服务子程序
{ struct ECAN_REGS ECanaShadow;
DATA=ScibRegs.SCIRXBUF.all; // Read data
a[i]=DATA;
ECanaMboxes.MBOX6.MDL.all =a[i];
i++;
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS6 = 1; // Set TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA6 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA6 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
if(i>4) i=0;
po++; // Issue PIE ac
PieCtrlRegs.PIEACK.all|=0x100;
}
void Scib_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0001; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.RXBKINTENA =1;// ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCIHBAUD =0x00;
ScibRegs.SCILBAUD =0x28;//波特率115200
// ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
// ScibRegs.SCIFFTX.all=0xC028;
// ScibRegs.SCIFFRX.all=0x2025;
// ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0021; // Relinquish SCI from Reset
}
void Ecana_mbox_init()
{
struct ECAN_REGS ECanaShadow;
ECanaMboxes.MBOX6.MSGID.all = 0x80002015; // Extended Identifier
/* Configure Mailbox under test as a Transmit mailbox */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD6 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* Enable Mailbox under test */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME6 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* Write to DLC field in Master Control reg */
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX6.MSGCTRL.bit.TPL = 0;
}
wei li20:
回复 rookiecalf:
那我是应该把执行内容放入For(;;)里面,这么写对吗?
void main(void){struct ECAN_REGS ECanaShadow;
InitSysCtrl();//设置系统时钟等
InitSciGpio();//设置Sci口,SCIB,18,19
InitECanaGpio();//设置CAN通讯口,ECANB,16,17Scib_init(); // SCI-B设置InitECana(); //ECANB设置
Ecana_mbox_init();//ECANB邮箱设置/*以下为中断设置,用到SCI接受中断*/DINT;InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibrxisr;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE blockPieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
IER|=M_INT9; // Enable CPU INTEINT;//开全局中断for(;;)
{
ECanaMboxes.MBOX6.MDL.all =DATA;
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;ECanaShadow.CANTRS.all = 0;ECanaShadow.CANTRS.bit.TRS6 = 1; // Set TRS for mailbox under testECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do{ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;} while(ECanaShadow.CANTA.bit.TA6 == 0 ); // Wait for TA5 bit to be set..
ECanaShadow.CANTA.all = 0;ECanaShadow.CANTA.bit.TA6 = 1; // Clear TA5ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
//循环等待}
interrupt void scibrxisr(void)//中断服务子程序{ struct ECAN_REGS ECanaShadow;DATA=ScibRegs.SCIRXBUF.all; // Read data
a[i]=DATA;
i++;
if(i>4) i=0;
po++; // Issue PIE ac
PieCtrlRegs.PIEACK.all|=0x100;
}