DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 202|回复: 0
打印 上一主题 下一主题

SST89C54/58简介

[复制链接]
跳转到指定楼层
楼主
发表于 2011-5-11 01:06:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SST89C54/58简介

一.  SST89C54/58性能简介
二.  SST89C54/58功能图
兼容于INTEL公司的P87C54/58,扩展了IAP及4K  E2PROM。

三.  SST89C54/58程序空间
在动态修改Block0程序的问题上,应当确保将要加载的程序正确无误,至少做到进入Block1块入口程序的正确性,否则就只有借助编程器来烧录自举程序了。但这样就失去IAP的意义,不可不察。
在本公司的LOG2001  USB  DEMO  KIT开发系统上,需要完全更新Block0块的内容,让用户真实拥有P87C54/58的全部功能。这样,当用户在开发USB时,就不需要用定位器或者汇编语言来混合编程。只需象平时那样操作自己熟悉的C51开发环境。
LOG2001  USB  DEMO  KIT开发系统使用UART来传送Firmware,其默认Buadrate为9600bps。除了确保自举程序入口正常以外,串口的Buadrate在当次也要相符。改动Buadrate只有在装载成功以后才有效。
一般来说,在完全掌握IAP及232口以前,而身边又缺乏编程器的情况下,应谨慎对待与之相关的程序语句。在本公司的LOG2001  USB  DEMO  KIT开发系统上,还预备有最后一种自举能力:硬件自举!  

四.  IAP编程模式

SST89C54/58除了提供IAP编程模式以外,也可以借助外力(如编程器)强行将程序灌入,就象写Flash  ROM一样。其实自举程序就唯有通过这种方式载入。称之为“外主编程模式”。
外主编程模式对于大多数程序员而言意义不大,有兴趣的话参阅SST89C54/58的  Datesheet,下面介绍IAP模式。
IAP模式就是CPU一边在某个Block  中运行,同时对另一个Block进行擦空,写入,校验等操作。注意,同一个Block内不允许Program。被Program的Block整个儿处于“忙”状态,其代码不可见。
IAP命令见下表:(略)
与此相关的特殊功能寄存器定义如下:
1.SFST
其中,SECDx为加密表,不同的加密级别将决定被加密单位对外的透明度,具体见下表:
2.SFCF
3.SFCM
4.SFDT
5.SFAL
6.SFAH

IAP程序设计:
对照上述介绍,很容易编写出IAP烧录函数,下面给出几个事例:
1.  块擦除:
void  block_erase  (unsigned  char  block)
{
unsigned  int  timeout  =  0xA555;
SFCF  =  0xC0;  
SFAH  =  block;  
SFDT  =  0x55;
SFCM  =  0x0D;

while  (--timeout){
if  (Busy  =  =  0)
return;
}
}
2.  字节编程:
void  byte_program  (unsigned  char  laddr,unsigned  char  haddr,unsigned  char  udata)
{
unsigned  char  timeout  =  0xFF;
SFCF  =  0xC0;
SFAH  =  haddr;  
SFAL  =  laddr;
SFDT  =  udata;
SFCM  =  0x0E;

while  (--timeout){
if  (  Busy  =  =  0)
return;
}
}
对于只需要Download  Firmware来说,上述两个函数已经够用。完整的IAP汇编子程序请参阅:http://www.ssti.com/
采用C语言编写IAP函数需要一定的技巧,它关系到定位并访问绝对地址等问题,而且这些函数只是应用系统中的一小部分,虽然嵌汇编或者纯汇编更便于处理绝对地址,但却不利于整个大系统,有点丢西瓜的味道。
LOG2001  USB  DEMO  KIT开发系统的自举程序使用纯C语言编写,而且也适用于低价位的SST89F54/58(和Philips的价位比大概二比一吧)。
如何拿IAP来当I2C使用,以便节省24LCxx或93Cxx呢。Sector的概念在这里尤为重要,因为改动数据不能影响程序,故而要求在小范围内操作。下面是关于Sector的函数:
void  sector_erase  (unsigned  int  sector)
{
unsigned  int  timeout  =  0xA555;
SFCF  =  0xC0;  
SFAH  =  sector  /256;  
SFAL  =  sector;  
SFCM  =  0x0B;

while  (--timeout){
if  (Busy  ==  0)
return;
}
}
如果仅仅要修改某一两个Byte,可将该Sector内的数据全部保存于RAM中,改好后再全部回送Sector。
一般来说,数据Sector应设置在Block1的高端,这样才不会和CODE竞争。

五.  SST89C54/58发展系统

前面说过,SST89C54/58兼容于INTEL的P87C54/58,故而其编译环境毋须作大的改动,如果不打算使用IAP功能,干脆一点也不改。
扩展IAP功能,对于汇编语言来说,只是在源文件开头用EQU或DATA伪指令定义那六个新增加的SFR地址即可。而C语言也同样在头文件中增加定义的SFR地址。本公司网站(www.usb11.com)上有SST89C58.h供Download。可将其直接替代>。
因为是IAP,仿真器不太重要,其实目前也没有专门针对SST89C54/58的仿真器。即便有也没市场,IAP应用最多的地方也就是当仿真器!

六.  IAP应用场合

第一,IAP很方便,在网络高速发展的今天,具备远程升级软件的产品无疑将受到欢迎。
第二,在编译代码的时候,对于稍稍多出来的一些程序代码,可将其定位到Block1,从而避免购买更高容量的IC。
第三,在需要保存过程数据的系统,可将原先的外部存储器去掉,直接拿Block1当成外部E2PROM。此时,Block1等同于24LC32,而且操作速度要比24LC32快几十上百倍。
第四,IAP在线软件更新,没有死角,包括自举程序本身也可以重来,且毋须借助任何外力。仿真器的一大特点不就是编译装载吗!没错,很多地方就拿它来当仿真器使用。
若要观察程序变量,IAP的解决办法是通过UART输出调试信息。LOG2001  USB  DEMO  KIT就是采用这一调试技术。一点也不逊色于仿真器,特别在USB枚举的过程中,仿真器特有的单步,中断功能不可用,此时唯有UART可以信赖。详情请见《USB枚举步骤》。
IAP当仿真器的另一买点就是价廉物美,区区几十元RMB的材料钱就可搞定。特别适合于单片机初学者。
传统的仿真器在电气性能方面,还无法做到和应用系统完全一致,这就是常见的“仿真通过,烧片不行”的毛病。IAP虽说是仿真,其实就是实际应用,不存在电气性能或者物理接口方面的问题。
第五,产品小型化。一般地说,SMD只适合于大批量的生产厂家,因为SMD测试工具也是一笔不小的投资。如果商家在出售SST89C54/58以前,预先导入自举程序,则用户拿了SMD之后,可以先装配,再烧录,管它大封装,小封装还是微封装呢!
关于LOG2001  USB  DEMO  KIT自举程序的入口及入口参数设置,在本文附录中给出。

附录
LOG2001  USB  DEMO  KIT自举程序入口参数

下列参数要求通过UART输入:
1.  “h”:选择Download  INTEL格式文件*。hex;
2.  “b”:选择Download  诚通格式文件*。Rom,它和*。Hex区别是将ASIC码转换成bin数据,并去掉“0D,0A”等控制信息。数据量压缩一倍,节省时间;
3.  输入第一次“h”或者“b”之后,自举程序将返回一个确认符0x20(空格),如果再次肯定要改写Firmware,第二次输入“h”或者“b”才启动擦除和写入。否则不改变原来的Firmware;
4.  输入其它代码,则系统提示错误后复位系统;
5.  自举程序入口地址:0xF8DD,不带任何参数,只需置好Buadrate;
下面给出入口事例函数,可将其嵌入任何用户系统,实际上,  LOG2001  USB  DEMO  KIT开发系统就是使用如下语句:
if  (RI)
{
switch  (  _getkey()  )
{
case  ‘p‘:
((  void  (code  *)(void)  )  &hard_reload[0]  )();
break;
default:break;
}
}  //  if  reload  firmware
当然,在进入自举程序以前,还要设置好Buadrate等等一系列参数。自举程序将采用这些设置而不作任何修改。
下面是自举程序:
switch  (_getkey())
{
case  ‘h‘:
sst_send232  (‘  ‘);

if  (  _getkey()  !=  ‘h‘)
goto  nError;

sst_block_erase  (0x00);
while  (  read_write_hex_line  (0x00)  );
break;

case  ‘b‘:
sst_send232  (‘  ‘);

if  (  _getkey()  !=  ‘b‘)
goto  nError;

sst_block_erase  (0x00);
while  (  read_write_bin_line  (0x00)  );
break;

nError:  default  :
printf  ("\nError!\n");
printf  ("\n‘h‘:for  (*.hex);\n");
printf  ("\n‘b‘:for  (*.rom);\n");
((  void  (code  *)  (void)  )  &reset_0x0000  [0])  ();
break;
}
Download文件最大可达32K,装载完成之后,采用20秒钟倒记时,自动复位运行刚刚Download的程序,毋须任何机械动作。
由于某种原因而破坏入口函数,则只有通过编程器来恢复。在烧写入口函数的时候,请先限制DEVICER  Buffer  Size在0x8000之内,以免连锁破坏自举程序。
为了便于调试USB及其装载IAP不会出错,本公司特推出“USB集成化开发环境”,它具有如下功能:
1.  USB功能调试,详情请参阅《USB集成化开发环境》;
2.  串口精灵,可任意设置串口参数,收发单个数据或者文件,接受单片机C语言的人机信息(printf,scanf,  _getkey()等等);
3.  IAP程序下载。IAP不须要任何机械动作,可以直接全面而彻底更新firmware,稍微操作不当就会影响到自举程序。《USB集成化开发环境》有多重查验措施,用户只需全神关心自己的源文件就是了;
4.  自动叠加硬件自举功能,不管用户如何修改Firmware,即便死机,或者是由于前次IAP时中途停电而造成程序飞跑,仍然可通过该功能下载程序。具体是:P2.0=P2.1à“h”à“  h”à*.hex。
5.  C51编译(可选),建立好开发环境也是件十分重要工作,尤其是初学者
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-18 03:17 , 耗时 0.094746 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表