初级会员

- 积分
- 80
- 金钱
- 80
- 注册时间
- 2020-6-23
- 在线时间
- 10 小时
|
1金钱
FLASH的ID应该是0xEF4017,为什么我读出来的是0x684017,而且后面写入和读取数据的时候,是没有问题的,请问这是哪里的问题,帮忙看一下
这是主函数:
- #include "stm32f10x.h"
- #include "bsp_usart.h"
- #include "bsp_spi_flash.h"
- uint8_t Readbuff[256];
- uint8_t Writebuff[256];
- int main(void)
- {
- uint32_t id;
- uint8_t i=0;
- USART_Config();
- printf("\n这是一个SPI_FLASH通讯试验\n");
- SPI_FLASH_Config();
- id = SPI_Read_ID();
- printf("id=0x%x \r\n",id);
- SPI_Erase_Sector(0);
- for(i=0; i<255; i++)
- {
- Writebuff[i]=i;
- }
- SPI_Write_Data(0, Writebuff, 256);
- SPI_Read_Data(0, Readbuff, 256);
- for(i=0; i<255; i++)
- {
- printf("0x%x ",Readbuff[i]);
- if(i%16 == 0)
- printf("\r\n");
- }
- while(1)
- {
-
- }
- }
复制代码 下面是SPI_FLASH的函数:
- #include "bsp_spi_flash.h"
- void SPI_FLASH_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
-
- //打开GPIO时钟
- FLASH_SPI_GPIO_APBxClkCmd(FLASH_SPI_SDA_GPIO_CLK,ENABLE);
- //打开I2C外设时钟
- FLASH_SPI_APBxClkCmd(FLASH_SPI_CLK,ENABLE);
-
- // 将SPI_SCK的GPIO配置为推挽复用输出模式
- GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_GPIO_PIN;
- GPIO_Init(FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
- // 将SPI_MISO的GPIO配置为推挽复用输出模式
- GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_GPIO_PIN;
- GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
- // 将SPI_MOSI的GPIO配置为推挽复用输出模式
- GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_GPIO_PIN;
- GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
- // 将SPI_CS的GPIO配置为推挽普通输出模式(软件控制)
- GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(FLASH_SPI_CS_GPIO_PORT, &GPIO_InitStructure);
-
- FLASH_SPI_CS_HIGH;
-
- //配置SPI的工作参数
- //波特率配置为2分频18M
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
- //时钟模式配置为模式3
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
- //不使用CRC校验,赋值无效
- SPI_InitStructure.SPI_CRCPolynomial = 0;
- //数据宽度为8位
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
- //传输方向配置为双线双向通信
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
- //数据配置高位先行
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- //模式配置为主机模式
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- //CS线使用软件控制
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
-
- //初始化SPI
- SPI_Init(FLASH_SPIx,&SPI_InitStructure);
- //使能SPI
- SPI_Cmd(FLASH_SPIx, ENABLE);
- }
- //发送并接收数据
- uint8_t SPI_FLASH_Seng_Byte(uint8_t data)
- {
- //检测并等待TX发送缓冲区为空
- while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_TXE) == RESET);
- //发送数据
- SPI_I2S_SendData (FLASH_SPIx, data);
- //检测并等待RX接收缓冲区为非空
- while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_RXNE) == RESET);
- //接收数据
- return SPI_I2S_ReceiveData(FLASH_SPIx);
- }
- //等待FLASH传输结束
- void SPI_WaitForWriteEnd()
- {
- uint8_t status_reg;
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(READ_STATUS);
- do{
- status_reg = SPI_FLASH_Seng_Byte(DUMMY);
- }while((status_reg&0x01) == 1);
- FLASH_SPI_CS_HIGH;
- }
- //写使能,每次写之前都要操作
- void SPI_Write_Enable()
- {
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(WRITE_ENABLE);
- FLASH_SPI_CS_HIGH;
- }
- //读取flash的ID号
- uint32_t SPI_Read_ID(void)
- {
- uint32_t FLASH_ID = 0;
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(READ_JEDEC_ID);
- FLASH_ID = SPI_FLASH_Seng_Byte(DUMMY);
- FLASH_ID <<= 8;
- FLASH_ID |= SPI_FLASH_Seng_Byte(DUMMY);
- FLASH_ID <<= 8;
- FLASH_ID |= SPI_FLASH_Seng_Byte(DUMMY);
- FLASH_SPI_CS_HIGH;
- return FLASH_ID;
- }
- //擦除指定扇区
- void SPI_Erase_Sector(uint32_t addr)
- {
- SPI_Write_Enable();
- SPI_WaitForWriteEnd();
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(Sector_Erase);
- SPI_FLASH_Seng_Byte((addr>>16)&0xff);
- SPI_FLASH_Seng_Byte((addr>>8)&0xff);
- SPI_FLASH_Seng_Byte(addr&0xff);
- FLASH_SPI_CS_HIGH;
- SPI_WaitForWriteEnd();
- }
- //读取FLASH数据
- void SPI_Read_Data(uint32_t addr, uint8_t *Readbuff, uint32_t NumByteToRead)
- {
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(READ_DATA);
- SPI_FLASH_Seng_Byte((addr>>16)&0xff);
- SPI_FLASH_Seng_Byte((addr>>8)&0xff);
- SPI_FLASH_Seng_Byte(addr&0xff);
- while(NumByteToRead--)
- {
- *Readbuff = SPI_FLASH_Seng_Byte(DUMMY);
- Readbuff++;
- }
- FLASH_SPI_CS_HIGH;
- SPI_WaitForWriteEnd();
- }
- //写FLASH数据
- void SPI_Write_Data(uint32_t addr, uint8_t *Writebuff, uint32_t NumByteToWrite)
- {
- SPI_Write_Enable();
- SPI_WaitForWriteEnd();
- FLASH_SPI_CS_LOW;
- SPI_FLASH_Seng_Byte(WRITE_DATA);
- SPI_FLASH_Seng_Byte((addr>>16)&0xff);
- SPI_FLASH_Seng_Byte((addr>>8)&0xff);
- SPI_FLASH_Seng_Byte(addr&0xff);
- while(NumByteToWrite--)
- {
- SPI_FLASH_Seng_Byte(*Writebuff);
- Writebuff++;
- }
- FLASH_SPI_CS_HIGH;
- SPI_WaitForWriteEnd();
- }
复制代码
|
-
|