野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14840|回复: 5

SPI与FLASH通信问题!!!!急!!

[复制链接]
发表于 2015-2-6 16:57:00 | 显示全部楼层 |阅读模式

这是要读取FLASH的deviceID   程序读到第一个灯亮就死了。。。  谁能告诉我程序哪有问题吗  检查了半天了。。。
#include "stm32f10x.h"
#include "stdio.h"
#include "usart1.h"
#include "spi.h"
#include "led.h"
/**
  * @brief  Ö÷oˉêy
  * @param  ÎT
  * @retval ÎT
  */

u8 DeviceID = 0, FlashID = 0;
void Delay(__IO uint32_t nCount);

int main(void)

{
        LED_GPIO_Config();
       
        USART1_Config();
       
        printf("\r\n 这是一个2M串行flash(W25Q16)实验  \r\n");
       
        SPI_FLASH_InitConfig();
        LED1(ON);
        DeviceID = SPI_FLASH_ReadDeviceID();
        LED2(ON);
        printf("\r\n Device ID is 0x%X\r\n", DeviceID);
        LED3(ON);

        while(1);
       
}

void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}




#include "spi.h"
/*********************************************************************************
#define PageSize 256
#define BUSY 0x01

#define W25Q_WriteEnable 0x06
#define W25Q_PowerDown 0xB9
#define W25Q_PageWrite 0x02
#define W25Q_ReadStatus 0x05
#define W25Q_DeviceID 0xAB
#define W25Q_ManufacturerID 0x90
#define W25Q_ReadData 0x03
#define W25Q_JEDECID 0X9F
***********************************************************************************/

void SPI_FLASH_InitConfig(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        SPI_FLASH_CS_HIGH();
       
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        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;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
       
        SPI_Init(SPI1, &SPI_InitStructure);
       
        SPI_Cmd(SPI1, ENABLE);       
}

u8 SPI_FLASH_ReadDeviceID(void)
{
        u8 t = 0;
       
        SPI_FLASH_CS_LOW();
       
        SPI_FLASH_SendByte(W25Q_DeviceID);
       
        SPI_FLASH_SendByte(0);
       
        SPI_FLASH_SendByte(0);
       
        SPI_FLASH_SendByte(0);
       
    t = SPI_FLASH_ReceiveByte();
       
        SPI_FLASH_CS_HIGH();
       
        return t;
}

void SPI_FLASH_SendByte(u8 byte)  
{
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET );
       
        SPI_I2S_SendData(SPI1, byte);
       
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET);
       
       SPI_I2S_ReceiveData(SPI1);
}


u8 SPI_FLASH_ReceiveByte(void)
{
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET );
       
        SPI_I2S_SendData(SPI1, 0);
       
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET);
       
        return SPI_I2S_ReceiveData(SPI1);
}




回复

使用道具 举报

 楼主| 发表于 2015-2-6 17:02:30 | 显示全部楼层
但是当把void SPI_FLASH_SendByte(u8 byte)  改成u8  SPI_FLASH_SendByte(u8 byte)
u8 SPI_FLASH_ReadDeviceID(void) 这个函数里的  t = SPI_FLASH_ReceiveByte();  改成   t = SPI_FLASH_SendByte();
调试助手上就显示了  为什么啊。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 17:03:20 | 显示全部楼层
但是当把void SPI_FLASH_SendByte(u8 byte)  改成u8  SPI_FLASH_SendByte(u8 byte)
u8 SPI_FLASH_ReadDeviceID(void) 这个函数里的  t = SPI_FLASH_ReceiveByte();  改成   t = SPI_FLASH_SendByte(0);
调试助手上就显示了  为什么啊。。。。 谁能告诉我。。。。。
回复 支持 反对

使用道具 举报

发表于 2015-2-6 19:03:58 | 显示全部楼层
这么奇怪啊,看不出区别呢,你可以参考一下野火的spi flash程序,这个驱动写好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-7 17:17:54 | 显示全部楼层
flyleaf 发表于 2015-2-6 19:03
这么奇怪啊,看不出区别呢,你可以参考一下野火的spi flash程序,这个驱动写好了

知道了。。。知道了。。。 我是把 SPI的预分频系数设置成2了   野火例程是4    如果设成2 当PCLK2最大72MHz时  SPI就是36MHz了 超过最大SPI最大的18MHz了。   
回复 支持 反对

使用道具 举报

发表于 2015-4-16 03:26:20 | 显示全部楼层
不开AFIO时钟也能用?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-4 18:21 , Processed in 0.026905 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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