📄 flashdriver.c
字号:
// read the 16bit word and change it
data16 = *(volatile INT16U *)addrEnd ;
// note that HCS12 is big endian!
data16 = (data16 & 0x00ff) | (pbuf[0] << 8) ; // keep the higher addr part, and combine the last input byte
// write the last 1 byte
if (flash_write_word(page, addrStart, data16) != E_FLASH_OK)
return E_FLASH_FAIL ;
}
// congratulations, write ok
return E_FLASH_OK ;
}
void test1(void)
{
INT8U i, byte ;
INT8U testlen = 36 ;
INT8U testbuf[50] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
INT16U addr = test_addr_start ;
INT16U data16 ;
INT8U page = 0x3b ;
flash_init() ;
// OSEKPrintString("\ngonna earase and verify\n") ;
// if (flash_erase_verify_block(page, addr) != E_FLASH_OK) OSEKPrintString("erase failed!!\n") ;
OSEKPrintString("before write :\r\n") ;
for (i=0; i<testlen; i++)
{
data16 = flash_read_word(page, addr+i) ;
OSEKPrintInt((INT32U)(data16 & 0xff00)>>8) ;
//testbuf[i] = data16 + 1 ;
//OSEKPrintInt(testbuf[i] - 1) ;
OSEKPrintChar(' ') ;
}
OSEKPrintString("\ngonna earase and verify\n") ;
if (flash_erase_sector(page, addr) != E_FLASH_OK) OSEKPrintString("erase failed!!\n") ;
OSEKPrintString("\nnow gonna write\n") ;
if (flash_write(page, addr, testbuf, testlen) != E_FLASH_OK) OSEKPrintString("write failed!!\n") ;
OSEKPrintString("after write :\r\n") ;
for (i=0; i<testlen; i++)
{
data16 = flash_read_word(page, addr+i) ;
OSEKPrintInt((INT32U)(data16 & 0xff00)>>8) ;
//testbuf[i] = data16 ;
//OSEKPrintInt(testbuf[i]) ;
OSEKPrintChar(' ') ;
}
}
void test2(void)
{ // clear all available pages, and write all
// seems mass_erase not so successful!!
INT16U i, byte ;
INT16U testlen = 512 ;
INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
INT16U addr = test_addr_start ;
INT16U tempaddr = addr ;
INT16U data16 ;
INT8U page = 0x3b ;
flash_init() ;
// generate testdata
for (i=0;i<512; i++)
testbuf[i] = 512-i ;
OSEKPrintString("\ngonna earase and verify block1 to block3\n") ;
for (i=1; i<4; i++)
{
if (flash_mass_erase(i) != E_FLASH_OK)
OSEKPrintString("erase failed!!\n") ;
else
OSEKPrintString("erase ok\r\n") ;
if (flash_erase_verify_block(i) != E_FLASH_OK)
OSEKPrintString("erase verify failed!\n") ;
else
OSEKPrintString("verify block OK\n") ;
}
OSEKPrintString("\nnow gonna write\n") ;
for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
{
flash_delay_bus_cycle(5000) ;
tempaddr = addr ;
while(tempaddr < FLASH_ADDR_END)
{
OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK)
OSEKPrintString("write failed!!\n") ;
else
OSEKPrintString("page written\r\n") ;
tempaddr += testlen ;
}
}
OSEKPrintString("after write :\r\n") ;
OSEKPrintString("test2 finished\r\n") ;
}
void test3(void)
{ // do not clear pages, and just write to see if write succeed without erase
// write failed! need to erase sectors before program
INT16U i, byte ;
INT16U testlen = 512 ;
INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
INT16U addr = test_addr_start ;
INT16U tempaddr = addr ;
INT16U data16 ;
INT8U page = 0x3b ;
flash_init() ;
// generate testdata
for (i=0;i<512; i++)
testbuf[i] = i ;
OSEKPrintString("\ndo not earase or verify\n") ;
OSEKPrintString("\nnow gonna write\n") ;
for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
{
flash_delay_bus_cycle(5000) ;
tempaddr = addr ;
while(tempaddr < FLASH_ADDR_END)
{
OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK)
OSEKPrintString("write failed!!\n") ;
else
OSEKPrintString("page written\r\n") ;
tempaddr += testlen ;
}
}
OSEKPrintString("after write :\r\n") ;
OSEKPrintString("test3 finished\r\n") ;
}
void test4(void)
{ // erase sector and write sector to see if erase sector and write is Ok
// this way goes well, so use this one
INT16U i, byte ;
INT16U testlen = 512 ;
INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
INT16U addr = test_addr_start ;
INT16U tempaddr = addr ;
INT16U data16 ;
INT8U page = 0x3b ;
flash_init() ;
// generate testdata
for (i=0;i<512; i++)
testbuf[i] = i*2 + 1 ;
OSEKPrintString("\ntest 4: erase sector first, then write sector\n") ;
for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
{
tempaddr = addr ;
while(tempaddr < FLASH_ADDR_END)
{
OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
if (flash_erase_sector(i, tempaddr) != E_FLASH_OK)
OSEKPrintString("erase sector failed!\n") ;
else
OSEKPrintString("erase sector OK, gonna write\n") ;
if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK)
OSEKPrintString("write failed!!\n") ;
else
OSEKPrintString("page written\r\n") ;
tempaddr += testlen ;
}
}
OSEKPrintString("after write :\r\n") ;
OSEKPrintString("test4 finished\r\n") ;
}
void test5(void)
{ // test mass_erase
INT16U i, byte ;
INT16U testlen = 512 ;
INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
INT16U addr = test_addr_start ;
INT16U tempaddr = addr ;
INT16U data16 ;
INT8U page = 0x3b ;
flash_init() ;
// generate testdata
for (i=0;i<512; i++)
testbuf[i] = 512-i ;
OSEKPrintString("\ntest 5: gonna earase and verify block1 to block3\n") ;
for (i=2; i<=3; i++)
{
if (flash_mass_erase(i) != E_FLASH_OK)
OSEKPrintString("erase failed!!\n") ;
else
OSEKPrintString("erase ok\r\n") ;
flash_delay_bus_cycle(50000) ;
if (flash_erase_verify_block(i) != E_FLASH_OK)
{
OSEKPrintString("erase verify failed!\n") ;
//i-- ;
//continue ;
}
else
OSEKPrintString("verify block OK\n") ;
tempaddr = addr ;
page = 0x3f - i*4 ;
while(tempaddr < FLASH_ADDR_END)
{
OSEKPrintString("page = ") ;OSEKPrintInt(page) ;
OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
if (flash_write(page, tempaddr, testbuf, testlen) != E_FLASH_OK)
OSEKPrintString("write failed!!\n") ;
else
OSEKPrintString("page written\r\n") ;
tempaddr += testlen ;
}
}
OSEKPrintString("after write :\r\n") ;
OSEKPrintString("test5 finished\r\n") ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -