OpenEdv-开源电子网

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

求助:429接spi flash,出现bit错误的问题。

[复制链接]

7

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-9-9
在线时间
7 小时
发表于 2016-12-21 14:43:31 | 显示全部楼层 |阅读模式
10金钱

问题现象:
1,往flash中写数据,常常会发现部分bit错误。0变1或者1变0
2,写数据的时候,影响到了page中没有碰的区域,本来格式化后的0xff,可能有些bit就变成0了。
3,写flash的时候,本来在一个page中写,结果影响到了相邻的page中的数据。


用示波器打了一下,发现时钟的下降沿和ARM的输出上升沿非常近。要求保持时间2ns以上,现在基本上就在2ns的样子。

做了很多尝试都没什么效果,能动的寄存器基本上都改了试过了,现在比较困惑,求指导!!!


spi初始化代码如下。

/*GPIO初始化****************************************************************************/
GPIO_InitTypeDef GPIO_InitStructure;

        /* 使能GPIO 时钟 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

        /* 配置 SCK, MISO 、 MOSI 为复用功能 */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

        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_NOPULL;

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* 配置片选口线为推挽输出模式 */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
       
        SF_CS_HIGH();                /* 片选置高,不选中 */
        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_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_Init(GPIOA, &GPIO_InitStructure);





/*SPI初始化************************************************************************************************/
SPI_InitTypeDef  SPI_InitStructure;

        /* 打开SPI时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

        /* 配置SPI硬件参数 */
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        /* 数据方向:2线全双工 */
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                /* STM32的SPI工作模式 :主机模式 */
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        /* 数据位长度 : 8位 */
        /* SPI_CPOL和SPI_CPHA结合使用决定时钟和数据采样点的相位关系、
           本例配置: 总线空闲是高电平,第2个边沿(上升沿采样数据)
        */
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                        /* 时钟上升沿采样数据 */
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                /* 时钟的第2个边沿采样数据 */
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                        /* 片选控制方式:软件控制 */

        /* 设置波特率预分频系数 */
        /*
        【SPI时钟最快是2分频,不支持不分频】
        如果是SPI1,2分频时SCK时钟 = 42M,4分频时SCK时钟 = 21M
        如果是SPI3, 2分频时SCK时钟 = 21M
        */
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;

        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        /* 数据位传输次序:高位先传 */
        SPI_InitStructure.SPI_CRCPolynomial = 7;                        /* CRC多项式寄存器,复位后为7。本例程不用 */
        SPI_Init(SPI1, &SPI_InitStructure);

        SPI_Cmd(SPI1, DISABLE);                        /* 先禁止SPI  */

        SPI_Cmd(SPI1, ENABLE);                                /* 使能SPI  */

04 FLASH TCLQX_DO保持时间_有点悬.JPG

最佳答案

查看完整内容[请看2#楼]

重新在F4专区发帖
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-9-9
在线时间
7 小时
 楼主| 发表于 2016-12-21 14:43:32 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-25 23:59:33 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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