我对SCI回送测试有疑问。
请告诉我。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
为了解我的问题,Pleass按如下所示查找相关代码:(示例代码原件)
在底部,我提供了修改后的代码,请建议要进行的改进。
//###################################################################
//
//! \addtogroup F2803x_example_list
//! <H1>SCI数字回路与中断(scia_looping_interrupts)</H1>
//!
//! 此程序使用外围设备的内部回路测试模式。
//! 除引导模式引脚配置外,没有其它硬件配置
//! 是必需的。 同时使用中断和SCI FIFO。
//!
//! 发送数据流,然后与接收的数据流进行比较。
//! SCI-A发送的数据如下所示:\n
//! 00 01 \n
//! 01 02 \n
//! 02 03 \n
//! .... \n
//! FE FF \n
//! FF 00 \n
//! 等等。 \n
//! 这种模式将永远重复。
//!
//! \b监视变量\n
//! -\b sdataA,正在发送的数据
//! -\b"rdataA",已接收数据
//! -\b\RDATA_pointA,跟踪我们在数据流中的位置。
//! 这用于检查传入的数据
//
//###################################################################
//$TI发行版:F2803x C/C++头文件和外设示例V127 $
//$发布日期:2013年3月30日$
//###################################################################
#include "DSP28x_Project.h" //设备头文件和示例包括文件
#define CPU_FREQ 60E6.
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 100E3
#define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1
//本文件中找到的函数的prototype语句。
__interrupt void sciaTxFifoIsr (void);
__interrupt void sciaRxFifoIsr (void);
__interrupt void scibTxFifoIsr (void);
__interrupt void scibRxFifoIsr (void);
void scia_fifo_init(void);
void scib_fifo_init(void);
void错误(void);
//全局变量
UINT16 sdataA[2]; //发送SCI-A的数据
UINT16 rdataA[2];// 接收到SCI-A的数据
UINT16 RDATA_pointA;//用于检查接收到的数据
Void主(void)
{
UINT16 I;
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2803x_sysctrl.c文件中。
InitSysCtrl();
//步骤2. 初始化GPIO:
//此示例函数可在DSP2803x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();
//仅为SCI-A和SCI-B功能设置GP I/O
//此函数位于DSP2803x_Sci.c中
InitSciGpio();
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;
//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2803x_PIECTRL.c文件中。
InitPieCtrl();
//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2803x_DefaultIsr.C.中找到
//此函数位于DSP2803x_PieVect.C.中
InitPieVectorTable();
//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW; //这是写入EALLOW保护寄存器所必需的
PieVectorTable.SCIRXINTA =&sciaRxFifoIsr;
PieVectorTable.SCITXINTA =&sciaTxFifoIsr;
EDIS; //这是禁用写入EALLOW保护寄存器所必需的
//步骤4. 初始化所有设备外围设备:
//此函数位于DSP2803x_InitPeripherals.c中
// InitPeripherals();//本示例不需要
scia_fifo_init();// 初始化SCI-A
//步骤5. 用户特定代码,启用中断:
//初始化发送数据。 每次传输后,此数据
//将为下一次传输更新
用于(i = 0;I<2;I++)
{
// sdataA[i]= i;
sdataA[0]=54;
sdataa[1]=96;
}
RDATA_pointA = sdataA[0];
//启用此示例所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE =1; //启用PIE块
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE组9,INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE组9,INT2
IER = 0x100;//启用CPU INT
EINT;
//步骤6。 空闲循环。 只需坐下来永远循环(可选):
for (;;);
}
作废错误(void)
{
_ASM (" ESTOP0");//测试失败!! 停止!
(;;);
}
__interrupt void sciaTxFifoIsr (void)
{
UINT16 I;
对于(i=0;i< 2;i++)
{
SciaRegs.SCITXBUF=sdataA[I];// 发送数据
}
对于(i=0;i< 2;i++) //增量发送下一个周期的数据
{
sdataA[i]=(sdataA[i]+1)和0x00FF;
}
SciaRegs.SCIFFTX.Bit.TXFFINTCLR=1; //清除SCI中断标志
PieCtrlRegs.PIEACK.all|=0x100; //发出PIE ACK
}
__interrupt void sciaRxFifoIsr (void)
{
UINT16 I;
对于(i=0;i<2;i++)
{
rdataA[i]=SciaRegs.SCIRXBUF.all; //读取数据
}
对于(i=0;i<2;i++) //检查收到的数据
{
if (rdataA[i]!=((RDATA_pointA+I)& 0x00FF)) error();
}
RDATA_pointA =(RDATA_pointA+1)和0x00FF;
SciaRegs.SCIFFRX.Bit.RXFFOVRCLR=1; //清除溢出标志
SciaRegs.SCIFFRX.Bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACK.all|=0x100; //发出pie ack
}
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 = SCI_PRD;
SciaRegs.SCILBAUD = 0x00C2;
SciaRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
SciaRegs.SCIFFTX.All=0xC022;
SciaRegs.SCIFFRX.all=0x0022;
SciaRegs.SCIFFCT.All=0x00;
SciaRegs.SCICTL1.all =0x0023; //从重置放弃SCI
SciaRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.Bit.RXFIFORESET=1;
}
//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================
注意:我在这里更改 以下行:
UINT16 sdataA[5]; //发送SCI-A的数据
UINT16 rdataA[5]; //收到的SCI-A数据
UINT16 RDATA_pointA;//用于检查接收到的数据
-->在主循环中,变化是:
(i = 0;I<5;I++)
{
sdataA[i]= i;
}
-->在TX ISR中,更改是:
对于(i=0;i< 5;i++)
{
SciaRegs.SCITXBUF=sdataA[I];// 发送数据
}
用于(i=0;i<5;i++) //增量发送下一个周期的数据
{
sdataA[i]=(sdataA[i]+1)和0x00FF;
}
-->在RX ISR中,更改是:
对于(i=0;i<5;i++)
{
rdataA[i]=SciaRegs.SCIRXBUF.all; //读取数据
}
对于(i=0;i<5;i++) //检查收到的数据
{
if (rdataA[i]!=((RDATA_pointA+I)& 0x00FF)) error();
}