DSP篇--C6701功能调试系列之 FLASH测试
Posted nanke_yh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP篇--C6701功能调试系列之 FLASH测试相关的知识,希望对你有一定的参考价值。
目录
调试的前期准备可以参考前面的博文:DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客
1、 FLASH介绍
FLASH作为EMIF的外设,对其操作就需要根据EMIF相关配置来确定FLASH的地址了。
一般地,用CPLD或者FPGA对其进行译码,分别给各个外设的片选分配一个唯一的地址。这个地址是物理地址,是用CEx和EA[21:2]硬线做译码得到的。而DSP要操作这个地址,必须使用逻辑地址(字节地址),这就要求有一个物理地址和逻辑地址的对应关系。在建立这种关系的时候,我们要明确地指出某个CEx的数据宽度,是8位还是16位。需要熟悉EMIF寄存器的配置:
2、 FLASH功能测试
对于Flash的操作主要是flash擦除,flash读和flash写。DSP通过EMIF的CE1存储空间外扩flash,根据Flash的数据手册可以得到Flash的相应操作的命令定义表:
擦除FLASH主要有片擦除和扇区擦除两种方法。一般调试大部分使用片擦除,也就是全部擦除。
查看flash手册重点需要找到以下几个关键点:1、FLASH的起始地址,也即基地址(0x01400000);2、扇区擦除时,每一扇区的起始地址和长度。
代码示例:
#define FLASH_ADR1 (0x01400000+(0x555<<2))
#define FLASH_ADR2 (0x01400000+(0x2aa<<2))
#define FLASH_ADR3 0x01400000 //基地址
//写
*((Uint16 *)FLASH_ADR1) = 0x00AA;
*((Uint16 *)FLASH_ADR2) = 0x0055;
*((Uint16 *)FLASH_ADR1) = 0x00A0;
*((volatile Uint16 *)Dst) = *SrcWord; // transfer the Uint16 to destination
while((*((volatile Uint16 *)Dst))!= (*SrcWord));//自主判断是否完成
//擦除
void EraseFlash(void)
*(volatile Int16 *)FLASH_ADR1 = 0x00AA;
*(volatile Int16 *)FLASH_ADR2 = 0x0055;
*(volatile Int16 *)FLASH_ADR1 = 0x0080;
*(volatile Int16 *)FLASH_ADR1 = 0x00AA;
*(volatile Int16 *)FLASH_ADR2 = 0x0055;
*(volatile Int16 *)FLASH_ADR1 = 0x0010;
while((*(volatile Uint16 *)0x01400000) != 0xffff);
void Erasecetor(Uint16 SAnum)
*(volatile Int16 *)FLASH_ADR1 = 0x00AA;
*(volatile Int16 *)FLASH_ADR2 = 0x0055;
*(volatile Int16 *)FLASH_ADR1 = 0x0080;
*(volatile Int16 *)FLASH_ADR1 = 0x00AA;
*(volatile Int16 *)FLASH_ADR2 = 0x0055;
*(volatile Uint16*)(FLASH_ADR3+0x10000*SAnum) = 0x30;
while(*(volatile Uint16*)(FLASH_ADR3+0x10000*SAnum) != 0xFFFF);
擦除完成后,所有地址上的值都会是FFFF的。
总结:首先需确定Flash的硬件引线的bit位;再确认Flash的起始地址位置;最后根据flash手册中操作命令调试读写、擦除功能。
以上是关于DSP篇--C6701功能调试系列之 FLASH测试的主要内容,如果未能解决你的问题,请参考以下文章
DSP篇--C6701功能调试系列之Bootloader程序自引导