#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);
}
}
哈哈 终于做出来 发一个数据 接收到后 让灯亮 现在放上面 和大家交流
|