完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
10 个讨论
|
|
vuywsdfwf 发表于 2019-10-24 15:58 这是我调试成功的FLASH程序: #include #include #include #include #define CESECT1 0x200000 #define CESECT2 0x400000 #define CESECT3 0x600000 #define CESECT4 0x200a00 Uint16 x; Uint32 y; CSLBool b; unsigned int datacount = 0; unsigned int databuffer[1000] =[0]; int *souraddr,*deminaddr; int *fwaddr, *fraddr; Uint16 addbias; Uint16 fstatus, fstatus2; Uint16 success; /*锁相环的设置*/ PLL_Config myConfig = [ 0, //IAI: the PLL locks using the same process that was underway //before the idle mode was entered 1, //IOB: If the PLL indicates a break in the phase lock, //it switches to its bypass mode and restarts the PLL phase-locking //sequence 12, //PLL multiply value; multiply 12 times 1 //Divide by 2 PLL divide value; it can be either PLL divide value //(when PLL is enabled), or Bypass-mode divide value //(PLL in bypass mode, if PLL multiply value is set to 1) ]; /*SDRAM的EMIF设置*/ EMIF_Config emiffig = [ 0x221, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence // the WPE = 0 ,forbiden the writing posting when we debug the EMIF // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin // the NOHOLD = 1,HOLD requests are not recognized by the EMIF 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine 0x3FFF, //CE0_1: CE0 space control register 1 // MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width 0xFFFF, //CE0_2: CE0 space control register 2 0x00FF, //CE0_3: CE0 space control register 3 // TIMEOUT = 0xFF; 0x1FFF, //CE1_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE1_2: CE0 space control register 2 0x00FF, //CE1_3: CE0 space control register 3 0x1FFF, //CE2_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE2_2: CE0 space control register 2 0x00FF, //CE2_3: CE0 space control register 3 0x1FFF, //CE3_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE3_2: CE0 space control register 2 0x00FF, //CE3_3: CE0 space control register 3 0x2911, //SDC1: SDRAM control register 1 // TRC = 8 // SDSIZE = 0;SDWID = 0 // RFEN = 1 // TRCD = 2 // TRP = 2 0x0410, //SDPER : SDRAM period register // 7ns *4096 0x07FF, //SDINIT: SDRAM initialization register // any write to this register to init the all CE spaces, // do it after hardware reset or power up the C55x device 0x0131 //SDC2: SDRAM control register 2 // SDACC = 0; // TMRD = 01; // TRAS = 0101; // TACTV2ACTV = 0001; ]; void delay(Uint16 k) [ while(k>0) [ k--; ] ] void ddelay(Uint16 kt) [ Uint16 jj,kk; for(jj=0;jj<65535;jj++) [ kk = kt; while(kk>0) [ kk--; ] ] ] /*************以下内容为AM29LV800BT的读写等函数**************/ /* 参考:AM29LV800BT的芯片手册 TMS320VC5509 DSP External Memory Interface (EMIF) Reference Guide HX-5509A 开发板使用手册 */ void Flash_CS() [ souraddr = (int *)CESECT2; *souraddr = 0x00ff; ] void Flash_disCS() [ ] void Flash_Reset() //AM29LV800复位 [ deminaddr = (int *)CESECT4; *deminaddr &= 0x00fe; delay(1000); *deminaddr |= 0x0001; ] Uint16 Flash_Erase_all() //AM29LV800芯片擦除 [ Flash_CS(); deminaddr = (int *)CESECT2; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0080; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0010; delay(100); fstatus = *(deminaddr+addbias); fstatus &= 0x0040; fstatus2 = *(deminaddr+addbias); if((fstatus&fstatus2)!=0) [ //Flash_disCS(); return 0; ] else [ while(fstatus!=0x00ff) [ ddelay(500); //ddelay(500); //ddelay(500); fstatus =*(deminaddr+addbias); fstatus &= 0x00ff; ] Flash_disCS(); return 1; ] ] Uint16 Flash_Erase_sector() //AM29LV800分段擦除 [ return 1; ] void Flash_Write_init() //AM29LV800烧写初始化 [ Flash_CS(); deminaddr = (int *)CESECT2; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0020; ] Uint16 Flash_Write(Uint16 waddr, Uint16 wdata) //AM29LV800烧写 [ *(fwaddr+waddr) = 0x00a0; *(fwaddr+waddr) = wdata; delay(10000); fstatus = *(fwaddr+waddr); while(fstatus!=wdata) [ delay(10000); fstatus = *(fwaddr+waddr); ] return 1; ] void Flash_Write_end() //AM29LV800烧写结束 [ deminaddr = (int *)CESECT2; *deminaddr = 0x0090; *deminaddr = 0x0000; //Flash_disCS(); ] Uint16 Flash_Read(Uint16 raddr) //AM29LV800读 [ Uint16 frtemp; frtemp = *(fraddr+raddr); return frtemp; ] main() [ /*初始化CSL库*/ CSL_init(); /*EMIF为全EMIF接口*/ CHIP_RSET(XBSR,0x0a01); /*设置系统的运行速度为144MHz*/ PLL_config(&myConfig); /*初始化DSP的外部SDRAM*/ EMIF_config(&emiffig); Flash_Reset(); //Flash_Erase_all运行大约为14s以上,为节约时间注释掉,用户可自行根据需要取消注释 success = Flash_Erase_all(); //以下程序为烧写AM29LV800 Flash_Write_init(); fwaddr = (int *)CESECT2; //地址首先指向5509的CE1空间(AM29LV800所在) fwaddr += 0x10000; //指向AM29LV800的1扇区 for(datacount=0;datacount<1000;datacount++) [ success = Flash_Write(datacount, datacount); ] Flash_Write_end(); //以下程序为读AM29LV800 for(datacount=0;datacount<1000;datacount++) [ databuffer[datacount]=0; ] Flash_CS(); fraddr = fwaddr; for(datacount=0;datacount<1000;datacount++) [ databuffer[datacount] = Flash_Read(datacount); ] Flash_disCS(); //运行到此处,在view--memory里查看databuffer开始地址的数据,看是否所写即所读 while(1); ] /****************************************************************************** * End of pll2.c ******************************************************************************/ 以下是我改写的FLASH烧写程序: #include #include #include #include #include #include //#include "MaxBurn.H" #define CESECT1 0x200000 #define CESECT2 0x400000 #define CESECT3 0x600000 #define CESECT4 0x200a00 Uint16 x; Uint32 y; CSLBool b; unsigned int datacount = 0; unsigned int databuffer[1000] =[0]; int *souraddr,*deminaddr; int *fwaddr, *fraddr; Uint16 addbias; Uint16 fstatus, fstatus2; Uint16 success; ////////////////////////////////////////////////////////////////////////////////////////////////////////////// #pragma DATA_SECTION(ProgramDat,".prgdat") Uint16 ProgramDat[0xFFFF]; //////////////////////////////////////////////////////////////////////////////////////////////////////////// /*锁相环的设置*/ PLL_Config myConfig = [ 0, //IAI: the PLL locks using the same process that was underway //before the idle mode was entered 1, //IOB: If the PLL indicates a break in the phase lock, //it switches to its bypass mode and restarts the PLL phase-locking //sequence 12, //PLL multiply value; multiply 12 times 1 //Divide by 2 PLL divide value; it can be either PLL divide value //(when PLL is enabled), or Bypass-mode divide value //(PLL in bypass mode, if PLL multiply value is set to 1) ]; /*SDRAM的EMIF设置*/ EMIF_Config emiffig = [ 0x221, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence // the WPE = 0 ,forbiden the writing posting when we debug the EMIF // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin // the NOHOLD = 1,HOLD requests are not recognized by the EMIF 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine 0x3FFF, //CE0_1: CE0 space control register 1 // MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width 0xFFFF, //CE0_2: CE0 space control register 2 0x00FF, //CE0_3: CE0 space control register 3 // TIMEOUT = 0xFF; 0x1FFF, //CE1_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE1_2: CE0 space control register 2 0x00FF, //CE1_3: CE0 space control register 3 0x1FFF, //CE2_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE2_2: CE0 space control register 2 0x00FF, //CE2_3: CE0 space control register 3 0x1FFF, //CE3_1: CE0 space control register 1 // Asynchronous, 16Bit 0xFFFF, //CE3_2: CE0 space control register 2 0x00FF, //CE3_3: CE0 space control register 3 0x2911, //SDC1: SDRAM control register 1 // TRC = 8 // SDSIZE = 0;SDWID = 0 // RFEN = 1 // TRCD = 2 // TRP = 2 0x0410, //SDPER : SDRAM period register // 7ns *4096 0x07FF, //SDINIT: SDRAM initialization register // any write to this register to init the all CE spaces, // do it after hardware reset or power up the C55x device 0x0131 //SDC2: SDRAM control register 2 // SDACC = 0; // TMRD = 01; // TRAS = 0101; // TACTV2ACTV = 0001; ]; void EmifSetup(void) [ EMIF_Config MyConfig = [ 0x0010 /*EGCR*/, 0x0000 /*EMIRST*/, /*(MTYPE<<12)|(RDSETUP<<8)|(RDSTROBE<<2)|(RDHOLD), cen1*/ /*(RDEXHLD<<14)|(WREXHLD<<12)|(WRSETUP<<8)|(WRSTROBE<<2)|(WRHOLD),cen2*/ /*(TIMOUT), cen3*/ (1<<12)|(1<<8)|(3<<2)|(1), /*ce01*/ (0<<14)|(0<<12)|(1<<8)|(3<<2)|(1), /*ce02*/ (0), /*ce03*/ (1<<12)|(10<<8)|(0x3f<<2)|(3), /*ce11*/ (3<<14)|(3<<12)|(15<<8)|(0x3f<<2)|(3), /*ce12*/ (100), /*ce13*/ (1<<12)|(15<<8)|(0x3f<<2)|(3), /*ce21*/ (3<<14)|(3<<12)|(15<<8)|(0x3f<<2)|(3), /*ce22*/ (200), /*ce23*/ (1<<12)|(1<<8)|(3<<2)|(1), /*ce31*/ (0<<14)|(0<<12)|(1<<8)|(3<<2)|(1), /*ce32*/ (0), /*ce33*/ 0x07FF /*sdc1*/, 0x0FFF /*sdper*/, 0x07FF /*init*/, 0x03FF /*sdc2*/ ]; EMIF_config(&MyConfig); ] void delay(Uint16 k) [ while(k>0) [ k--; ] ] void ddelay(Uint16 kt) [ Uint16 jj,kk; for(jj=0;jj<65535;jj++) [ kk = kt; while(kk>0) [ kk--; ] ] ] /*************以下内容为AM29LV800BT的读写等函数**************/ /* 参考:AM29LV800BT的芯片手册 TMS320VC5509 DSP External Memory Interface (EMIF) Reference Guide HX-5509A 开发板使用手册 */ void Flash_CS() [ souraddr = (int *)CESECT2; *souraddr = 0x00ff; ] void Flash_disCS() [ ] void Flash_Reset() //AM29LV800复位 [ deminaddr = (int *)CESECT4; *deminaddr &= 0x00fe; delay(1000); *deminaddr |= 0x0001; ] Uint16 Flash_Erase_all() //AM29LV800芯片擦除 [ Flash_CS(); deminaddr = (int *)CESECT2; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0080; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0010; delay(100); fstatus = *(deminaddr+addbias); fstatus &= 0x0040; fstatus2 = *(deminaddr+addbias); if((fstatus&fstatus2)!=0) [ //Flash_disCS(); return 0; ] else [ while(fstatus!=0x00ff) [ ddelay(500); //ddelay(500); //ddelay(500); fstatus =*(deminaddr+addbias); fstatus &= 0x00ff; ] Flash_disCS(); return 1; ] ] Uint16 Flash_Erase_sector() //AM29LV800分段擦除 [ return 1; ] void Flash_Write_init() //AM29LV800烧写初始化 [ Flash_CS(); deminaddr = (int *)CESECT2; addbias = 0x0555; *(deminaddr+addbias) = 0x00aa; addbias = 0x02aa; *(deminaddr+addbias) = 0x0055; addbias = 0x0555; *(deminaddr+addbias) = 0x0020; ] Uint16 Flash_Write(Uint16 waddr, Uint16 wdata) //AM29LV800烧写 [ *(fwaddr+waddr) = 0x00a0; *(fwaddr+waddr) = wdata; delay(10000); fstatus = *(fwaddr+waddr); while(fstatus!=wdata) [ delay(10000); fstatus = *(fwaddr+waddr); ] return 1; ] void Flash_Write_end() //AM29LV800烧写结束 [ deminaddr = (int *)CESECT2; *deminaddr = 0x0090; *deminaddr = 0x0000; //Flash_disCS(); ] Uint16 Flash_Read(Uint16 raddr) //AM29LV800读 [ Uint16 frtemp; frtemp = *(fraddr+raddr); return frtemp; ] main() [ Uint32 i,j,n,FlashAddr; Uint16 WordHgh; /*初始化CSL库*/ CSL_init(); /*EMIF为全EMIF接口*/ //CHIP_RSET(XBSR,0x0a01); /*设置系统的运行速度为144MHz*/ //PLL_config(&myConfig); /*初始疍SP的外部SDRAM*/ //EMIF_config(&emiffig); PLL_setFreq(20,2); GPIO_RSET(IODIR,0x00FF); //全部输出 GPIO_RSET(IODATA,0x00FF); //全部高电平 CHIP_RSET(XBSR,0x0001); //External Bus Selection Register (EBSR),EMIF为全EMIF接口 //CHIP_RSET(SYSR,5); //此语句不管用 EmifSetup(); printf("*************************************************n"); printf("***************版权所有,翻版必究!**************n"); printf("**********如有疑问或不解,欢迎跟本人联系*********n"); printf("**********email:hulin.1234@yahoo.com.cn*********n"); printf("*************************************************n"); ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////写入准备 for(i=0;i<0x8000;i++) *(ProgramDat + i)=0x0000; Flash_Reset(); //Flash_CS(); success=Flash_Erase_all(); //FlashAddr = FlashSoftId(); //234B00BF printf("nLoad data file please !n"); ////请在下一语句上设置断点,必须运行下一个语句之前装载程序数据 n = *(Uint16 *)(ProgramDat+0); n <<= 16; n += *(Uint16 *)(ProgramDat+1); //FlashAddr += FlashBlockErase(0x0000); //清除块,32KW,足够放下16KW的BOOT MAP 数据 //以下程序为烧写AM29LV800 Flash_Write_init(); for(i=0;i<= n ;i++)[ WordHgh = *(ProgramDat + 2 + i); //FlashWordProgram(i,WordHgh); success = Flash_Write(i,WordHgh); if((i%100)==99)printf("."); ] Flash_Write_end(); printf("nFinished Burning Flash ! , Verifying now n"); Flash_CS(); j=0; for(i=0;i< n ;i++)[ WordHgh = *(ProgramDat + 2 + i); if(WordHgh != Flash_Read(i))j++; if((i%100)==99)printf("."); ] printf("nFinished checking, And %04d words wrongn",j); //FlashDiscs(); Flash_disCS(); for(;;)[] ] /****************************************************************************** * End of pll2.c ******************************************************************************/ 大神看看哪儿不对?我试了不行,谢谢! |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
538 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
987 浏览 1 评论
584 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
461 浏览 1 评论
996 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-21 12:00 , Processed in 1.342001 second(s), Total 71, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号