OpenEdv-开源电子网

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

怪了!SPI能正常读出ID号,读出的数据全是0xff.检测不知道是哪里出了问题。

[复制链接]

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
发表于 2012-7-5 15:04:11 | 显示全部楼层 |阅读模式

void SPIx_Init(void)

 RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
 RCC->APB2ENR|=1<<12;      //SPI1时钟使能
 
 GPIOA->CRL&=0X000FFFFF;
 GPIOA->CRL|=0XBBB00000;//PA5.6.7复用     
 GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

 
 SPI1->CR1&=~(1<<10);//全双工模式 
 
 SPI1->CR1|=1<<9; //SSM:软件从设备管理 (Software slave management)
 SPI1->CR1|=1<<8; //SSI:内部从设备选择 (Internal slave select)

 SPI1->CR1|=1<<2; //MSTR:主设备选择 (Master selection)
 SPI1->CR1&=~(1<<11);//DFF:数据帧格式 (Data frame format)使用8位数据帧格式进行发送/接收;
 SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1 1: 空闲状态时,SCK保持高电平。
 SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 数据采样从第二个时钟边沿开始。
 SPI1->CR1|=7<<3; //Fsck=Fcpu/256波特率控制 (Baud rate control)

 SPI1->CR1&=~(1<<7); //MSBfirst    :先发送MSB;
 SPI1->CR1|=1<<6; //SPI设备使能 1:开启SPI设备。
 SPIx_ReadWriteByte(0xff);//启动传输  
}

 RCC->APB2ENR|=1<<2;       //PORTA时钟使能
 GPIOA->CRL&=0XFFF0FFFF;
 GPIOA->CRL|=0X00030000;//PA2.3.4 推挽     
 GPIOA->ODR|=1<<4;    //PA2.3.4上拉

#define SPI_FLASH_CS  PCout(4)  //选中FLASH

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

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
 楼主| 发表于 2012-7-5 15:05:47 | 显示全部楼层
这个地方是#define SPI_FLASH_CS  Aout(4)  //选中FLASH
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
 楼主| 发表于 2012-7-5 17:10:03 | 显示全部楼层
我用的芯片是SST25F064C-80.没有同志遇到只能读出ID,读出数据错误啊、?????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-5 20:23:31 | 显示全部楼层
没写入数据的话,读出来就是0XFF的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
 楼主| 发表于 2012-7-6 10:02:28 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
今天早上发现了是不能擦出空间,

用//擦除整个芯片
//整片擦除时间:
//W25X16:25s 
//W25X32:40s 
//W25X64:40s 
//等待时间超长...
void SPI_Flash_Erase_Chip(void)   
{                                             
    SPI_FLASH_Write_Enable();                  //SET WEL 
    SPI_Flash_Wait_Busy();   
   SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_ChipErase);        //发送片擦除命令  
SPI_FLASH_CS=1;                            //取消片选            
SPI_Flash_Wait_Busy();       //等待芯片擦除结束
}   
//擦除一个扇区
//Dst_Addr:扇区地址 0~511 for w25x16
//擦除一个山区的最少时间:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)   
{   
Dst_Addr*=4096;
    SPI_FLASH_Write_Enable();                  //SET WEL   
    SPI_Flash_Wait_Busy();   
   SPI_FLASH_CS=0;                            //使能器件   
    SPIx_ReadWriteByte(W25X_SectorErase);      //发送扇区擦除指令 
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址    
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>8));   
    SPIx_ReadWriteByte((u8)Dst_Addr);  
SPI_FLASH_CS=1;                            //取消片选            
    SPI_Flash_Wait_Busy();       //等待擦除完成
}
都擦出不了,命令也都是真确的。奇怪啊、
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-6 11:44:51 | 显示全部楼层
你的什么IC啊?
是在我们开发板上实验的么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
 楼主| 发表于 2012-7-6 15:57:44 | 显示全部楼层
原来的那个搞坏了。又换了一颗,pct25vf064
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-7-19
在线时间
1 小时
发表于 2013-7-19 15:55:37 | 显示全部楼层
你这个是因为没有把写保护去掉,默认是0x3c,全部清零就可以了
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-7-19 16:34:53 | 显示全部楼层
顺便提一下..........   SPI FLASH之前我也栽了根斗,  老是不稳.    起先是查外部拉升电阻...    什么都试了仍然不行.

后来才查到是软件上问题......

STM32mini附的教程,   SPI的收发字元片段是这样....

"//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while((SPI1->SR&1<<1)==0)//等待发送区空
{
retry++;
if(retry>200)return 0;
}   
SPI1->DR=TxData;     //发送一个byte 
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
{
retry++;
if(retry>200)return 0;
}        
return SPI1->DR;          //返回收到的数据     
}
"

而战舰版的收发字元片段是...
"
//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
u16 retry=0;  
while((SPI2->SR&1<<1)==0) //等待发送区空
{
retry++;
if(retry>=0XFFFE)return 0;  //超时退出
}   
SPI2->DR=TxData;      //发送一个byte 
retry=0;
while((SPI2->SR&1<<0)==0)  //等待接收完一个byte  
{
retry++;
if(retry>=0XFFFE)return 0; //超时退出
}        
return SPI2->DR;           //返回收到的数据     
}
"


看到了吗?   最大等待超时时间差很多(战舰是0xFFFE) ,   我一直延用mini版的,  等待时间经常会不够, 收到一些怪异的码.
有时正常,  有时又异常....         这问题花了我2个晚上才找到...

所以,  提供分享.    请拉大最大延迟时间, 否则读出的数据不定时可能出错的...  (或直接用战舰版的就没事啦~~)
我用的是W25Q64 .
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2013-7-19 16:38:07 | 显示全部楼层
感谢分享了
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-9-29
在线时间
0 小时
发表于 2014-10-25 18:21:09 | 显示全部楼层
回复【3楼】SCmianyangZLY:
---------------------------------
朋友,你的问题解决了吗?求指导……
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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