单片机可通过SPI接口对M25P15存储芯片进行读写操作。STM8系列单片机自带有SPI接口,在实际应用中,有时考虑
到PCB板布线的方便,所以编者没有采用单片机自带的SPI接口,而是采用I/O口模拟的SPI接口,这样也便于移植给没有
带SPI接口的单片机。本例程采用IAR FOR STM8。
程序源码如下:
#include "iostm8s105s4.h"
#define uchar unsigned char
#define uint unsigned int
#define u32 unsigned long
#define nop() asm("nop")
#define SPI_CS_L() (PG_ODR_ODR0=0)
#define SPI_CS_H() (PG_ODR_ODR0=1)
#define SPI_SDO_L() (PB_ODR_ODR5=0)
#define SPI_SDO_H() (PB_ODR_ODR5=1)
#define SPI_SCK_L() (PB_ODR_ODR6=0)
#define SPI_SCK_H() (PB_ODR_ODR6=1)
#define SPI_SDI PB_IDR_IDR4
#define WREN 0x06
#define WRDI 0x04
#define RDID 0x9F
#define RDSR 0x05
#define WRSR 0x01
#define READ 0x03
#define FAST_READ 0x0B
#define WRITE 0x02
#define SE 0xD8
#define BE 0xC7
#define Dummy_Byte 0xA5 //哑读字节
#define SPI_Flash_PageSize 256
uchar WriteBuffer[300];
uchar ReadBuffer[300];
u32 WriteAddr;
u32 ReadAddr;
void delay(void)
{
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
}
/************************************************
* SPI_Flash初始化
************************************************/
void SPI_Flash_Init(void)
{
PG_DDR_DDR0 = 1; //CS
PG_CR1_C10 = 1;
PG_CR2_C20 = 0;
PB_DDR_DDR6 = 1; //SCK
PB_CR1_C16 = 1;
PB_CR2_C26 = 0;
PB_DDR_DDR5 = 1; //MOSI
PB_CR1_C15 =1;
PB_CR2_C25 = 0;
PB_DDR_DDR4 = 0; //MISO
PB_CR1_C14 &#