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

有关MC9S12DP256串口通讯

看来,有越来越多的人关注16位的MCU啦,太好了。你的问题也是我非常想知道的,我认为,如果自己来编写,那写出来之后就能卖钱啦,清华的一本书里头给出了“监控程序的源代码”,我想,有了那个东东,通讯起来就不成问题啦

……写到这儿,突然有点迷惑,监控程序和刚才strongchens说的:
S12的单片机通过BDM与主机进行通讯,所以一般要用一个BDM的接口电路,就是你们说的“下载线”。实际上这个接口电路用户也可以自己做。BDM的通讯命令和时序在S12手册中BDM模块的介绍中有详细说明。实际上清华大学邵老师那里就是自己用S12芯片做了一个这样的接口电路。它用串口与PC的HperTerminal通讯,同时与目标板通过BDM进行通讯。

通过BDM和串并口都可以访问MCU,是这样吗?那他们有什么关系呢??我现在糊涂了,我现在概念极为不清楚
BDM好像原意是背景调试,我想这个应该是用来调试程序用的。而串口就是SCI啦,应该是和其他计算机(不一定是PC机)通讯用的。我的浅薄的看法!嘻嘻
有道理,不过,我还是不清楚,看来是基础太薄弱了。这样说吧,比如,
现在我有一台电脑,有串口、有并口(USB就暂时不考虑啦);有一块MC9S12DP256的最小系统板,包括时钟

电路、串口电路、BDM接口、供电电路、复位电路。现在这块DP256芯片存储器应该是还没有任何程序吧(

是吗?)然后,我需要PC与这块最小系统板进行通讯,
1。用PC的串口与最小系统板的串口电路;
2。用PC的并口与最小系统板的串口电路(可以吗?);
3。利用PC的串口或者并口通过最小系统板的BDM进行通讯

凡此种种,我要实现的通讯目的就是将写的程序代码在该最小系统内执行,比如控制PORTB的输出,这以上的几种方案,是不是可行?可行的话,那又有和区别,根本的地方是什么呢??

(我现在碰到的问题是,如何将Codewarrior的程序写到MCU中)
BDM是S12的背景调试模块,是用来进行调试和编程的。上位机(如PC)可以BDM接口与S12单片机通讯,对它进行编程或调试。这时S12单片机处于调试状态,并非处于正常运行状态。只有当BDM接口断开后,S12单片机才进入正常运行状态。在调试状态或正常状态下,S12都可以通过各种通讯方式与别的芯片或PC进行通讯,但必须在其内部程序的控制之下进行。而BDM通讯是不需要芯片内部程序的参与的。
海纳百川  有容乃大
反复看了几遍strongchen的答复,确是明白许多,看来,我离“一览众山小”的水平还很远很远,只要继续努力落。综合以上:
BDM可以对S12进行编程;
串、并或者说USB口则可以在监控程序之下与S12进行通讯。
所以,我觉得从开发顺序上,BDM通讯是必须的,因为即使用后者方式进行通讯,监控程序还是要依靠BDM方式先写入S12中的,是不是这样理解呢?
看了strongchen的解释,对BDM的理解又加深了!不知道strongchen能否贴个串口通讯的,让小弟参考一下,拜谢了
哈哈,我想,那属知识产权范畴吧,我要是有,也不会轻易贴出来的,不过,我希望给予我们这些单片机爱好者一些监控的Demo之类的东东,功能可能只是很少,学学写更完善的监控程序,其实是对单片机更清晰的了解、认识
(离下班不远了,在烦扰大家一下)
邵老师的那本书里,给出了一个监控程序源代码,可是从程序行数来看,很是恐怖,有点让人望而却步,在我还没仔细看S12手册中BDM模块的介绍之前,能否给予一些概括,或者说提示,使我这个初学者能沿着前辈的肩膀继续前行,已经很感激大家了。


[此贴子已经被作者于2005-3-21 17:08:11编辑过]

ask_dfr的理解似乎有些不对。主要是:S12单片机通过别的通讯方式进行通讯,并不需要所谓的监控程序,而是需要用户自己的应用程序进行控制。
S12芯片刚拿到的时候,里面是空的。所以只能通过BDM进行通讯。当用户程序写到芯片内部后,就能通过别的方式进行通讯了。
海纳百川  有容乃大
S12单片机通过别的通讯方式进行通讯,并不需要所谓的监控程序,而是需要用户自己的应用程序进行控制?

真的吗?那么,自己如何用程序进行控制呢??答案是不是在参考手册BDM部分有介绍?
(看到这句话,真是欣喜异常,自己写,摆脱束缚,迫切需要比较详细的答复)
各种不同的通讯方式在各自的模块说明中有详细的介绍。如SCI通讯在SCI模块中介绍,SPI通讯在SPI模块中介绍,CAN通讯在CAN模块中介绍,USB通讯在USB模块中介绍...
海纳百川  有容乃大

有关MC9S12DP256串口通讯

小弟刚接触MC9S12DP256,看资料有一段时间了。现在主要涉及串口通讯,不知道哪个大虾能贴一段串口通讯的程序。最好有如何初始化,如何收发等等,希望能有所启发。拜谢
#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12dp256b" #define CRYSTAL 16000000 /*8Mhz crystal*/ #define LOCK 8 #define PLLSEL 0x80 //; use PLL for system clocks. #define Eclock 16000000// ; final E-clock frequency (PLL) #define RefClock 1000000 #define REFDVVal (CRYSTAL/RefClock)-1 #define SYNRVal (Eclock/RefClock)-1 byte c; /**************************************************************************** * init_PLL() - * * To initialize the PLL for system use. *****************************************************************************/ void init_PLL(void) { REFDV = REFDVVal; // set the REFDV register to give us a 1.0 MHz reference. SYNR = SYNRVal; // set the SYNR register to give us a 8.0 MHz E-clock. asm nop // nops required for PLL stability. asm nop asm nop asm nop while ((CRGFLG&LOCK)==0); // wait here till the PLL is locked. CLKSEL|= PLLSEL; // switch the bus clock to the PLL. } /************************************************************************** * SCI initialization * ***************************************************************************/ void init_SCI() { SCI0BD=Eclock/16/9600; SCI0CR2_RE=1; SCI0CR2_TE=1; SCI0CR2_RIE=1; SCI0CR2_TCIE=1; SCI0CR2_SCTIE=1; } /************************************************************************** * Timer initialization * ***************************************************************************/ void init_Timer() { TSCR2=0x87; //Enable main timer overflow interrupt COPCTL =0; // disable cop TSCR1=0xA0; //Enable main timer functionality } #pragma CODE_SEG __NEAR_SEG NON_BANKED #pragma TRAP_PROC void interrupt SCI0_REC(void){ c = SCI0SR1; c = SCI0DRL; PORTB=c; } #pragma CODE_SEG DEFAULT /************************************************************************** * Main routine * ***************************************************************************/ void main(void) { /* put your own code here */ //unsigned int i; // init_PLL(); init_SCI(); //init_Timer(); EnableInterrupts; DDRB = 0xFF; for(;;) { ; // Trans /* while(!SCI0SR1_TDRE); SCI0DRL = 0x30; while(!SCI0SR1_TC); while(!SCI0SR1_TDRE); SCI0DRL = 0x31; while(!SCI0SR1_TC); //while(!SCI0SR1_RDRF); //PORTB=SCI0DRL; if(TCNT==0xff00) PORTB++; if(TFLG2_TOF==1) i=TCNT; /*i=0xFFFF; PORTB=0x0F; while((i--)!=0); i=0xFFFF; PORTB=0xF0; while((i--)!=0);*/ } /* wait forever */ }
谢谢yunfeng的帮助
多谢老大的回复
返回列表