打印

做过ISP的高手进来指点迷津(附部分代码)

[复制链接]
2129|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大漠孤烟|  楼主 | 2007-8-9 00:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一下,在做AT89S51/52的ISP时需要注意那些事情?
电路按照S52的datasheet搭起来了,检查硬件也都好的,就是按下面的读写程序对单片机控制,读回来就是FFH,气死我了。
读写程序如下(Delphi 7):

procedure WriteByte(Port:word; bData : Byte; bTms : Byte);
var   iTckLow, iTdiVal, iTckHi : Byte;
      bVal:array[1..8] of Byte;
      i : integer;
      iScaletoW :  Byte;
begin
     iScaletoW := 1;
     for i := 1 to 8 do
     begin
     if ( bData and iScaletoW ) <> 0 then
     bVal := 1;
     iScaletoW := iScaletoW * 2;
     end;

     if bTms <> 0 then                      //TCK = 0
     PortOut(portadd1,$02)
     else
     PortOut(portadd1,$00);
     Pause(10);//Delay;

     if bTms <> 0 then                      //TMS = 1
     begin
     for i := 8 downto 1 do
     begin
          if bVal <> 0 then              //TDI = 1
          begin
                iTckLow := $02;
                iTdiVal := $42;
                iTckHi  := $43;
          end else
          begin                             //TDI = 0
                iTckLow := $02;
                iTdiVal := $02;
                iTckHi  := $03;
          end;
          PortOut(portadd1,iTckLow);
          Pause(10);//Delay;
          PortOut(portadd1,iTdiVal);
          Pause(10);//Delay;
          PortOut(portadd1,iTckHi);
          Pause(10);//Delay;


     end;
     end else                               //TMS = 0
     begin
     for i := 8 downto 1 do
     begin
          if bVal <> 0 then              //TDI = 1
          begin
                iTckLow := $00;
                iTdiVal := $40;
                iTckHi  := $41;
          end else                          //TDI = 0
          begin
                iTckLow := $00;
                iTdiVal := $00;
                iTckHi  := $01;
          end;
          PortOut(portadd1,iTckLow);
          Pause(10);//Delay;
          PortOut(portadd1,iTdiVal);
          Pause(10);//Delay;
          PortOut(portadd1,iTckHi);
          Pause(10);//Delay;
     end;
     end;

     if bTms <> 0 then                      //TCK = 0
     PortOut(portadd1,$02)
     else
     PortOut(portadd1,$00);
     Pause(10);//Delay;


end;


function ReadByte(Port:word; bTms : Byte):Byte;
var  iTckLo, iTckHi, iValue : Byte;
     i  :     integer;
     iValIn : Byte;
begin
     iValIn := 0;

     if bTms <> 0 then                      //TCK = 1
     PortOut(portadd1,$03)
     else
     PortOut(portadd1,$01);
     Pause(10);//Delay;


     if bTms <> 0 then                      //TMS = 1
     begin
     for i := 8 downto 1 do
     begin
          iTckLo := $02;
          iTckHi := $03;
          PortOut(portadd1,iTckLo);         //TCK TO 0
          Pause(10);//Delay;
          iValue := PortIn(Port);
          Pause(10);//Delay;
          PortOut(portadd1,iTckHi);         //TCK TO 1
          Pause(10);//Delay;
          if ( iValue and $80 ) = 0 then
          case i of
          8 :  iValIn :=  iValIn or $80;
          7 :  iValIn :=  iValIn or $40;
          6 :  iValIn :=  iValIn or $20;
          5 :  iValIn :=  iValIn or $10;
          4 :  iValIn :=  iValIn or $08;
          3 :  iValIn :=  iValIn or $04;
          2 :  iValIn :=  iValIn or $02;
          1 :  iValIn :=  iValIn or $01;
          end;
     end;
     end else                                       //TMS = 0
     begin
     for i := 8 downto 1 do
     begin
          iTckLo := $00;
          iTckHi := $01;
          PortOut(portadd1,iTckLo);         //TCK TO 0
          Pause(10);//Delay;
          iValue := PortIn(Port);
          Pause(10);//Delay;
          PortOut(portadd1,iTckHi);         //TCK TO 1
          Pause(10);//Delay;

          if ( iValue and $80 ) = 0 then
          case i of
          8 :  iValIn :=  iValIn or $80;
          7 :  iValIn :=  iValIn or $40;
          6 :  iValIn :=  iValIn or $20;
          5 :  iValIn :=  iValIn or $10;
          4 :  iValIn :=  iValIn or $08;
          3 :  iValIn :=  iValIn or $04;
          2 :  iValIn :=  iValIn or $02;
          1 :  iValIn :=  iValIn or $01;
          end;
     end;
     end;
     if bTms <> 0 then                      //TCK = 1
     PortOut(portadd1,$03)
     else
     PortOut(portadd1,$01);
     Pause(10);//Delay;

     Result := iValIn;
end;


请各位高手不吝赐教,在下先谢过,谢谢!

相关帖子

沙发
delay2| | 2007-8-9 05:11 | 只看该作者

很可能是进入编程模式没有成功

使用特权

评论回复
板凳
大漠孤烟|  楼主 | 2007-8-9 19:50 | 只看该作者

是不是用编程器并行写过后就不支持ISP了

使用特权

评论回复
地板
djc001| | 2007-8-9 22:17 | 只看该作者

看看这个吧.

// AT89S52.cpp : 定义 DLL 的初始化例程。
//

#include "stdafx.h"
#include "AT89S52.h"
#include "WinIO.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
int port_num,pin_mosi,pin_sck,pin_rst,pin_miso;
WORD outValue;
//
//    注意!
//
//        如果此 DLL 动态链接到 MFC
//        DLL,从此 DLL 导出并
//        调入 MFC 的任何函数在函数的最前面
//        都必须添加 AFX_MANAGE_STATE 宏。
//
//        例如:
//
//        extern "C" BOOL PASCAL EXPORT ExportedFunction()
//        {
//            AFX_MANAGE_STATE(AfxGetStaticModuleState());
//            // 此处为普通函数体
//        }
//
//        此宏先于任何 MFC 调用
//        出现在每个函数中十分重要。这意味着
//        它必须作为函数中的第一个语句
//        出现,甚至先于所有对象变量声明,
//        这是因为它们的构造函数可能生成 MFC
//        DLL 调用。
//
//        有关其他详细信息,
//        请参阅 MFC 技术说明 33 和 58。
//

// CAT89S52App

BEGIN_MESSAGE_MAP(CAT89S52App, CWinApp)
END_MESSAGE_MAP()


// CAT89S52App 构造

CAT89S52App::CAT89S52App()
{
    // TODO: 在此处添加构造代码,
    // 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CAT89S52App 对象

CAT89S52App theApp;


// CAT89S52App 初始化
void delay(int t)
{
    LARGE_INTEGER  litmp ;
    LONGLONG  QPart1,QPart2 ;
    double d=0;
    QueryPerformanceCounter(&litmp) ; 
// 获得初始值
    QPart1 = litmp.QuadPart ;
    while (d<t)//你想要的时间
    {
        QueryPerformanceCounter(&litmp) ; 
        QPart2 = litmp.QuadPart ;
        d=(double)(QPart2 - QPart1);
    }
}
extern "C"_declspec(dllexport) bool _cdecl AT89S52_ENABLE()
{
    unsigned char temp;
    AT89S52_CLR_SCK();
    AT89S52_CLR_RST();
     Sleep(50);
    AT89S52_SET_RST();
    Sleep(50);
    //发送使能字节
    AT89S52_PORT_OUT(0xAC);
    AT89S52_PORT_OUT(0x53);
    AT89S52_PORT_OUT(0xFF);
    temp=AT89S52_PORT_OUT(0xFF);
    if(temp!=0x69)
    {
        //MessageBox(NULL,"使能失败,请检查线路","操作",MB_OK);
        flag_enable=false;
        return false;
    }
    else
    {
        flag_enable=true;
        return true;
    }
}

extern "C"_declspec(dllexport) inline void _cdecl AT89S52_ERASE()
{    
    int i=30000;
    AT89S52_PORT_OUT(0xAC);
    AT89S52_PORT_OUT(0x9F);
    AT89S52_PORT_OUT(0x0);
    AT89S52_PORT_OUT(0x0);    
}
extern "C"_declspec(dllexport) inline void _cdecl AT89S52_WRITE_BYTE(int address,unsigned char data)
{
    unsigned char temp;
    temp=address>>8;
    AT89S52_PORT_OUT(0x40);            //输出编程命令字
    AT89S52_PORT_OUT(temp);            //输出地址高位
    temp=address%256;                
    AT89S52_PORT_OUT(temp);            //输出地址低位
    AT89S52_PORT_OUT(data);
}
extern "C"_declspec(dllexport) inline void _cdecl AT89S52_WRITE_PAGE(int address,unsigned char *pdata)
{

}
extern "C"_declspec(dllexport) inline void _cdecl AT89S52_READ_SIGNATURE(char*s)
{
    unsigned char temp1,temp2,temp3;
    long ID;    
    //AT89S51_ENABLE();
    ////////////////////////////
    AT89S52_PORT_OUT(0x28);
    AT89S52_PORT_OUT(0);
    AT89S52_PORT_OUT(0);
    temp1=AT89S52_PORT_OUT(0);    
    ////////////////////////////
    AT89S52_PORT_OUT(0x28);
    AT89S52_PORT_OUT(1);
    AT89S52_PORT_OUT(0);
    temp2=AT89S52_PORT_OUT(0);    
    ///////////////////////////
    AT89S52_PORT_OUT(0x28);
    AT89S52_PORT_OUT(2);
    AT89S52_PORT_OUT(0);
    temp3=AT89S52_PORT_OUT(0);    
    ///////////////////////////
    ID=temp2+temp3*256;
    sprintf(s,"Atmel  ID:%2.2X         Device ID:%4.4X ",temp1,ID);
    
}
extern "C"_declspec(dllexport) void AT89S52_READ_LOCK_BIT(char*temp)
{
    //char *temp=new char[100];
    unsigned char temp1;
    //AT89S51_ENABLE();
    AT89S52_PORT_OUT(0x24);
    AT89S52_PORT_OUT(0);
    AT89S52_PORT_OUT(0);
    temp1=AT89S52_PORT_OUT(0);
    temp1=temp1>>2;
    temp1&=0x7;
    if(temp1&0x4)sprintf(temp,"加密方式3");
    else 
        if(temp1&0x2)sprintf(temp,"加密方式2");
        else 
            if(temp1&0x1)sprintf(temp,"加密方式1");
            else 
                sprintf(temp,"器件没有加密");    
}
extern "C"_declspec(dllexport) inline unsigned char _cdecl AT89S52_READ_BYTE(int address)
{
    unsigned char temp;
    temp=address>>8;
    //if(!flag_enable)AT89S52_ENABLE();
    AT89S52_PORT_OUT(0x20);            //输出读数据命令字
    AT89S52_PORT_OUT(temp);            //输出地址高位
    temp=address%256;                
    AT89S52_PORT_OUT(temp);            //输出地址低位
    temp=AT89S52_PORT_OUT(0);
    return temp;
}
extern "C"_declspec(dllexport) int _cdecl AT89S52_WRITE(char *pFile,CWnd *pWnd)
{
    CStdioFile file1;
    CString strFile,str1,strTemp;
    unsigned char temp1;
    int data;
    int add1,lenth,i;
    strFile=pFile;
    str1=strFile.Right(3);
    if(str1=="HEX"||str1=="hex")
    {
        if(!file1.Open(pFile,CFile::modeRead|CFile::shareDenyRead))
            MessageBox(NULL,"打开文件出错","提示",MB_OK);
        while(file1.ReadString(str1))
        {
            //:CCAAAARR...ZZ

使用特权

评论回复
5
古道热肠| | 2007-8-11 10:23 | 只看该作者

楼主先别气

  务必细看PDF介绍,注意要让单片机进行ISP状态,单片机还要振荡起来才能串行ISP的,这些硬件细节要核查,软件部分,先读ID,ID正常,则一切很顺了。

使用特权

评论回复
6
大漠孤烟|  楼主 | 2007-8-12 23:19 | 只看该作者

晶振已经振荡起来了

因为以前通过炜煌580并行写入的程序已经跑起来了,端口接的LED在正常工作状态一直闪烁。
复位不管是程控还是手动,均正常。
而现在一直在调的就是编程使能指令,第四字节不是要输出69H?愣是调不出来,要么是FFH,要么0。
会不会是给并行写时弄坏了,不能响应ISP指令了?这几天也没时间弄片新的回来,以前留下都是写过的。

使用特权

评论回复
7
Anymcu| | 2007-8-13 08:40 | 只看该作者

到BIOS把LPT改为SPP模式

使用特权

评论回复
8
大漠孤烟|  楼主 | 2007-8-13 22:39 | 只看该作者

打开BIOS,发现本来就是SPP模式

大伙集思广益,看看还有什么好招儿?
谢谢啦!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

240

帖子

1

粉丝