OpenEdv-开源电子网

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

STM32F207 SPI2配置,用207死活读不出来,读出全为0XFF。配置成103可以正常读取fm25cl64芯片

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-8-11
在线时间
0 小时
发表于 2013-9-30 14:31:11 | 显示全部楼层 |阅读模式

如题,用207单片机配置spi就是读不出来fm25cl64存储器,读出来全是0xff.现在按照V1.00库版本里的配置如下,仍然读出还是0xFF。我用103的spi1可以正常读取,把103的配置代码移植到207,修改相应的配置仍然度不对。请大神们看看我下面207的spi配置有没有错误,我找不出来问题了?   nss关键配置为推挽输出。

void spi_flash_init(void)
{
 SPI_InitTypeDef  SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
 
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource13, GPIO_AF_SPI2);
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
       
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
 GPIO_Init(GPIOB, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
 GPIO_Init(GPIOB, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
 GPIO_Init(GPIOB, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_SetBits(GPIOB, GPIO_Pin_12); 

 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(sFLASH_SPI, &SPI_InitStructure);
   SPI_Cmd(sFLASH_SPI, ENABLE);
}

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

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-30 21:09:43 | 显示全部楼层
分频大点,速度降低点呢?
回复 支持 1 反对 0

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-8-11
在线时间
0 小时
 楼主| 发表于 2013-10-8 09:05:20 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
也试了,不行的
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2013-4-10
在线时间
48 小时
发表于 2014-2-15 14:13:43 | 显示全部楼层
我也遇到了同样的问题,和楼主一样。用示波器看了,发出来的指令没有问题。我用的是W25Q64,只发送读取ID指令,但是一直为0x00.
楼主要是解决了,麻烦说一下,怎么弄得
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2014-3-16 20:49:17 | 显示全部楼层

#include <USE.h>

extern void Set_FW25_CS( unsigned char en);
//-------------------------------------------------------------------------------------------------------
/* 宏,用于定义FW25VF016B的片选引脚 */
#define SST25V16_CS1        (GPIO_Pin_8)     //PC8
//********************************************************************************************************************
#define SST25_SPI_FLASH_CS(x) ((x>0)?  (GPIO_SetBits(GPIOC, SST25V16_CS1)) : (GPIO_ResetBits(GPIOC, SST25V16_CS1) ))//设置1,0
//******************************************************************************
#define SPIx_SCK_PIN                     GPIO_Pin_10
#define SPIx_SCK_SOURCE                  GPIO_PinSource10

#define SPIx_MISO_PIN                    GPIO_Pin_11
#define SPIx_MISO_SOURCE                 GPIO_PinSource11

#define SPIx_MOSI_PIN                    GPIO_Pin_12
#define SPIx_MOSI_SOURCE                 GPIO_PinSource12

#define SPIx_NSS_PIN                     GPIO_Pin_8
#define SPIx_NSS_SOURCE                  GPIO_PinSource8
//***************************************************************************
void SPI3_IO_Init(void){
 GPIO_InitTypeDef GPIO_InitStructure;
 
 /* SPI pin mappings */
  GPIO_PinAFConfig(GPIOC, SPIx_SCK_SOURCE, GPIO_AF_SPI3);
  GPIO_PinAFConfig(GPIOC, SPIx_MOSI_SOURCE, GPIO_AF_SPI3);
  GPIO_PinAFConfig(GPIOC, SPIx_MISO_SOURCE, GPIO_AF_SPI3);
 // GPIO_PinAFConfig(GPIOB, SPIx_NSS_SOURCE, GPIO_AF_SPI3);
 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* SPI  MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* SPI MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /* SPI NSS pin configuration */
 // GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN;
//  GPIO_Init(GPIOB, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN | GPIO_Pin_9; //两个片选
  GPIO_Init(GPIOC, &GPIO_InitStructure); 
 Set_FW25_CS(1); //关闭FW25!!!
 SST25_SPI_FLASH_CS(1);
}
//***************************************************************************
void SPI3_Config(void){
  SPI_InitTypeDef  SPI_InitStructure;

  /* Enable the SPI peripheral */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
 //RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);

 SPI3_IO_Init();
  /* SPI configuration -------------------------------------------------------*/
  //SPI_DeInit(SPI3);
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
  /* Initialize the SPI_FirstBit member */
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial=7;
 SPI_Init(SPI3, &SPI_InitStructure);
  /* Enable SPI3  */
  SPI_Cmd(SPI3, ENABLE);
}
/*******************************************************************************
* Function Name  : SPI_ReadWriteByte
* Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
* Input          : unsigned char TxData 待发送的数
* Output         : None
* Return         : unsigned char RxData 收到的数
Flash_ReadWriteByte
*******************************************************************************/
unsigned char SPI_ReadWriteByte(unsigned char TxData){
    unsigned char RxData = 0;
   
    //等待发送缓冲区空
    while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    //发一个字节
    SPI_I2S_SendData(SPI3, TxData);
//    while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);

    //等待数据接收
    while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);
    //取数据
    RxData = SPI_I2S_ReceiveData(SPI3);
    return (unsigned char)RxData;
}

 

回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2014-3-16 20:50:40 | 显示全部楼层
这个程序是肯定可以得。可以读取W25Q128!
也许问题不在SPI的初始化。
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2014-3-16 20:52:06 | 显示全部楼层
这个程序是在F207--120MHZ的环境里运行。
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2014-3-16 20:52:54 | 显示全部楼层
要检查一下FLASH芯片是否工作。
回复 支持 反对

使用道具 举报

7

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2014-4-3
在线时间
30 小时
发表于 2015-5-5 17:36:10 | 显示全部楼层
回复【4楼】jiaojojo:
---------------------------------
请问你的问题解决了吗,我现在也遇到和你一模一样的问题,读出来全是0x00...
回复 支持 反对

使用道具 举报

30

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2012-6-14
在线时间
205 小时
发表于 2015-8-14 11:46:28 | 显示全部楼层
楼主这个问题你解决了吗?我也遇到了相同的问题
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2016-5-12
在线时间
3 小时
发表于 2016-5-12 22:48:14 | 显示全部楼层
我之前也遇到了,不过现在已经解决了。在读取ID之前,必须先发送写使能指令才行。
uint16_t SPI_FLASH_ReadID(void)
{
        uint16_t Temp = 0, Temp0 = 0, Temp1 = 0;

        // ·¢&#203;íD′ê1&#196;ü&#214;&#184;á&#238;
        SPI_FLASH_WriteEnable();
       
        // &#198;&#172;&#209;&#161;à-μí
        SPI_FLASH_CS_LOW();
       
        // ·¢&#203;í&#182;áè&#161;éè±&#184;ID&#214;&#184;á&#238;
        SPI_FLASH_SendByte(RDID);
       
        // ·¢&#203;í24&#206;&#187;μ&#196;êy&#190;Y&#198;eê&#188;μ&#216;&#214;·
        SPI_FLASH_SendByte((uint8_t)(0x000000 >> 16));
        SPI_FLASH_SendByte((uint8_t)(0x000000 >> 8));
        SPI_FLASH_SendByte((uint8_t)0x000000);
       
        // &#182;áéè±&#184;ID
        Temp0 = SPI_FLASH_SendByte(DUMMY_BYTE);
        Temp1 = SPI_FLASH_SendByte(DUMMY_BYTE);
       
        // &#198;&#172;&#209;&#161;à-&#184;&#223;
        SPI_FLASH_CS_HIGH();
       
        Temp = (Temp0 << 8) | Temp1;
       
        return Temp;
}
回复 支持 反对

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
发表于 2016-7-25 13:50:57 | 显示全部楼层
@正点原子    怎么跟着MINI板的方式配出来不行啊
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-9-6
在线时间
4 小时
发表于 2016-7-27 12:24:58 | 显示全部楼层
你应该检查你的SPI时钟 和目标芯片要求的时钟是否一致。比如 时钟空闲是置高还是置低,是第一个上升沿还是第二个时钟上升沿接收数据。最好比对一下
回复 支持 反对

使用道具 举报

buliangshui 该用户已被删除
发表于 2017-1-23 02:20:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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