首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SCI 中断发送问题???

要仔细检查一下信号的波特率是否准,发送端和接收端的格式是否匹配。
海纳百川  有容乃大
这么一大段程序,还真不好办呢:))。要么你把整个PROJECT打包贴出来,我有空时试试吧。
海纳百川  有容乃大
你的数据格式为什么要选9位而不是8位的?
海纳百川  有容乃大
有没有用示波器看过波形?数据和脉冲宽度是否正确?
海纳百川  有容乃大
数据长度并不包括校验位。
海纳百川  有容乃大
我把程序稍微改了一下,你试试看(主要是对TDRE的操作)。

interrupt 20 void SCI0_rx(void)
{
if (SCI0SR1 & 0x80)
{ /*If transmission flag is set*/
SCI0SR1;
//if(*(SCIStringp++) != '\0')
if (g_pSci1TxHead != g_pSci1TxBufEnd)
{
//if(*SCIStringp > 0xD)
//{ /*Avoid to change CR and LF characters*/
// SCI0DRL=*SCIStringp + Stringcase;
//}
//else{
g_pSci1TxHead++;
SCI0DRL= *SCIStringp++;;
//}
}
else
{
g_pSci1TxHead = SCIString;
SCIIniTx=START_CYCLE; /*Start new transmission cycle*/
/*SCI0CR2 &= 0x7F; /*Disable TDRE interrupt*/
}
}

if(SCI0SR1 & 0x20){ /*If reception flag is set*/
SCI0SR1;
if(SCI0DRL == 'U' || SCI0DRL == 'u'){
Stringcase = 0x00; /*Uppercase the character string*/
}
else if(SCI0DRL == 'L' || SCI0DRL == 'l'){
Stringcase = 0x20; /*Lowercase the character string*/
}
}

return;
}

#pragma CODE_SEG DEFAULT
//************************************************************************
// SCI²ÎÊýÉèÖÃ
//************************************************************************
void Init_SCI(void)
{
//SCI0ÓëMonitorͨÐÅ
////SCI0BDL=6;
SCI0BDL=13;
SCI0BDH=0; //CLOCK=7.3728MHz, bps=38400
////SCI0CR1=0x16; //9 bit, żЧÑé
SCI0CR1=0x06; //8 bit, żЧÑé
SCI0CR2=0x2C; //ÖÐÖ¹·û²úÉúÆ÷¹Ø±Õ
SCI0CR2 |= 0x80; /*Enable TDRE interrupt*/
}

void SCITx(unsigned char SCIByte){

SCI0DRL = SCIByte; /*Write data byte to SCIDRL register*/
/*SCI0CR2 |= 0x80; /*Enable TDRE interrupt*/
}

void main(void)
{
/*
DDRB = 1;
while (1){
PORTB_BIT0^=1;
}*/
/* put your own code here */
EnableInterrupts;
Init_SCI();
SCIIniTx = START_CYCLE; /*Initialize transmission cycle flag*/

for (;;)
{
if(SCIIniTx == START_CYCLE){
SCIIniTx = WAIT_CYCLE;

SCIStringp=SCIString; /*Set pointer to character string*/
SCITx(*SCIStringp + Stringcase);/*Send first byte of string*/
}

}
}

[此贴子已经被strongchen于2007-3-30 15:34:02编辑过]

海纳百川  有容乃大
你是对的,在SCI的Datasheet中,数据长度应该包括校验位。 但是在某些通讯软件中,数据长度的定义可能有所不同。如在HyperTerminal中,它的数据长度就没有9位的选项。

[此贴子已经被strongchen于2007-4-2 9:41:04编辑过]

海纳百川  有容乃大
附件在你的程序基础上略作修改。用HyperTerminal通讯效果很好,没有错码出现。注意我用的是16M的外部时钟,8M的总线频率;8位数据长度,无校验位。你可以试试。

http://bbs.eccn.com/uploadImages/Temp.rar
海纳百川  有容乃大
这是HyperTermian通讯的截图。注意每次“A”都发了2次,这应该是你程序的问题。
[upload=image/pjpeg]uploadImages/New Picture.jpg[/upload]
海纳百川  有容乃大
我这边试下来并没有问题。看起来你的硬件可能有问题,也可能是晶振频率或信号不稳定。
海纳百川  有容乃大
返回列表