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

2019-10-15 19:35发布


问题现象:
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  */

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。