打印

SCI如何接收一组数据

[复制链接]
2498|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
z_jzhao|  楼主 | 2012-11-19 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include
"DSP28x_Project.h"
// Device Headerfile and Examples Include File
#define CPU_FREQ
60E6
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ
100E3
#define SCI_PRD
(LSPCLK_FREQ/(SCI_FREQ*8))-1
// Prototype statements for functions found within this file.
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 error(void);
// Global variables
Uint16 sdataA[8];
// Send data for SCI-A
Uint16 rdataA[8];
// Received data for SCI-A
Uint16 rdata_pointA; // Used for checking the received data
void main(void)
{

Uint16 i;

InitSysCtrl();

InitSciGpio();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW;
// This is needed to write to EALLOW protected registers

PieVectTable.SCIRXINTA = &sciaRxFifoIsr;

PieVectTable.SCITXINTA = &sciaTxFifoIsr;

EDIS;
// This is needed to disable write to EALLOW protected registers

for(i = 0; i<8; i++)

{

sdataA = i;

}

rdata_pointA = sdataA[0];
// Enable interrupts required for this example

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
// Enable the PIE block

PieCtrlRegs.PIEIER9.bit.INTx1=1;
// PIE Group 9, INT1

PieCtrlRegs.PIEIER9.bit.INTx2=1;
// PIE Group 9, INT2

IER = 0x100;
// Enable CPU INT

EINT;

for(;;);
}
void error(void)
{

asm("
ESTOP0"
); // Test failed!! Stop!

for (;;);
}
interrupt void sciaTxFifoIsr(void)
{

Uint16 i;

for(i=0; i< 2; i++)

{

SciaRegs.SCITXBUF=sdataA;
// Send data

}

for(i=0; i< 2; i++)
//Increment send data for next cycle

{

sdataA = (sdataA+1) & 0x00FF;

}

SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;
// Clear SCI Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100;
// Issue PIE ACK
}
interrupt void sciaRxFifoIsr(void)
{

Uint16 i;

for(i=0;i<2;i++)

{

rdataA=SciaRegs.SCIRXBUF.all;
// Read data

}

for(i=0;i<2;i++)
// Check received data

{

if(rdataA != ( (rdata_pointA+i) & 0x00FF) ) error();

}

rdata_pointA = (rdata_pointA+1) & 0x00FF;

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
// Clear Overflow flag

SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
// Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100;
// Issue PIE ack
}
void scia_fifo_init()
{

SciaRegs.SCICCR.all =0x0007;
// 1 stop bit,
No loopback

// No parity,8 char bits,

// async mode, idle-line protocol

SciaRegs.SCICTL1.all =0x0003;
// enable TX, RX, internal SCICLK,

// Disable RX ERR, SLEEP, TXWAKE

SciaRegs.SCICTL2.bit.TXINTENA =1;

SciaRegs.SCICTL2.bit.RXBKINTENA =1;

SciaRegs.SCIHBAUD = 0x0000;

SciaRegs.SCILBAUD = SCI_PRD;

SciaRegs.SCICCR.bit.LOOPBKENA =1;
// Enable loop back

SciaRegs.SCIFFTX.all=0xC022;

SciaRegs.SCIFFRX.all=0x0022;

SciaRegs.SCIFFCT.all=0x00;

SciaRegs.SCICTL1.all =0x0023;
// Relinquish SCI from Reset

SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;

SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}

上述程序功能是在28035中运行,发送sdataA[0],sdataA[1]的数据,接收数据存放在rdataA[0],rdataA[1]中,运行没问题,
我将其改成发送sdataA[0]~sdataA[7],并将接收数据存放在rdataA[0]~rdataA[7]中,并修改以下代码:
for(i=0; i< 7; i++)//共四处
SciaRegs.SCIFFTX.all=0xC028;
SciaRegs.SCIFFRX.all=0x0028;
运行时就出错了。但是我用同样的更改在28335中运行,又是正常,请教是什么原因。如何解决才能在28035中运行正常。

相关帖子

沙发
z_jzhao|  楼主 | 2012-11-20 10:46 | 只看该作者
自已顶一下。有人知道的请指教!

使用特权

评论回复
板凳
z_jzhao|  楼主 | 2012-11-21 16:32 | 只看该作者
这里有没有人啊?

使用特权

评论回复
地板
happy啦啦啦| | 2012-11-21 20:03 | 只看该作者
虽然我不知道为什么,但是可以帮你顶啦

使用特权

评论回复
5
readygo2012| | 2012-11-21 23:38 | 只看该作者
这个问题没遇见过,我也帮帮你,希望又高手看到。

使用特权

评论回复
6
z_jzhao|  楼主 | 2012-11-22 10:06 | 只看该作者
我看到28035的例程中,也只是发送两个数据,我把它改成发送八个数据,也是不行。不知道哪里还需要修改?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

72

帖子

0

粉丝