📄 1820new.c
字号:
return (ISP_DATA);
}
/* 多字节读 */
uchar multi_byte_read(uint begin_addr, uint counter)
{
uint i = 0;
uchar ii,jj;
for(i = 0; i< counter; i++)
{
ISP_ADDRH = (uchar)(begin_addr >> 8);
ISP_ADDRL = (uchar)(begin_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command;
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
data_temp[i]=ISP_DATA;
begin_addr++;
}
for(ii=0;ii<Available;ii++)
for(jj=0;jj<8;jj++)
code1[ii][jj]=data_temp[ii*8+jj];
ISP_IAP_disable();
return OK;
}
/************************************************************
*Function:FLASH WRITE
*parameter:
*Return:
*Modify:
*************************************************************/
/* 字节编程 */
uchar byte_program(uint byte_addr, uchar original_data)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command;
ISP_DATA = original_data;
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
return OK;
}
/* 字节编程并校验 */
uchar byte_program_and_verify(uint byte_addr, uchar original_data)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
ISP_DATA = original_data;
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
if(ISP_DATA == original_data)
return OK;
else
return ERROR;
}
/* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据
begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
uchar sequential_write_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
uint i = 0;
uchar ii,jj;
uint in_sector_begin_addr = 0;
uint sector_addr = 0;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
return ERROR;
in_sector_begin_addr = begin_addr & 0x01ff;
if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
return ERROR;
/* 擦除 要修改/写入 的扇区 */
sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
ISP_ADDRH = (uchar)(sector_addr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command;
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
for(i = 0; i< counter; i++)
{
/* 写一个字节 */
ISP_ADDRH = (uchar)(begin_addr >> 8);
ISP_ADDRL = (uchar)(begin_addr & 0x00ff);
ISP_DATA = array[i];
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command;
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
/* 读回来 */
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command;
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
data_temp[i]=array[i];
begin_addr++;
}
for(ii=0;ii<Available;ii++)
for(jj=0;jj<8;jj++)
code1[ii][jj]=data_temp[ii*8+jj];
ISP_IAP_disable();
return OK;
}
/************************************************************
*Function:ISP DISABLE
*parameter:
*Return:
*Modify:
*************************************************************/
/* 打开 ISP,IAP 功能 */
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WAIT_TIME;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/************************************************************
*Function:串口通讯
*parameter:
*Return:
*Modify:
*************************************************************/
void Send_Serial_Port_ISR (void) interrupt 4
{
uint tep=0;
uchar a[2],m,b,i,j;
uint Temperature;
if(RI)
{
RI=0;
En_485R=0;
a[0]=SBUF;
for(i=1;i<2;i++)
{
while(RI==0);
a[i]=SBUF;
RI=0;
}
TI=1;
}
/*wirte 485 address to flash*/
if((a[0]==0x0d)&&TI)
{
TI=0;
sector_erase(DEBUG_AP_Memory_Begin_Sector_addr);
byte_program(DEBUG_AP_Memory_Begin_Sector_addr,a[1]);
//获取地址码
address_num_485=byte_read(DEBUG_AP_Memory_Begin_Sector_addr);
}
//master send slave command,slave acknowledge
if((a[0]==address_num_485)&&TI)
{
TI=0;
if(a[1]==0x0f) //获取传感器序列码
{
addr_temper_flag=1;
SearchRom();
for(i=0;i<Available;i++)
for(j=0;j<8;j++)
data_temp1[i*8+j]=code1[i][j];
sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr, Available*8, data_temp1);
En_485R=1;
En_485T=1;
SBUF= 0x0c;
while(TI==0);
TI=0;
SBUF= 0x0f;
while(TI==0);
TI=0;
SBUF= a[0];
while(TI==0);
TI=0;
SBUF= 0x00;
while(TI==0);
TI=0;
En_485T=0;
En_485R=0;
}
if((a[1]==0x0b)&&(addr_temper_flag==1))
{
En_485R=1;
En_485T=1;
SBUF= 0x0f;
while(TI==0);
TI=0;
SBUF=Available;
while(TI==0);
TI=0;
for(i=0;i<Available;i++)
for(j=0;j<8;j++)
{
SBUF= code1[i][j];
while(TI==0);
TI=0;
}
En_485T=0;
En_485R=0;
addr_temper_flag=0;
}
if((a[1]==0x0e))
{
addr_temper_flag1=1;
En_485R=1;
En_485T=1;
SBUF= 0x0c;
while(TI==0);
TI=0;
SBUF= 0x0e;
while(TI==0);
TI=0;
SBUF= a[0];
while(TI==0);
TI=0;
SBUF= 0x00;
while(TI==0);
TI=0;
En_485T=0;
En_485R=0;
}
if((a[1]==0x0b)&&(addr_temper_flag1==1))
{
En_485R=1;
En_485T=1;
SBUF= 0x0e;
while(TI==0);
TI=0;
SBUF=Available;
while(TI==0);
TI=0;
for(iii=0;iii<Available;iii++)
{
Init18b20();
WriteByte(0xCC);
WriteByte(0x44);
Send_MatchRom();
WriteByte(0xBE);
aa=ReadByte();
bb=ReadByte();
SBUF=aa;
while(TI==0);
TI=0;
SBUF=bb;
while(TI==0);
TI=0;
}
En_485T=0;
En_485R=0;
if(iii>=Available)
iii=0;
addr_temper_flag1=0;
}
}//if((a[0]==address_num_485)&&TI) end
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/************************************************************
*Function:主函数
*parameter:
*Return:
*Modify:
*************************************************************/
main(void)
{
TMOD=0x20;
SCON=0x50;
TH1=0xfa; //fd baud rate 9600;fa 4800
TR1=0x01;
ET1=0x00;
ES=1;
EA=1;
En_485T=0;
En_485R=0;
SBUF=0x00;
//获取地址码
address_num_485=byte_read(DEBUG_AP_Memory_Begin_Sector_addr);
//获取传感器序列号
Available=byte_read(DEBUG_AP_Memory_End_Sector_addr);
multi_byte_read(DEBUG_Data_Memory_Begin_Sector_addr, Available*8);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -