OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9028|回复: 1

连续写入SPI_FLASH

[复制链接]

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-7-21
在线时间
0 小时
发表于 2012-8-9 22:40:27 | 显示全部楼层 |阅读模式
现在我改变了一种思路,用上位机软件控制串口每次数据发一定量,将一大批字符数据分多次发送,但后写入Flash中,但发生了一些奇怪的问题下面是我的源程序:你帮我分析分析,


uart.c中断接收部分和发送部分内容)
 
u8 USART_RX_TX_BUF[129];     //接收缓冲,最大64个字节.
u8 uart_rx,uart_tx,flag,data[];
void USART1_IRQHandler(void)                
{
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET) 
{
USART_RX_TX_BUF[uart_rx]=USART_ReceiveData(USART1); 
// data[size]=USART_RX_TX_BUF[uart_rx]; size++;
uart_rx++;
if(uart_rx==129) uart_rx=0;
// uart_rx&=0x3f;
}
}

void Send_to_PC(void)
{
while(!flag)  //flag=0
{
if(uart_rx!=uart_tx)
{
//  Uart_PutChar(USART_RX_TX_BUF[uart_tx]);
 uart_tx++;
 if(uart_tx==129) uart_tx=0;
//  uart_tx&=0X3f; 
 LED0=!LED0;//提示系统正在运行
 LED1=!LED0;//提示系统正在运行
//  delay_ms(10);
 if(uart_tx==uart_rx) flag=1;
}
}
// return flag;


main.c:


/*现在只能写入固定字节数*/

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "spi.h"
#include "flash.h"

//Mini STM32开发板范例代码17
//SPI 实验
//正点原子@ALIENTEK
//技术支持论坛:www.openedv.com
//要写入到W25X16的字符串数组

//#define SIZE sizeof(TEXT_Buffer_SPI)
#define SIZE strlen(USART_RX_TX_BUF)
static u32 add1=0,add2=0;
//extern u8 datatemp[22];

int main(void)
{
//   u8 SIZE;
u16 i=0,j=0,num1,num2;
//static u32   add;
// SIZE=strlen(USART_RX_TX_BUF);
u8 datatemp1[129] ,datatemp2[128] ;
SystemInit();
delay_init(72);     //延时初始化
NVIC_Configuration();
  uart_init(9600);
  LED_Init();
  SPI_Flash_Init();   //SPI FLASH 初始化 

printf("Mini STM32\n");
printf("SPI TEST\n");
printf("ATOM@ALIENTEK\n");
printf("2012年8月~~\n");
 
while(SPI_Flash_ReadID()!=FLASH_ID)//检测不到W25X16
{   
i=SPI_Flash_ReadID();
printf("ID:%d\n",i);
printf("W25X16 Check Failed!\n");
delay_ms(500);
printf("   Please Check!    \n");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
SPI_Flash_Erase_Chip();
printf("W25X16 Ready!\n");
printf("Enter the DATA to store ... \n\n");   //显示提示信息
  
while(1)
{
  Send_to_PC(); delay_ms(2);
if(flag)
{
flag=!flag; delay_ms(2); //flag置零; 
// SPI_Flash_Erase_Chip(); delay_ms(2);
printf("Start Write W25X16....\n"); printf("...%d\n",SIZE);
SPI_Flash_Write((u8*)USART_RX_TX_BUF,add1,SIZE);
   add1+=SIZE;
num1=add1/128; num2=add1%128;
// SPI_Flash_Write((u8*)USART_RX_TX_BUF,0,SIZE);//从0字节处开始,写入SIZE长度的数据
printf("W25X16 Write Finished!\n\n");//提示传送完成
delay_ms(10);
printf("Start Read W25X16.... \n");
   printf("The Data Readed Is:  \n");//提示传送完成


if(0!=num1)
{
for(j=0;j<num1;j++)
{
SPI_Flash_Read(datatemp1,add2,128);//从0地址处开始,读出SIZE个字节
add2+=128; printf("%s",datatemp1);
}
}

if(num2!=0)
{
SPI_Flash_Read(datatemp2,add2,num2);
printf("%s",datatemp2);//显示读到的字符串
}
printf("\n");
}
  


}

 }
看看下图在串口调试的结果,多么奇怪:



我原本写入是128个字符的;也只是想写入一次,怎么会写入两次,而且第一次还是写入28个,这个28不知道怎么来,我今天调试了很久都没有看出来哪里出现问题,




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-9 23:13:49 | 显示全部楼层
有没有仿真器?用仿真器跟踪一下代码,就找到原因了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 06:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表