共2条
1/1 1 跳转至页
ZLG 请问ZLG有没有认真的调试这个程序

问
在你们试验教程1中,根据你们后面的更改后,如果程序全速运行的话,向SST39LF160里写数据是失败的,但是如果加一条延时程序的话,全速运行就可以了,不知道你们调试的时候有没有遇到这样的情况。
答 1:
我们测试没有出现您说的情况,你说的延时是在什么位置?
答 2:
延时是在调用ChipErase()后试过几次了,不加延时就不能向flash里写数据,但擦除是能正确执行的。
我的板子是EasyARM2200。 答 3: 您是如何修改程序的呢? 答 4: 按照《实验教材1》加上你们的错误更正,都还不行最后自己参照SST公司的驱动写了一个程序,就可以了。不知道是怎么回事
你们能把调试好的程序给我吗。实在是想搞明白,我的邮箱:iamlyg98@163.com 答 5: re./****************************************************************************
* 名称:WordProgram()
* 功能:半字(16位)数据编程。
* 入口参数:Addr 编程地址(SST39VF160内部地址)
* Data 编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 WordProgram(uint32 Addr, uint16 Data)
{ volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555); // 转换地址0x5555
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0xa0a0; // 第三个写周期,地址0x5555,数据0xA0
ip = GetAddr(Addr);
*ip = Data; // 第四个写周期,地址Addr,数据Data
while (1) // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
{ temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{ if (temp1 != Data)
{ return(FALSE);
}
else
{ return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名称:ChipErase()
* 功能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 ChipErase(void)
{ volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x1010; // 第六个写周期,地址0x5555,数据0x10
while (1) // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
{ temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{ if (temp1 != 0xffff)
{ return(FALSE);
}
else
{ return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名称:main()
* 功能:SST39VF160擦除、编程操作。
****************************************************************************/
int main(void)
{ uint16 i;
uint8 err = 0;
volatile uint16 *addr;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置I/O为输出
ChipErase(); // FLASH全片擦除
// 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1
addr = (volatile uint16 *)FLASH_ADDR + 0;
for(i=0; i<100; i++)
{ if(0xFFFF != (*addr)) err = 1;
addr++;
}
for(i = 0; i < 0xFFFF; i++) // 循环写入64K
{
WordProgram(i, 0x55AA); // 向FLASH的0地址写入0x55AA
addr =GetAddr(i);
if(0x55AA != (*addr)) err = 1; // 读出校验,若数据错误则设置err=1
}
if(0==err)
{ IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(20);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(20);
}
else
{ while(1)
{ IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(10);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(10);
}
}
while(1);
return(0);
}
我的板子是EasyARM2200。 答 3: 您是如何修改程序的呢? 答 4: 按照《实验教材1》加上你们的错误更正,都还不行最后自己参照SST公司的驱动写了一个程序,就可以了。不知道是怎么回事
你们能把调试好的程序给我吗。实在是想搞明白,我的邮箱:iamlyg98@163.com 答 5: re./****************************************************************************
* 名称:WordProgram()
* 功能:半字(16位)数据编程。
* 入口参数:Addr 编程地址(SST39VF160内部地址)
* Data 编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 WordProgram(uint32 Addr, uint16 Data)
{ volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555); // 转换地址0x5555
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0xa0a0; // 第三个写周期,地址0x5555,数据0xA0
ip = GetAddr(Addr);
*ip = Data; // 第四个写周期,地址Addr,数据Data
while (1) // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
{ temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{ if (temp1 != Data)
{ return(FALSE);
}
else
{ return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名称:ChipErase()
* 功能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8 ChipErase(void)
{ volatile uint16 *ip;
uint16 temp1,temp2;
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x1010; // 第六个写周期,地址0x5555,数据0x10
while (1) // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
{ temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{ if (temp1 != 0xffff)
{ return(FALSE);
}
else
{ return(TRUE);
}
}
}
return(TRUE);
}
/****************************************************************************
* 名称:main()
* 功能:SST39VF160擦除、编程操作。
****************************************************************************/
int main(void)
{ uint16 i;
uint8 err = 0;
volatile uint16 *addr;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = BEEPCON; // 设置I/O为输出
ChipErase(); // FLASH全片擦除
// 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1
addr = (volatile uint16 *)FLASH_ADDR + 0;
for(i=0; i<100; i++)
{ if(0xFFFF != (*addr)) err = 1;
addr++;
}
for(i = 0; i < 0xFFFF; i++) // 循环写入64K
{
WordProgram(i, 0x55AA); // 向FLASH的0地址写入0x55AA
addr =GetAddr(i);
if(0x55AA != (*addr)) err = 1; // 读出校验,若数据错误则设置err=1
}
if(0==err)
{ IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(20);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(20);
}
else
{ while(1)
{ IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(10);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(10);
}
}
while(1);
return(0);
}
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |