使用串口通讯,当设置波特率为115200时,通讯一二十次会出错一次,但是当设置波特率为38400时没有问题。
下面是设置为115200波特率时的初始化函数,帮忙看看哪里出问题了。
void SCI_Init()
{
Uint8 i;
InitSciaGpio();
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
// baud = LSPCLK/8/((BRR+1)// baud @LSPCLK = 15MHz (60 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =15; //–>115200
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.SCIRST=1;
SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度
SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收
//中断配置步骤—–1
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
EALLOW;
PieVectTable.SCIRXINTA = &uartRx_isr; //中断配置步骤—–2
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤—–3
IER |= M_INT9; //中断配置步骤—–4
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
hu vison:
有没有勾取一下发送和接收的波形?115200波特率比较快,看看是不是你的电路上的一些光耦响应太慢或者电容使用太大导致波形失真了。
使用串口通讯,当设置波特率为115200时,通讯一二十次会出错一次,但是当设置波特率为38400时没有问题。
下面是设置为115200波特率时的初始化函数,帮忙看看哪里出问题了。
void SCI_Init()
{
Uint8 i;
InitSciaGpio();
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
// baud = LSPCLK/8/((BRR+1)// baud @LSPCLK = 15MHz (60 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =15; //–>115200
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.SCIRST=1;
SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度
SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收
//中断配置步骤—–1
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
EALLOW;
PieVectTable.SCIRXINTA = &uartRx_isr; //中断配置步骤—–2
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤—–3
IER |= M_INT9; //中断配置步骤—–4
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
JINYONG LI1:
回复 hu vison:
主从机 用的芯片都是MAX485,没有用到光耦,通讯波形
使用串口通讯,当设置波特率为115200时,通讯一二十次会出错一次,但是当设置波特率为38400时没有问题。
下面是设置为115200波特率时的初始化函数,帮忙看看哪里出问题了。
void SCI_Init()
{
Uint8 i;
InitSciaGpio();
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
// baud = LSPCLK/8/((BRR+1)// baud @LSPCLK = 15MHz (60 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =15; //–>115200
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.SCIRST=1;
SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度
SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收
//中断配置步骤—–1
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
EALLOW;
PieVectTable.SCIRXINTA = &uartRx_isr; //中断配置步骤—–2
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤—–3
IER |= M_INT9; //中断配置步骤—–4
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
hu vison:
回复 JINYONG LI1:
那是发送出错还是接收出错?是不是中断响应太慢了?其他任务打断了SCI通讯?
使用串口通讯,当设置波特率为115200时,通讯一二十次会出错一次,但是当设置波特率为38400时没有问题。
下面是设置为115200波特率时的初始化函数,帮忙看看哪里出问题了。
void SCI_Init()
{
Uint8 i;
InitSciaGpio();
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
// baud = LSPCLK/8/((BRR+1)// baud @LSPCLK = 15MHz (60 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =15; //–>115200
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.SCIRST=1;
SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度
SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收
//中断配置步骤—–1
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
EALLOW;
PieVectTable.SCIRXINTA = &uartRx_isr; //中断配置步骤—–2
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤—–3
IER |= M_INT9; //中断配置步骤—–4
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
JINYONG LI1:
回复 hu vison:
是接收错误,其他中断打断SCI?这个不确定,目前开了中断有AD采样、T0计时中断、PWM有使用但是没有用到中断入口、SCI接收发送中断,就这些,其他任务都是在主循环里面完成
使用串口通讯,当设置波特率为115200时,通讯一二十次会出错一次,但是当设置波特率为38400时没有问题。
下面是设置为115200波特率时的初始化函数,帮忙看看哪里出问题了。
void SCI_Init()
{
Uint8 i;
InitSciaGpio();
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
// baud = LSPCLK/8/((BRR+1)// baud @LSPCLK = 15MHz (60 MHz SYSCLK)
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =15; //–>115200
SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.SCIRST=1;
SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度
SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收
//中断配置步骤—–1
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
EALLOW;
PieVectTable.SCIRXINTA = &uartRx_isr; //中断配置步骤—–2
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤—–3
IER |= M_INT9; //中断配置步骤—–4
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
hu vison:
回复 JINYONG LI1:
可以测试一下每个中断服务子程序的执行时间,看看是不是某个中断时间太长了?SCI初始化配置好像是没有问题的。
例如AD采样中断,假设每50us中断一次,但执行该中断时间有40us,那就只剩下10us处理其他事情,这样其他事情就可能就处理不过来了。
另外你说的错误是收不到数据?还是状态寄存器提示有错误?接收数据的堆栈不够长?通讯方式有没有问题,例如DSP收到数据,然后回复,但这个时候上位机又发送数据,这样就有冲突,有没有这些情况?
我只能帮到这里了!