OpenEdv-开源电子网

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

STM32F103VET6 SPI1 读写W25q64失败!

[复制链接]

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2014-9-5 13:14:47 | 显示全部楼层 |阅读模式
5金钱

自己做了个小的vet6的板子,SPI1上挂载了W25Q64,NRF2401,硬件上和原子哥的就差4个47K上拉电阻,现在用原子哥的程序读取ID一直是ffff,


确认芯片没有问题,板子应该也没问题啊,现在SPI1上就接了25Q64,其他外设也没开,自己试着加了4个10K上拉,一直不行


下面是程序,求大神指点:


//以下是SPI模块的初始化代码,配置成主机模式,访问SD Card/W25X16/24L01/JF24C        
//SPI口初始化
//这里针是对SPI1的初始化

SPI_InitTypeDef  SPI_InitStructure;

void SPIx_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 SPI_InitTypeDef SPI_InitStructure;                                  //声明用来初始化的结构体
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能SPI1时钟

 /*  配置SPI1的复用GPIO  */
 //  PA5--CLK PA7--MOSI  复用推挽输入

 GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_5|GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 //PA6--MISO  输入浮空
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &GPIO_InitStructure);


 /*  配置SPI1模块 初始化*/

 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //主模式
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //一次传输8位
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                         //空闲电平低电平
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                       //第一个上升沿采样
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //NSS管理为软件件模式
 SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;  //波特率预分频8  9MHz
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;             //数据传输低位在前
 SPI_InitStructure.SPI_CRCPolynomial = 7;                            //CRC校验方式
 SPI_Init(SPI1, &SPI_InitStructure);                                 //初始化

 SPI_Cmd(SPI1, ENABLE); //使能SPI1 
}  


//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{  
 while( SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);  //查发送缓冲器是否为空,空即可以发送
 SPI_I2S_SendData(SPI1, TxData);   //库函数:发送一个字节
 //当SPI接收缓冲器为空时等待
 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
 return SPI_I2S_ReceiveData(SPI1);       
}


main函数中


 while(SPI_Flash_ReadID()!=0XEF16)//检测不到W25Q64
 {   
  i=SPI_Flash_ReadID();
  printf("ID:%x\r\n",i);
  printf("W25X64 Check Failed!\r\n");
  delay_ms(500);
  printf("Please Check!\r\n\r\n");
  delay_ms(500);
  led2=!led2;//DS0闪烁
 } 


//初始化SPI FLASH的IO口
void SPI_Flash_Init(void)
{

 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;  //SPI CS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA,GPIO_Pin_15);

 SPIx_Init();     //初始化SPI
}

求指点,板子上SDIO FSMC ADC DAC UART 都正常,硬件应该没有问题啊,很郁闷。。。

把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
 楼主| 发表于 2016-1-9 18:39:36 | 显示全部楼层
tzy 发表于 2016-1-9 09:08
我加你好友了 你解决没有

重新做了个板子,怀疑是MCU芯片电源走线导致的IO驱动能力不足
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-5 21:36:02 | 显示全部楼层
可有示波器?
测试下CS,SCK,MOSI等的波形看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
 楼主| 发表于 2014-9-5 22:44:56 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
准备用实验室示波器测测,难道是自己布线有问题?干扰了?。。。
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-6 00:37:35 | 显示全部楼层
回复【3楼】爱博不专:
---------------------------------
测试下看看先
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-8 22:36:01 | 显示全部楼层
回复【3楼】爱博不专:
---------------------------------
??????
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-9-29
在线时间
0 小时
发表于 2014-10-25 18:08:46 | 显示全部楼层
楼主,你的问题解决了吗?我也是遇到这样的问题,请指教……
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-9-29
在线时间
0 小时
发表于 2014-10-25 18:10:22 | 显示全部楼层
回复【3楼】爱博不专:
---------------------------------
楼主,你的问题解决了吗?我也是遇到这样的问题,求指教……
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-1-31
在线时间
0 小时
发表于 2015-2-5 06:53:10 | 显示全部楼层
管脚不对吧,不是还需要一个控制管脚吗?
天下大事,必作于细,天下难事,必作于易。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-1-9
在线时间
0 小时
发表于 2016-1-9 09:08:53 | 显示全部楼层
我加你好友了 你解决没有
回复

使用道具 举报

0

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-12-22
在线时间
15 小时
发表于 2017-1-7 09:51:10 | 显示全部楼层
tzy 发表于 2016-1-9 09:08
我加你好友了 你解决没有

你们解决了吗?
回复

使用道具 举报

0

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-12-22
在线时间
15 小时
发表于 2017-1-7 09:52:33 | 显示全部楼层
正点原子 发表于 2014-9-5 21:36
可有示波器?
测试下CS,SCK,MOSI等的波形看看。

原子哥,我把SPI2的NSS设成软件,然后把PB12用作Flash的CS的.....读出来全是0XFF....怎么回事.....
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-3-31
在线时间
23 小时
发表于 2017-3-3 14:53:25 | 显示全部楼层
关于W25Q64读写问题解决了一半,能读写了。但是不能擦除,求原子哥帮忙看看。

1、看主函数(还是原子哥的原代码改的)
const u8 TEXT_Buffer[]={"WarShipSTM32 SPI TEST"};  //首先这是主函数里面定义需要写入的字符串
#define SIZE sizeof(TEXT_Buffer)                                   //这是字符串的长度

u8 datatemp[SIZE];//读取数据缓存区,长度跟需要写入的数据长度相等
u32 FLASH_SIZE; //这里定义了一个FLASH大小的变量
while(W25QXX_ReadID()!=W25Q64)//这一句把原来的W25Q128改成W25Q64
FLASH_SIZE=128*1024*1024;        //这是例程里面的参数(问题就在这里)改成64*512*1024;就好了
                                                //原本我以为W25Q128改成W25Q64就只需要64*1024*1024;后来发现改了
                                                //还是不能读,后来改成64*512*1024就好了,可以写入,可以读。但是写入一次后
                                                //就不能写入第二次了,只能读出数据。必须要进行扇区或者全盘清除才能再次写入数                              据,W25Q128是16M位的FLASH,应该是128*1024*1024位。换成字节是除以8等于16*1024*1024字节
W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);//这个函数中间的FLASH_SIZE-100应该是字节,而不是位,应为一个字母都是1个字节,而写入也是以字节为单位的。(总的来说就是写入的地址超范围了)。。。。

但是我改了以后芯片擦除函数不能用,擦不掉。(郁闷)。还有就是不知道4K扇区擦除函数怎么用,全盘擦除可能比较慢,想用扇区擦除。(求教)

2、对应的库里面也要稍作修改
       //u16 W25QXX_TYPE=W25Q128;        //W25Q128(原来的128屏蔽)
       u16 W25QXX_TYPE=W25Q64;        //W25Q64(换成现在自己手工外搭的Q64)
再没有其他的了。现在项目里面需要用到W25Q64,摸了好久。求大神指点指点
回复

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2017-9-16
在线时间
11 小时
发表于 2017-9-16 17:32:30 | 显示全部楼层
我也遇到这个情况,结果发现是W25Q64时钟引脚虚焊了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 02:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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