我从i为2833x设备调制scia_loopback_interrupts开始。 基本上,当通过LOOPBKENA寄存器为SCIA和SCIC配置启用环回时,该示例对这两种配置都起作用。 但是,当我从LOOPBKENA寄存器禁用回送时, 当RX上有实际信号时,我不再收到接收中断。
我通过使用RS485 IC手动将TX缩短到RX来测试它(启用IC的驱动器启用和接收启用基本上可以完成此任务), 通过示波器查看RX引脚上的信号,一切对我来说都很好,配置上没有区别,除了手动完成环回而不是使用LOPBKENA寄存器。
下面是我在示例中修改的代码。
Void主(void)
{
UINT16 I;
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2833x_sysctrl.c文件中。
InitSysCtrl();
//步骤2. 初始化GPIO:
//此示例函数可在DSP2833x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();
//仅为SCI-A和SCI-B功能设置GP I/O
//此函数位于DSP2833x_Sci.c中
InitSCI_GPIO ();
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;
//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
InitPieCtrl();
//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2833x_DefaultIsr.C.中找到
//此函数位于DSP2833x_PieVect.C.中
InitPieVectorTable();
//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW; //这是写入EALLOW保护寄存器所必需的
PieVectorTable.SCIRXINTA =&sciaRxFifoIsr;
PieVectorTable.SCIRXINTC =&scicRxFifoIsr;
EDIS; //这是禁用写入EALLOW保护寄存器所必需的
//步骤4. 初始化所有设备外围设备:
//此函数位于DSP2833x_InitPeripherals.c中
// InitPeripherals();//本示例不需要
scia_fifo_init();// 初始化SCI-A
scic_fifo_init();// 初始化SCI-A
//步骤5. 用户特定代码,启用中断:
//初始化发送数据。 每次传输后,此数据
//将为下一次传输更新
用于(i = 0;I<8;I++)
{
sdataA[i]= i;
}
RDATA_pointA = sdataA[0];
//启用此示例所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE =1; //启用PIE块
PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE组9,INT1 SCIRXINTA,
PieCtrlRegs.PIEIER8.bit.INTx5=1; // PIE组8,INT5 SCIRXINTC
IER = 0x180; //启用CPU INT 9和8
EINT;
//步骤6。 空闲循环。 只需坐下来永远循环(可选):
对于(;;)
{
while (SciaRegs.SCIFFTX.Bit.TXFFST !=0){}
对于(i=0;i< 8;i++)
{
SciaRegs.SCITXBUF=sdataA[I];// 发送数据
}
while (ScicRegs.SCIFFTX.bit.TXFFST !=0){}
对于(i=0;i< 8;i++)
{
ScicRegs.SCITXBUF=sdataA[I];// 发送数据
}
}
}
__interrupt void sciaRxFifoIsr (void)
{
UINT16 I;
对于(i=0;i<8;i++)
{
rdataA[i]=SciaRegs.SCIRXBUF.all; //读取数据
}
SciaRegs.SCIFFRX.Bit.RXFFOVRCLR=1; //清除溢出标志
SciaRegs.SCIFFRX.Bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACK.ALL |= PIEACK_group9; //发出pie ack
}
__interrupt void scicRxFifoIsr (void)
{
UINT16 I;
对于(i=0;i<8;i++)
{
rdataA[i]=ScicRegs.SCIRXBUF.ALL; //读取数据
}
ScicRegs.SCIFFRX.Bit.RXFFOVRCLR=1; //清除溢出标志
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACK.ALL || PIEACK_group8;
}
void scia_fifo_init()
{
SciaRegs.SCICCR.ALL =0x0007; // 1停止位, 无回送
//无奇偶校验,8个字符位,
//异步模式,空闲线路协议
SciaRegs.SCICTL1.all =0x0003; //启用TX,RX,内部SCICLK,
//禁用RX ERR,睡眠,TXWAKE
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 7;//(30E6/4)/((7+1)*8)=11.7187万波特率,从11.52万波特创建1.72 错误(2 % 错误或更低是理想的)
SciaRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
SciaRegs.SCIFFTX.All=0xC028;
SciaRegs.SCIFFRX.all=0x0028;
SciaRegs.SCIFFCT.All=0x00;
SciaRegs.SCICTL1.all =0x0023; //从重置放弃SCI
SciaRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.Bit.RXFIFORESET=1;
}
void scic_fifo_init()
{
ScicRegs.SCICCR.ALL =0x0007; // 1停止位, 无回送
//无奇偶校验,8个字符位,
//异步模式,空闲线路协议
ScicRegs.SCICTL1.ALL =0x0003; //启用TX,RX,内部SCICLK,
//禁用RX ERR,睡眠,TXWAKE
ScicRegs.SCICTL2.bit.TXINTENA =1;
ScicRegs.SCICT2.bit.RXBKINTENA =1;
ScicRegs.SCIHBAUD = 0x0000;
ScicRegs.SCILBAUD = 7;//(30E6/4)/((7+1)*8)=11.7187万波特率,从11.52万波特创建1.72 错误(2 % 错误或更低是理想的)
ScicRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
ScicRegs.SCIFFTX.all=0xC028;
ScicRegs.SCIFFRX.all=0x0028;
ScicRegs.SCIFFCT.All=0x00;
ScicRegs.SCICTL1.ALL =0x0023; //从重置放弃SCI
ScicRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
}
void InitSCI_GPIO ()
{
EALLOW;
//
//为所选引脚启用内部上拉
//用户可以启用或禁用上拉功能。
//这将启用指定引脚的上拉。
//
gpioCtrlRegs.GPBPUD.bit.GPIO36 = 1; //禁用GPIO36的上拉(SCIRXDA)
gpioCtrlRegs.GPBPUD.bit.GPIO35 = 1; //禁用GPIO35的上拉(SCITXDA)
//
//将所选引脚的限定条件设置为仅异步
//默认情况下,输入与SYSCLKOUT同步。
//这将为所选引脚选择异步(无限定条件)。
//
gpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; //异步输入GPIO36 (SCIRXDA)
//
//使用GPIO寄存器配置SCI-A引脚
//这指定了哪些可能的GPIO引脚将是SCI功能引脚
//引脚。
//
gpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1;//将GPIO36配置为SCIRXDA
gpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1;//将GPIO35配置为SCITXDA
gpioCtrlRegs.GPCPUD.bit.GPIO72 = 1; //禁用接收启用SCIA的上拉菜单
gpioCtrlRegs.GPBPUD.bit.GPIO45 = 1; //禁用接收启用SCIA的上拉菜单
gpioCtrlRegs.GPBPUD.bit.GPIO44 = 1; //禁用驱动器启用SCIA的上拉菜单
//
//使用GPIO寄存器配置SCI-A引脚
//这指定了哪些可能的GPIO引脚将是SCI功能引脚
//引脚。
//
GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 0;
gpioCtrlRegs.GPBMUX1.bit.GPIO45 = 0;
gpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO72 = 1;
gpioCtrlRegs.GPBDIR.bit.GPIO45 = 1;
gpioCtrlRegs.GPBDIR.bit.GPIO44 = 1;
GpioDataRegs.GPCSET.bit.GPIO72 = 1;//未启用接收
GpioDataRegs.GPBSET.bit.GPIO45 = 1;//未启用接收
GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;//驱动器未启用
//
//为所选引脚启用内部上拉
//用户可以启用或禁用上拉功能。
//这将启用指定引脚的上拉。
//
gpioCtrlRegs.GPBPUD.bit.GPIO62 = 1; //禁用上拉(SCIRXDC)
gpioCtrlRegs.GPBPUD.bit.GPIO63 = 1; //禁用上拉(SCITXDC)
//
//将所选引脚的限定条件设置为仅异步
//默认情况下,输入与SYSCLKOUT同步。
//这将为所选引脚选择异步(无限定条件)。
//
gpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3; //异步输入GPIO62 (SCIRXDC)
//
//使用GPIO寄存器配置SCI-A引脚
//这指定了哪些可能的GPIO引脚将是SCI功能引脚
//引脚。
//
gpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1;//将GPIO62配置为SCIRXDC
gpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1;//将GPIO63配置为SCITXDC
gpioCtrlRegs.GPCPUD.bit.GPIO65 = 1; //禁用接收启用SCIC的上拉菜单
gpioCtrlRegs.GPCPUD.bit.GPIO64 = 1; //禁用驱动器启用SCIC的上拉菜单
//
//使用GPIO寄存器配置SCI-A引脚
//这指定了哪些可能的GPIO引脚将是SCI功能引脚
//引脚。
//
GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0;
GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO65 = 1;
GpioCtrlRegs.GPCDIR.bit.GPIO64 = 1;
GpioDataRegs.GPCSET.bit.GPIO65 = 1;//未启用接收
GpioDataRegs.GPCCLEAR.bit.GPIO64 = 1;//驱动器未启用
EDIS;
}