📄 main.c
字号:
#include "type.h"
#include <stdio.h>
#include "sst1601.h"
#include "FB.h"
static volatile u8 *src0 = (volatile u8 *)0x00000000;
static volatile u32 length0 = (u32)0xa0;
static volatile u16 *dst0 = (volatile u16 *)BaseAddrs;
static volatile u16 *src1 = (volatile u16 *)0x00000400;
static volatile u32 length1 = (u32)0x14b2;
static volatile u16 *dst1 = (volatile u16 *)0x90000800;
main()
{
//chip erase
Erase_Entire_Chip();
//write bootloader
BurnBoot((u8 *)src0,length0);
//write src to dst
BurnFlash((u16 *)src1,length1);
}
//burnflash
BurnBoot(u8 *data, u32 nBytes)
{
u32 timeout;
u16 c;
volatile u8 *pdata;
while(nBytes--)
{
*(volatile u16 *)(BaseAddrs+0xaaaa) = (u16)0x00AA;/*change*/
*(volatile u16 *)(BaseAddrs+0x5554) = (u16)0x0055;
*(volatile u16 *)(BaseAddrs+0xaaaa) = (u16)0x00A0;
pdata = (volatile u8 *)((u32)dst0);
*pdata = *data;
/* Spin here 'til programming completes
*/
c = *data++;
timeout = 0;
do timeout += 1;
while(*pdata != c && timeout < (u16)0xffff);
dst0++;
}
/* Put the Flash in normal mode */
*(volatile u16 *)BaseAddrs = (u16)0xf0;
}
//burnflash
BurnFlash(u16 *data, u32 nBytes)
{
u16 timeout;
u16 c;
volatile u16 *pdata;
while(nBytes--)
{
*(volatile u16 *)(BaseAddrs+0xaaaa) = (u16)0x00AA;/*change*/
*(volatile u16 *)(BaseAddrs+0x5554) = (u16)0x0055;
*(volatile u16 *)(BaseAddrs+0xaaaa) = (u16)0x00A0;
pdata = (volatile u16 *)((u32)dst1);
*pdata = *data;
/* Spin here 'til programming completes
*/
c = *data++;
timeout = 0;
do timeout += 1;
while(*pdata != c && timeout < (u16)0xffff);
dst1++;
}
/* Put the Flash in normal mode */
*(volatile u16 *)BaseAddrs = (u16)0xf0;
}
u8 Erase_Entire_Chip(void)
{
u8 ReturnStatus=TRUE;
*(u16 *) (BaseAddrs + 0xaaaa) = (u16)0x00AA; // write data 0x00AA to device addr 5555H
*(u16 *) (BaseAddrs + 0x5554) = (u16)0x0055; // write data 0x0055 to device addr 2AAAH
*(u16 *) (BaseAddrs + 0xaaaa) = (u16)0x0080; // write data 0x0080 to device addr 5555H
*(u16 *) (BaseAddrs + 0xaaaa) = (u16)0x00AA; // write data 0x00AA to device addr 5555H
*(u16 *) (BaseAddrs + 0x5554) = (u16)0x0055; // write data 0x0055 to device addr 2AAAH
*(u16 *) (BaseAddrs + 0xaaaa) = (u16)0x0010; // write data 0x0010 to device addr 5555H
ReturnStatus = Check_Toggle_Ready(0, ChipEraseTime); // wait TOGGLE bit stops toggling
// ReturnStatus = Check_Data_Polling(0, 0xFFFF, ChipEraseTime);// wait until DQ7 outputs 1
return ReturnStatus;
}
u8 Check_Toggle_Ready (u32 Dst, u32 MaxCycles)
{
u16 CurrData, PreData;
u32 TimeOut = 0;
PreData = *(u16 *) (BaseAddrs + Dst * AddrsShift); // read data
PreData = PreData & 0x0040; // get DQ6
while (TimeOut < MaxCycles) // check if time-out
{
CurrData = *(u16 *) (BaseAddrs + Dst * AddrsShift); // read again
CurrData = CurrData & 0x0040; // retrieve bit DQ6
if (PreData == CurrData)
{ Delay_1_Microsecond( ); // delay 1us for bus recovery
return TRUE; // return true if DQ6 stops toggling.
}
PreData = CurrData;
TimeOut++;
}
return FALSE; // timeout error
}
void Delay_1_Microsecond(void) // delay 1us
{ int i;
for(i=0; i<70; i++); // change number 70 according to application system speed.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -