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

求助 MC9S08DZ60 SCI 模块的SCI1D不可写

求助 MC9S08DZ60 SCI 模块的SCI1D不可写

最近在调试SCI模块,发现有一些寄存器写了数据进去后,寄存器的值不会改变, 我用的芯片是MC9S08DZ60,SCI模块的初始化程序如下:
void initSci(void)
{
SCI1BDH = 0x00;
SCI1BDL = 0x34;
SCI1C1 = 0x00;
SCI1C2 = 0x64; SCI1C3 = 0x00;
}
之后,不管什么改 向SCI1D数据寄存器中写入数据,SCI1D中的值始终为0,都不会改变,请求高手赐教,小弟感激不尽。
SCI模块的数据寄存器实际上是两个寄存器,一个是发送数据寄存器,一个是接收数据寄存器,它们共用一个地址。当对这个地址写入时,数据写入发送寄存器;当读这个地址时,读的是接收数据寄存器。所以读和写的数据经常是不一样的。
海纳百川  有容乃大

我现在是写SCI1D这个寄存器的时候不管写什么,SCI1D都是为0。

那SCI有通讯吗?接收数据了吗?
海纳百川  有容乃大
1# xlhbyd
大哥,你们这是怎样处理的啊!!急急啊啊
本帖最后由 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
                        {
                        //接收一帧完毕,设置一些标志,等待主程序处理
                        在主程序里处理完毕,如果要回应数据的话,要使能发送中断,在上面的发送中断里,如果全部回应数据发完要使能接收中断,以便接收下一帧数据,总之,是一种半双工方式
                                   .........
                        }
                }
  }
}
返回列表