问题现象:
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 */
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>