| #include <stm32f10x_lib.h> #include "mysysinit.h"
 #include "delay.h"
 #include "stm32f10x_spi.h"
 #define FLASH_CHREAD 0x0B
 #define FLASH_CLREAD 0x03
 #define FLASH_PREAD        0xD2
 
 #define FLASH_BUFWRITE1 0x84  // 写入第一缓冲区
 #define FLASH_IDREAD 0x9F
 #define FLASH_STATUS 0xD7          // 读取状态寄存器
 #define PAGE_ERASE 0x81
 #define PAGE_READ 0xD2
 #define MM_PAGE_TO_B1_XFER 0x53                                // 将主存储器的指定页数据加载到第一缓冲区
 #define BUFFER_2_WRITE 0x87                                        // 写入第二缓冲区
 #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86        // 将第二缓冲区的数据写入主存储器(擦除模式)
 
 #define BUFFER_1_WRITE 0x84 // 写入第一缓冲区
 #define BUFFER_2_WRITE 0x87 // 写入第二缓冲区
 #define BUFFER_1_READ 0xD4 // 读取第一缓冲区
 #define BUFFER_2_READ 0xD6 // 读取第二缓冲区
 #define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 // 将第一缓冲区的数据写入主存储器(擦除模式)
 #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 // 将第二缓冲区的数据写入主存储器(擦除模式)
 #define MM_PAGE_TO_B1_XFER 0x53 // 将主存储器的指定页数据加载到第一缓冲区
 #define MM_PAGE_TO_B2_XFER 0x55 // 将主存储器的指定页数据加载到第二缓冲区
 #define PAGE_ERASE 0x81 // 页删除(每页512/528字节)
 #define SECTOR_ERASE 0x7C // 扇区擦除(每扇区128K字节)
 #define READ_STATE_REGISTER 0xD7 // 读取状态寄存器
 
 
 /* Private typedef -----------------------------------------------------------*/
 #define SPI_FLASH_PageSize    0x100
 
 /* Private define ------------------------------------------------------------*/
 #define WRITE      0x02  /* Write to Memory instruction */
 #define WRSR       0x01  /* Write Status Register instruction */
 #define WREN       0x06  /* Write enable instruction */
 
 #define READ       0x03  /* Read from Memory instruction */
 #define RDSR       0x05  /* Read Status Register instruction  */
 #define RDID       0x9F  /* Read identification */
 #define SE         0xD8  /* Sector Erase instruction */
 #define BE         0xC7  /* Bulk Erase instruction */
 
 #define WIP_Flag   0x01  /* Write In Progress (WIP) flag */
 
 #define Dummy_Byte 0xA5
 
 #define Select_Flash()     GPIO_ResetBits(GPIOA, GPIO_Pin_4)
 /* Deselect SPI FLASH: ChipSelect pin high */
 #define NotSelect_Flash()    GPIO_SetBits(GPIOA, GPIO_Pin_4)
 
 u8 aa=0xaa;
 
 GPIO_InitTypeDef GPIO_InitStructure;//GPIO结构变量
 SPI_InitTypeDef  SPI_InitStructure;//设置一个spi的结构变量
 ////////GPIO的设置/////////
 void gpioinit()
 {
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 }
 
 void spi_init()
 {
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE);
 SPI_Cmd(SPI1,DISABLE);
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPI1, &SPI_InitStructure);
 SPI_Cmd(SPI1, ENABLE);
 }
 
 static u8 sendrecieve(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 ))==RESET);
 return SPI_I2S_ReceiveData(SPI1);
 //SPI_I2S_ClearFlag(SPI1,SPI_FLAG_RXNE);
 }
 void FlashWaitBusy(void)//Flash忙检测
 {
 u8 FLASH_Status = 0;
 Select_Flash();
 sendrecieve(RDSR);//读状态
 do
 {
 FLASH_Status = sendrecieve(Dummy_Byte);
 }
 while ((FLASH_Status & WIP_Flag) == SET);
 NotSelect_Flash();
 
 }
 void FlashPageEarse(u16 page) //擦除指定的页,页范围0-4095
 {
 
 FlashWaitBusy();//Flash忙检测
 Select_Flash(); //CS置"0"
 sendrecieve(0X06);        //写使能
 NotSelect_Flash(); //CS置"1"
 
 FlashWaitBusy();//Flash忙检测
 Select_Flash(); //CS置"0"
 sendrecieve(SE);  //块擦除
 sendrecieve((page & 0xFF0000) >> 16);
 sendrecieve((page & 0xFF00) >> 8);
 sendrecieve(page & 0xFF);
 NotSelect_Flash(); //CS置"1"
 
 }
 unsigned char M25P16_RamTo_buf(unsigned int start_address)
 {
 unsigned int i;
 FlashPageEarse(0X01); //擦除指定的页,页范围0-4095
 
 FlashWaitBusy();//Flash忙检测
 Select_Flash(); //CS置"0"
 sendrecieve(0X06);        //写使能
 NotSelect_Flash(); //CS置"1"
 
 FlashWaitBusy();//Flash忙检测
 Select_Flash(); //CS置"0"
 sendrecieve(0X02);        //页写
 sendrecieve((start_address & 0xFF0000) >> 16);
 sendrecieve((start_address & 0xFF00) >> 8);
 sendrecieve(start_address & 0xFF);
 sendrecieve(0xa4);
 NotSelect_Flash();
 }
 
 
 unsigned char M25P16_buf_ToRam(unsigned int start_address)
 {
 FlashWaitBusy(); //Flash忙检测
 
 Select_Flash();//CS置"0"
 sendrecieve(0X03);//        读数据
 sendrecieve((start_address & 0xFF0000) >> 16);
 sendrecieve((start_address & 0xFF00) >> 8);
 sendrecieve(start_address & 0xFF);
 aa=sendrecieve(0xa5);
 NotSelect_Flash();//CS置"1"
 }
 
 
 int main()
 {
 
 my_systeminit();
 gpioinit();
 spi_init();
 delayinit(72);
 M25P16_RamTo_buf(1000);
 while(1)
 {
 M25P16_buf_ToRam(1000);
 delay_ms(100);
 if(aa==0xa4)
 GPIO_SetBits(GPIOC,GPIO_Pin_7);
 }
 }
 哈哈 终于做出来 发一个数据 接收到后 让灯亮 现在放上面 和大家交流
 |