尊敬的所有人:
我正在使用 F28027、并且我正在尝试在两个 DSP 之间的 SCI 上进行通信。 发送器正在传输数据。 我观察到了"iton scope"。 但是接收器不连续接收。 我在发送器代码中有一个延迟环路、并且我保持延迟时间越长、在条件检查标志时接收器卡在打开状态越多。 当我增加延迟时间时、代码持续等待、就像没有传入数据一样。 当我缩短延迟时间时、它会变得更小。 有人能告诉我如何解决这个问题。 这是我的发送器和接收器代码。
for (;;)
{
SendChar=0;
for (SendChar=1;SendChar<=255;SendChar++)
{
delay_loop();
scia_txmit (SendChar);
/*while (SciaRegs.SCIFFRX.bit.RXFFST!=1){}//等待 XRDY =1为空状态
//检查接收到的字符
ReceivedChar = SciaRegs.SCIRXBUF.ALL;
if (ReceivedChar!= SendChar) error ();
LoopCount++;*/
}
}
void scia_init()
{
//02.03.2017适用于蓝牙的 SCI 配置
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 gpio28启用上拉(SCIRXDA)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1;//禁用 gpio29的上拉电阻器(SCITXDA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//asynch 输入 GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;//将 gpio 配置为 SCI 发送器
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;//将 gpio 配置为 SCI 接收器
EDIS;
SciaRegs.SCICCR.bit.stopbits = 0;//一停止位
SciaRegs.SCICCR.bit.PARITYENA=0;//禁用奇偶校验
SciaRegs.SCICCR.bit.LOOPBKENA=0;//循环回扫禁用(当 Tx 连接内部 Rx 时) SciaRegs.SCICCR.bit.TXICCR.1/
TXICES.1/ TXICTR.1/ TXICTRENA
= 0;//使能 TXICTLT.TXICEST.TXIC.1/ TXICEST.TXIC.CLA.1/ TXICEST.TXICT.TXICEST.1/位= 0;//使能 TXICEST.TXICT.TXICEST.TXICT.TXICR=0
//使能 TXRDY 中断
SciaRegs.SCICTL2.bit.RXBKINTENA=1;//使能 RXRDY 中断
//örnekte ikikikez yazılmış?
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x000F;//LSPCLK = 12.5MHz (50MHz SYSCLK) BAUD=LSPCLK/(16*8)
SciaRegs.SCICCR.bit.LOOPBKENA=1;//启用回路
SCRIVA23 =0xICTL1;所有 SCICTL1; //从复位中放弃 SCI
}
//发送器函数
void scia_txmit (int a)
{
SciaRegs.SCITXBUF = A;
}
void scia_fifo_init ()
{
SciaRegs.SCIFFTX.ALL=0xE040;
SciaRegs.SCIFFRX.ALL=0x2044;SciaRegs.scfct.all
}void fall.e0=0x2044;void scfac.cloop (void = 0=0.clay)
I;
表示(I = 0;I < 100;I++){}
上面写入的代码用于发送器侧。
我使用计时器中断来实现延迟时间、但我遇到了相同的问题。
对于接收器端、我已经将一个名为 received 的变量描述为 uint8。 然而、接收器 DSP 将其显示为 unsigned char。 我想了解原因。 正如我之前说过的、它经常在 while 条件下(取决于延迟时间)
这里是接收器代码
for (;;){
//asm (" NOP");//主循环(中断发出)
SciaRegs.SCICTL1.bit.RXENA=1;
while (SciaRegs.SCIRXST.bit.RXRDY = 0){}//等待 XRDY =1为空状态
//while (SciaRegs.SCIFFRX.bit.RXFFST!=1){}
//获取字符
接收= SciaRegs.SCIRXBUF.ALL;
接收=接收和0x00FF;
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
//asm (" NOP");
//SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
}
void scia_init()
{
//02.03.2017适用于蓝牙的 SCI 配置
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 gpio28启用上拉(SCIRXDA)
//GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1;//禁用 gpio29的上拉电阻器(SCITXDA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//asynch 输入 GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;//将 gpio 配置为 SCI 接收器
//GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;//将 gpio 配置为 SCI 发送器
EDIS;
SciaRegs.SCICCR.bit.stopbits = 0;//停止位
SciaRegs.SCICCR.bit.PARITYENA=0;//禁用奇偶校验
SciaRegs.SCICCR.bit.LOOPBKENA=0;//循环回扫禁用(当 Tx 连接内部 Rx 时) SciaRegs.SCICCR.bit.1/
TXICTR1.0001/
启用 TXICTRENA
= 0;// t.USTR1.t.USTRENA = 0;// TXICTL1.0001.t.US.CLTICEST.1/ TXICEST.US.CLA = 0;//
//启用 TXRDY 中断
SciaRegs.SCICTL2.all = 0x0002;//启用 RXRDY 中断
//örnekte ikikikez yazılmış?
//autobaud detection (14.03.2017)
SciaRegs.SCIFFCT.bit.CDC = 1;//启用 aTooboaud aligment
SciaRegs.SCIFFCT.bit.ABDbaud = 1;//清除 abd 位
SciaRegs.SCIHBAUD = 0x0000;//选择速度低于0xSCFCT.CLB=12.5MHz
;//启用 SCLCR.CLK = 0x251MHz;// SCLCLK = 0xSCLCR.CLK = 0x251MHz;/ SCLCR.CLK =0XCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0xCLK = 0.CLK = 0.CLK = 0.CLK;/ SCLCR.CLK = 0xCLK =
//从复位中放弃 SCI
//SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;//启用 FIFO TX 中断以便禁用自动波特
}
void scia_fifo_init ()
{
SciaRegs.SCIFFTX.All=0xE040;
SciaRegs.SCIFFRX.All=0x2044;
SciaRegs.SCIFFCT.All=0x0;
}
如果有人立即帮助我、我会变得很亮。
非常感谢。
此致
法赫里