问题描述;1、我的SCI为奇校验,使能FIFO,采用查询的方式工作,下附初始化代码。
2、总线上的数据有奇校验也有偶校验,每组数据(包括查询及回复数据)的间隔都在100ms以上。
3、对于总线数据错误,我的应用层有两种处理方式:
(1)若查询到有接受错误,那么立刻重新初始化SCI,同时复位FIFO指针到0;
(2)先不对SCIRXST寄存器中的错误状态进行判断,总线上的数据全部接收,
待接受完数据后(判断总线空闲10ms),判断SCIRXST是否存在错误,
如果存在错误,那么重新初始化SCI,同时复位FIFO指针到0。
4、对于3中描述的两种处理方式,若采用第一种方式,对于总线上正常(奇校验)查询我SCI的数据,我们这边都能正常回复,
而若采用第二种处理方式, 总线上正常(奇校验)查询我SCI的数据,我们这边就有不能回复(不是每次都不回复,偶尔出现)的时候,故我的问题是,对于
我们的SCI模块接受错误后立即处理和等待一段时间后再处理,会不会有什么不同,而导致正常的数据也不能正确接受或者回复?或者根据以上描述还有什么其他可能的原因导致SCI不回复?
感谢。
SCI初始化代码
void InitSci(void)
{
// Initialize SCI-A:
InitSciaGpio();
SciaRegs.SCICCR.all = 0x0027; // 1 stop, odd parity,8 char, async mode, idle-line
SciaRegs.SCICTL1.all = 0x0003; // bit0,enable RX, bit5,reset SCI, bit1,enable TX
SciaRegs.SCICTL2.all = 0x0000; // bit0:TX INT bit1:RX/BK INT all disable
//LSPCLK=60/4=15M
//SciaRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 25MHz.
//SciaRegs.SCILBAUD = 0x0044; //LSPCLK/(BRR+1)/8=9600,==>BRR=324
SciaRegs.SCIHBAUD = 0x0000; // 9600 baud @LSPCLK = 15MHz.
SciaRegs.SCILBAUD = 0x00C2; //LSPCLK/(BRR+1)/8=9600,==>BRR=194
SciaRegs.SCIRXST.all = 0x00; //Read access only
SciaRegs.SCIRXEMU = 0x00; //Read access only
SciaRegs.SCIRXBUF.all= 0x00;
//rsvd1;
SciaRegs.SCITXBUF = 0x00;
SciaRegs.SCIPRI.all =0x10; // 1 0 Complete current receive/transmit sequence before stopping
SciaRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.all = 0xE040; //1110 0000 0100 0000B
SciaRegs.SCIFFRX.all = 0x204f; //0110 0000 0100 1111B
SciaRegs.SCIFFCT.all = 0x0; //
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
}
clark FU:
有没有人来回答啊, 顶一下~
问题描述;1、我的SCI为奇校验,使能FIFO,采用查询的方式工作,下附初始化代码。
2、总线上的数据有奇校验也有偶校验,每组数据(包括查询及回复数据)的间隔都在100ms以上。
3、对于总线数据错误,我的应用层有两种处理方式:
(1)若查询到有接受错误,那么立刻重新初始化SCI,同时复位FIFO指针到0;
(2)先不对SCIRXST寄存器中的错误状态进行判断,总线上的数据全部接收,
待接受完数据后(判断总线空闲10ms),判断SCIRXST是否存在错误,
如果存在错误,那么重新初始化SCI,同时复位FIFO指针到0。
4、对于3中描述的两种处理方式,若采用第一种方式,对于总线上正常(奇校验)查询我SCI的数据,我们这边都能正常回复,
而若采用第二种处理方式, 总线上正常(奇校验)查询我SCI的数据,我们这边就有不能回复(不是每次都不回复,偶尔出现)的时候,故我的问题是,对于
我们的SCI模块接受错误后立即处理和等待一段时间后再处理,会不会有什么不同,而导致正常的数据也不能正确接受或者回复?或者根据以上描述还有什么其他可能的原因导致SCI不回复?
感谢。
SCI初始化代码
void InitSci(void)
{
// Initialize SCI-A:
InitSciaGpio();
SciaRegs.SCICCR.all = 0x0027; // 1 stop, odd parity,8 char, async mode, idle-line
SciaRegs.SCICTL1.all = 0x0003; // bit0,enable RX, bit5,reset SCI, bit1,enable TX
SciaRegs.SCICTL2.all = 0x0000; // bit0:TX INT bit1:RX/BK INT all disable
//LSPCLK=60/4=15M
//SciaRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 25MHz.
//SciaRegs.SCILBAUD = 0x0044; //LSPCLK/(BRR+1)/8=9600,==>BRR=324
SciaRegs.SCIHBAUD = 0x0000; // 9600 baud @LSPCLK = 15MHz.
SciaRegs.SCILBAUD = 0x00C2; //LSPCLK/(BRR+1)/8=9600,==>BRR=194
SciaRegs.SCIRXST.all = 0x00; //Read access only
SciaRegs.SCIRXEMU = 0x00; //Read access only
SciaRegs.SCIRXBUF.all= 0x00;
//rsvd1;
SciaRegs.SCITXBUF = 0x00;
SciaRegs.SCIPRI.all =0x10; // 1 0 Complete current receive/transmit sequence before stopping
SciaRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.all = 0xE040; //1110 0000 0100 0000B
SciaRegs.SCIFFRX.all = 0x204f; //0110 0000 0100 1111B
SciaRegs.SCIFFCT.all = 0x0; //
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
}
rookiecalf:
回复 clark FU:
查询方式后面会跟其他模块的占用时间片相关,建议改为中断模式,中断中负责收发,主循环中做非实时性的数据处理
问题描述;1、我的SCI为奇校验,使能FIFO,采用查询的方式工作,下附初始化代码。
2、总线上的数据有奇校验也有偶校验,每组数据(包括查询及回复数据)的间隔都在100ms以上。
3、对于总线数据错误,我的应用层有两种处理方式:
(1)若查询到有接受错误,那么立刻重新初始化SCI,同时复位FIFO指针到0;
(2)先不对SCIRXST寄存器中的错误状态进行判断,总线上的数据全部接收,
待接受完数据后(判断总线空闲10ms),判断SCIRXST是否存在错误,
如果存在错误,那么重新初始化SCI,同时复位FIFO指针到0。
4、对于3中描述的两种处理方式,若采用第一种方式,对于总线上正常(奇校验)查询我SCI的数据,我们这边都能正常回复,
而若采用第二种处理方式, 总线上正常(奇校验)查询我SCI的数据,我们这边就有不能回复(不是每次都不回复,偶尔出现)的时候,故我的问题是,对于
我们的SCI模块接受错误后立即处理和等待一段时间后再处理,会不会有什么不同,而导致正常的数据也不能正确接受或者回复?或者根据以上描述还有什么其他可能的原因导致SCI不回复?
感谢。
SCI初始化代码
void InitSci(void)
{
// Initialize SCI-A:
InitSciaGpio();
SciaRegs.SCICCR.all = 0x0027; // 1 stop, odd parity,8 char, async mode, idle-line
SciaRegs.SCICTL1.all = 0x0003; // bit0,enable RX, bit5,reset SCI, bit1,enable TX
SciaRegs.SCICTL2.all = 0x0000; // bit0:TX INT bit1:RX/BK INT all disable
//LSPCLK=60/4=15M
//SciaRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 25MHz.
//SciaRegs.SCILBAUD = 0x0044; //LSPCLK/(BRR+1)/8=9600,==>BRR=324
SciaRegs.SCIHBAUD = 0x0000; // 9600 baud @LSPCLK = 15MHz.
SciaRegs.SCILBAUD = 0x00C2; //LSPCLK/(BRR+1)/8=9600,==>BRR=194
SciaRegs.SCIRXST.all = 0x00; //Read access only
SciaRegs.SCIRXEMU = 0x00; //Read access only
SciaRegs.SCIRXBUF.all= 0x00;
//rsvd1;
SciaRegs.SCITXBUF = 0x00;
SciaRegs.SCIPRI.all =0x10; // 1 0 Complete current receive/transmit sequence before stopping
SciaRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.all = 0xE040; //1110 0000 0100 0000B
SciaRegs.SCIFFRX.all = 0x204f; //0110 0000 0100 1111B
SciaRegs.SCIFFCT.all = 0x0; //
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
}
Jason Wu4:
建议采用FIFO中断处理方式,根据需求,设定FIFO中断级位,主程序中定时查询FIFO结果就能避免正常数据不被遗漏。