标题: 求助 MC9S08DZ60 SCI 模块的SCI1D不可写 [打印本页]
作者: xlhbyd 时间: 2008-7-28 11:50 标题: 求助 MC9S08DZ60 SCI 模块的SCI1D不可写
最近在调试SCI模块,发现有一些寄存器写了数据进去后,寄存器的值不会改变, 我用的芯片是MC9S08DZ60,SCI模块的初始化程序如下:
void initSci(void)
{
SCI1BDH = 0x00;
SCI1BDL = 0x34;
SCI1C1 = 0x00;
SCI1C2 = 0x64; SCI1C3 = 0x00;
}
之后,不管什么改 向SCI1D数据寄存器中写入数据,SCI1D中的值始终为0,都不会改变,请求高手赐教,小弟感激不尽。
作者: strongchen 时间: 2008-7-28 15:02
SCI模块的数据寄存器实际上是两个寄存器,一个是发送数据寄存器,一个是接收数据寄存器,它们共用一个地址。当对这个地址写入时,数据写入发送寄存器;当读这个地址时,读的是接收数据寄存器。所以读和写的数据经常是不一样的。
作者: xlhbyd 时间: 2008-7-28 16:39
我现在是写SCI1D这个寄存器的时候不管写什么,SCI1D都是为0。
作者: strongchen 时间: 2008-7-29 10:17
那SCI有通讯吗?接收数据了吗?
作者: lingyun1 时间: 2011-8-19 15:07
1# xlhbyd
大哥,你们这是怎样处理的啊!!急急啊啊
作者: wjckzdh 时间: 2011-8-28 20:16
本帖最后由 wjckzdh 于 2011-8-28 20:19 编辑
没那么烦,今天得空就贴一下我自己的程序,具体你自己看吧,已经隔了2年多了,因此解释不清
//===================================
//函数名:Init_SCI1
//函数功能:初始化SCI1,波特率10400
//===================================
void Init_SCI1(void)
{
SCI1BD = 96; //BR=BUSCLK/(16*Baud),BUSCLK=16MHz,Baud=10417,BR=16000000/(16*10417)=96;Baud=19200,BR=16000000/(16*19200)=52
SCI1C1 = 0x00;//
SCI1C2 = 0x24;//0x48 仅使能发送中断 0x24 仅使能接受中断 0x6C 使能发送和接收中断
}
//==========================================
//SCI1发送中断服务程序
//==========================================
void interrupt VectorNumber_Vsci1tx SCI1_TE(void)
{
unsigned char clrTE;
if(SCI1S1_TC)
{
clrTE=SCI1S1;
if(nSend<nDataLen)
{//发送的序号<总的需要发送的字节数
nSend++;
if(nSend>=nDataLen)
{
SCI1D= uartSumS;//发送数据校验和
}
else
{
SCI1D=sendTemp[nSend]; //发送下一个
uartSumS+=sendTemp[nSend];
}
}
else
{
SCI1C2 = 0x24;//0x48 仅使能发送中断 0x24 仅使能接受中断 0x6C 使能发送和接收中断
}
}
}
//==========================================
//SCI1接收中断服务程序
//==========================================
void interrupt VectorNumber_Vsci1rx SCI1_RE(void)
{
if(SCI1S1_RDRF)
{
SCI1S1_RDRF=0;
tempRec=SCI1D;
if(receNum<UART_MAX_REC_NUM)
{
receTemp[receNum]=tempRec;
receNum++;
}
else
{
//接收一帧完毕,设置一些标志,等待主程序处理
在主程序里处理完毕,如果要回应数据的话,要使能发送中断,在上面的发送中断里,如果全部回应数据发完要使能接收中断,以便接收下一帧数据,总之,是一种半双工方式
.........
}
}
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |