您好:
初始化
void InitSciC(void)
{
ScicRegs.SCICCR.all =0x0007; // 1位停止位,无奇偶校验,禁止回送检测(如果使能
// 回送检测,则发送引脚和接收引脚在dsp内部被连接,
// 空闲线协议模式,8位数据位。
ScicRegs.SCICTL1.all =0x0003; // 使能发送器,接收器
ScicRegs.SCIHBAUD.all = 0x00; //19200波特率
ScicRegs.SCILBAUD.all = 0xF3;
//ScicRegs.SCIHBAUD.bit.BAUD = 0x00;
//ScicRegs.SCILBAUD.bit.BAUD = 0xF3;
// ScicRegs.SCICTL2.all =0x0003;
ScicRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
ScicRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
//当FIFO接收字数大于等于3时,产生FIFO接收中断
//在FIFO的寄存器SCIFFRX中,RXFFST4~0 >= RXFFIL4~0时接收中断才会发生
//在TX的过程中也是一样。
ScicRegs.SCIFFRX.all= 0xE061;
//ScibRegs.SCIFFCT.all = 0x0;
//ScicRegs.SCIFFRX.all=0x2044;
ScicRegs.SCICTL1.bit.SWRESET = 1;
}
interrupt void SCIC_RX_isr(void)
{
//若规定时间内接收数据没有达到8字节,应该清空接收缓冲区
//unsigned int SCIC_rxdCount_Timer = 0;
//每次进串口中断清零 SCIC_rxdCount_Timer =0;
SCIC_rxdCount_Timer = 0;
//50us interrupt 里边 : SCIC_rxdCount_Timer ++;
SCIC_RxdBuffer[SCIC_rxdCount] = ScicRegs.SCIRXBUF.all;
SCIC_rxdCount++;
//这里判断地址,并判断功能码
//因为主机指令全部为8个字节,所以只要 地址和功能码 符合,即默认是8个字节的指令
if(SCIC_rxdCount == 8) //应校验指令的合法性,防止是其他从机回送数据流的干扰
{
RxdLen=8;
SCIC_flg_Rxd_Complete = 1;
}
if(SCIC_rxdCount > 10)
{
SCIC_rxdCount = 10; //防止溢出
}
ScicRegs.SCIFFRX.bit.RXFIFORESET=0; //重置接收中断FIFO
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;
}
在中断函数中SCIC_rxdCount一直到不了8,数据读取一直存在问题,不知道怎么解决。麻烦大家看看。
mangui zhang:下载controlsuite参考里面的例程建议开始先别使用FIFO
进行简单的读写操作 理解相关寄存器
您好:
初始化
void InitSciC(void)
{
ScicRegs.SCICCR.all =0x0007; // 1位停止位,无奇偶校验,禁止回送检测(如果使能
// 回送检测,则发送引脚和接收引脚在dsp内部被连接,
// 空闲线协议模式,8位数据位。
ScicRegs.SCICTL1.all =0x0003; // 使能发送器,接收器
ScicRegs.SCIHBAUD.all = 0x00; //19200波特率
ScicRegs.SCILBAUD.all = 0xF3;
//ScicRegs.SCIHBAUD.bit.BAUD = 0x00;
//ScicRegs.SCILBAUD.bit.BAUD = 0xF3;
// ScicRegs.SCICTL2.all =0x0003;
ScicRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
ScicRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
//当FIFO接收字数大于等于3时,产生FIFO接收中断
//在FIFO的寄存器SCIFFRX中,RXFFST4~0 >= RXFFIL4~0时接收中断才会发生
//在TX的过程中也是一样。
ScicRegs.SCIFFRX.all= 0xE061;
//ScibRegs.SCIFFCT.all = 0x0;
//ScicRegs.SCIFFRX.all=0x2044;
ScicRegs.SCICTL1.bit.SWRESET = 1;
}
interrupt void SCIC_RX_isr(void)
{
//若规定时间内接收数据没有达到8字节,应该清空接收缓冲区
//unsigned int SCIC_rxdCount_Timer = 0;
//每次进串口中断清零 SCIC_rxdCount_Timer =0;
SCIC_rxdCount_Timer = 0;
//50us interrupt 里边 : SCIC_rxdCount_Timer ++;
SCIC_RxdBuffer[SCIC_rxdCount] = ScicRegs.SCIRXBUF.all;
SCIC_rxdCount++;
//这里判断地址,并判断功能码
//因为主机指令全部为8个字节,所以只要 地址和功能码 符合,即默认是8个字节的指令
if(SCIC_rxdCount == 8) //应校验指令的合法性,防止是其他从机回送数据流的干扰
{
RxdLen=8;
SCIC_flg_Rxd_Complete = 1;
}
if(SCIC_rxdCount > 10)
{
SCIC_rxdCount = 10; //防止溢出
}
ScicRegs.SCIFFRX.bit.RXFIFORESET=0; //重置接收中断FIFO
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;
}
在中断函数中SCIC_rxdCount一直到不了8,数据读取一直存在问题,不知道怎么解决。麻烦大家看看。
user5177434:
回复 mangui zhang:
解决了。是因为时钟匹配的问题。谢谢你。