Board logo

标题: 求助 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