OpenEdv-开源电子网

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

STM32F103VC完美运行的SPI FLASH代码移植到103R8就只能读不能写?

[复制链接]

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-11-21
在线时间
1 小时
发表于 2013-5-1 12:08:49 | 显示全部楼层 |阅读模式
 如题:STM32F103VC完美运行的SPI FLASH代码移植到STM32F103R8就只能读不能写?

都是用的是硬件SPI1接口。原来读写都正常,IO口都没有变,只是换了MCU,现在能正常读数据,读flash的ID号,但写入数据无效,扇区删除无效,整片删除无效。
代码:
/********************************************************************************************************
*  Function: SPI1_ReadWriteByte                                                                                                           
*  Object:  SPIx 读写一个字节
*  输入: TxData:要写入的字节
*  输出: 返回值:读取到的字节                                                                                                                              
*  备注: 无                                    
********************************************************************************************************/
u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
                {
                retry++;
                if(retry>250)return 0;
                }                          
        SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
                {
                retry++;
                if(retry>250)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据                                            
}
/********************************************************************************************************
*  Function: SPI_Flash_Init                                                                                                           
*  Object:  初始化SPI FLASH的IO口
*  输入: 无
*  输出: 无                                                                                                                              
*  备注: 无                                    
********************************************************************************************************/
void SPI_Flash_Init(void)
{
        SPI_InitTypeDef  SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Enable SPI1 and GPIO clocks */
        /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
        SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
        and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
       
        /*!< SPI_FLASH_SPI Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        /*!< AFIO Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
       
        /*!< Configure SPI_FLASH_SPI pins: SCK */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI pins: MISO */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI pins: MOSI */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Deselect the FLASH: Chip Select high */
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
       
        /* SPI1 configuration */
        // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
        // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                          //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                  //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                  //选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                          //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                  //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为4
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                  //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;                                                  //CRC值计算的多项式
        SPI_Init(SPI1, &SPI_InitStructure);                                                                  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
       
        /* Enable SPI1  */
        SPI_Cmd(SPI1, ENABLE);       

        SPI_FLASH_TYPE=SPI_Flash_ReadID();//读取FLASH ID.
}
/********************************************************************************************************
*  Function: SPI_FLASH_CS                                                                                                           
*  Object:  SPI FLASH的CS控制
*  输入: 无
*  输出: 无                                                                                                                              
*  备注: 无                                    
********************************************************************************************************/
void SPI_FLASH_CS(u8 swi)
{
        if (swi)       
                GPIO_SetBits(GPIOA,GPIO_Pin_4);       
        else
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);       
}

两个硬件一致(IO),能读ID,读数据应该也证明SPI硬件是正常的吧。不知道还有哪里有可能出问题?大家给看看啊

硬件写保护脚直接接3.3
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-11-21
在线时间
1 小时
 楼主| 发表于 2013-5-1 12:10:54 | 显示全部楼层
flash的底层移植的是原子哥的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-1 14:06:16 | 显示全部楼层
会不会是spi flash挂了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-11-21
在线时间
1 小时
 楼主| 发表于 2013-5-1 14:41:26 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
但是可以读啊!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-1 19:09:54 | 显示全部楼层
回复【4楼】zyw19987:
---------------------------------
可读不一定可写啊,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-11-21
在线时间
1 小时
 楼主| 发表于 2013-5-2 09:28:47 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------

问题解决了,操蛋的PCB厂将flash的GND没接通!

另外想说:原子哥对坛友的问题积极回答和帮助表示感谢!虽然不是经常来问问题,但看到这里每天的刷新纪录就看到出来,不像某些买板子的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-2 10:44:35 | 显示全部楼层
回复【6楼】zyw19987:
---------------------------------
欢迎来我们论坛。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-29 21:14:44 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我感觉 我 打扰了 原子哥 很久了 但是 我很感激
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-29 22:01:06 | 显示全部楼层
回复【2楼】zyw19987:
---------------------------------
你用的是 w25x16  可以把代码发一份 到我这里么   
   我把原子哥的 SPI2 改成 SPI1 就不行了  自己弄得班子学的 
     麻烦哦
 467079746@qq.com
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 00:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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