[STM32F4] STM21F407驱动SPI FLASH 芯片M25P80问题

[复制链接]
 楼主| ranqingfa 发表于 2015-11-20 20:45 | 显示全部楼层 |阅读模式
在一个产品中用到STM32F407驱动SPI FLASH 芯片M25P80,读写一直出现问题:dizzy:!
在M25P80的dataset中明确的写着SPI模式支持CPOL=0, CPHA=0和CPOL=1, CPHA=1两种模式,
但是我采用这两种模式的时候读写都不成功,反而用CPOL=0,CPHA=1模式的时候偶尔会出现读写都成功的时候
真是头大:curse:!
另外M25P80芯片dataset上写的是SPI时钟支持最大33MHz,不过我都降到1Mhz以下了读写成功率才有50%吧,时钟高了成功率特别低甚至是0!
ST的M25P80芯片线貌似早已卖给MICRON,不过市场上仍然很容易能买到ST的货,芯片也买了两次,第二次基本保证是正品了,不过问题依旧!
我用的是VFQFPN8贴牌封装,因为电路板体积限制选了这个封装!
没想到这么不顺利,不知道有没有熟悉这款新品的大神出来帮忙解答一下!:'(

gejigeji521 发表于 2015-11-20 22:28 | 显示全部楼层
这个用的是硬件的SPI收发器还是自己模拟的?硬件收发器,应该很靠谱的,不会出现波特率高了就误差大吧
 楼主| ranqingfa 发表于 2015-11-20 22:33 | 显示全部楼层
gejigeji521 发表于 2015-11-20 22:28
这个用的是硬件的SPI收发器还是自己模拟的?硬件收发器,应该很靠谱的,不会出现波特率高了就误差大吧 ...

用的硬件的,不过确实存在这问题……
gejigeji521 发表于 2015-11-20 22:36 | 显示全部楼层
给你例程看看
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "spi.h"
  7. #include "w25qxx.h"
  8. #include "key.h"  



  9. //作者:正点原子 @ALIENTEK



  10. //要写入到W25Q16的字符串数组
  11. const u8 TEXT_Buffer[]={"Explorer STM32F4 SPI TEST"};
  12. #define SIZE sizeof(TEXT_Buffer)         
  13.         
  14. int main(void)
  15. {
  16.         u8 key;
  17.         u16 i=0;
  18.         u8 datatemp[SIZE];
  19.         u32 FLASH_SIZE;
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  21.         delay_init(168);     //初始化延时函数
  22.         uart_init(115200);        //初始化串口波特率为115200
  23.         LED_Init();                                        //初始化LED
  24.          LCD_Init();                                        //LCD初始化
  25.         KEY_Init();                                 //按键初始化  
  26.         W25QXX_Init();                        //W25QXX初始化
  27.          POINT_COLOR=RED;
  28.         LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
  29.         LCD_ShowString(30,70,200,16,16,"SPI TEST");        
  30.         LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  31.         LCD_ShowString(30,110,200,16,16,"2014/5/6");         
  32.         LCD_ShowString(30,130,200,16,16,"KEY1:Write  KEY0:Read");        //显示提示信息               
  33.         while(W25QXX_ReadID()!=W25Q128)                                                                //检测不到W25Q128
  34.         {
  35.                 LCD_ShowString(30,150,200,16,16,"W25Q128 Check Failed!");
  36.                 delay_ms(500);
  37.                 LCD_ShowString(30,150,200,16,16,"Please Check!      ");
  38.                 delay_ms(500);
  39.                 LED0=!LED0;                //DS0闪烁
  40.         }
  41.         LCD_ShowString(30,150,200,16,16,"W25Q128 Ready!");
  42.         FLASH_SIZE=16*1024*1024;        //FLASH 大小为16字节
  43.           POINT_COLOR=BLUE;                        //设置字体为蓝色         
  44.         while(1)
  45.         {
  46.                 key=KEY_Scan(0);
  47.                 if(key==KEY1_PRES)//KEY1按下,写入W25Q128
  48.                 {
  49.                         LCD_Fill(0,170,239,319,WHITE);//清除半屏   
  50.                          LCD_ShowString(30,170,200,16,16,"Start Write W25Q128....");
  51.                         W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);                //从倒数第100个地址处开始,写入SIZE长度的数据
  52.                         LCD_ShowString(30,170,200,16,16,"W25Q128 Write Finished!");        //提示传送完成
  53.                 }
  54.                 if(key==KEY0_PRES)//KEY0按下,读取字符串并显示
  55.                 {
  56.                          LCD_ShowString(30,170,200,16,16,"Start Read W25Q128.... ");
  57.                         W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);                                        //从倒数第100个地址处开始,读出SIZE个字节
  58.                         LCD_ShowString(30,170,200,16,16,"The Data Readed Is:   ");        //提示传送完成
  59.                         LCD_ShowString(30,190,200,16,16,datatemp);                                        //显示读到的字符串
  60.                 }
  61.                 i++;
  62.                 delay_ms(10);
  63.                 if(i==20)
  64.                 {
  65.                         LED0=!LED0;//提示系统正在运行        
  66.                         i=0;
  67.                 }                  
  68.         }      
  69. }


zchong 发表于 2015-11-20 22:51 | 显示全部楼层

这例程有什么意义呢,只能看到几个函数调用
 楼主| ranqingfa 发表于 2015-11-20 23:09 | 显示全部楼层
zchong 发表于 2015-11-20 22:51
这例程有什么意义呢,只能看到几个函数调用

主要是FLASH芯片不同,确实没有什么值得参考的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:独上高楼,望尽天涯路

9

主题

217

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部