|
|
发表于 2026-8-20 08:48:05
|
显示全部楼层
/*---------------------------------------------------------
spi.c
----------------------------------------------------------*/
#include "spi.h"
#include "STC32G.h"
static u8 DmaSpiSta=0;
static bit DmaFlag = 0;
#define GPIO_Pin_2 0x04 //IO引脚 Px.2
#define GPIO_Pin_3 0x08 //IO引脚 Px.3
#define GPIO_Pin_4 0x10 //IO引脚 Px.4
#define GPIO_Pin_5 0x20 //IO引脚 Px.5
#define P2_MODE_OUT_PP(Pin) {P2M1 &= ~(Pin), P2M0 |= (Pin);}
#define P2_MODE_IO_PU(Pin) {P2M1 &= ~(Pin), P2M0 &= ~(Pin);}
#define SPI_P22_P23_P24_P25 1
#define SPI_SW(Pin) P_SW1 = (P_SW1 & 0xF3) | (Pin << 2)
/*---------------------------------------------------------
SPI_DMA_Read
----------------------------------------------------------*/
u8 SPI_DMA_Read(u8 *buf, u16 len)
{
u8 perr;
DMA_SPI_CFG = 0xAF; //允许中断,最高优先级,允许接收
DMA_SPI_RXAH = (u16)buf >> 8; //SPI接收数据存储地址
DMA_SPI_RXAL = (u16)buf;
len--;
DMA_SPI_AMTH = len>>8; //设置传输总字节数:n+1
DMA_SPI_AMT = len; //设置传输总字节数:n+1
DmaFlag = 1; //设置查询标志,中断里清零
DMA_SPI_CR |= 0x40; //开始SPI_DMA主模式操作
// xie OSMboxPend (SpiDmaSignal,0,&perr);
while(DmaFlag);
return DmaSpiSta;
}
/*---------------------------------------------------------
SPI_DMA_Write
----------------------------------------------------------*/
u8 SPI_DMA_Write(u8 *buf, u16 len)
{
u8 perr;
DMA_SPI_CFG = 0xCF; //允许中断,最高优先级,允许发送
DMA_SPI_TXAH = (u16)buf >> 8; //SPI发送数据存储地址
DMA_SPI_TXAL = (u16)buf;
len--;
DMA_SPI_AMTH = len>>8; //设置传输总字节数:n+1
DMA_SPI_AMT = len; //设置传输总字节数:n+1
DmaFlag = 1; //设置查询标志,中断里清零
DMA_SPI_CR |= 0x40; //开始SPI_DMA主模式操作
// xie OSMboxPend (SpiDmaSignal,0,&perr);
while(DmaFlag);
return DmaSpiSta;
}
/*---------------------------------------------------------
SPI_DMA_Interrupt
----------------------------------------------------------*/
void SPI_DMA_ISR_Handler (void) interrupt DMA_SPI_VECTOR
// void DMA_SPI_ISR_Handler_Hook (void) // 49
{
DmaSpiSta = DMA_SPI_STA&0x06;
DMA_SPI_STA = 0;
DmaFlag = 0;
// xie OSMboxPost(SpiDmaSignal,(void*)1);
}
/*---------------------------------------------------------
SPI_shift
----------------------------------------------------------*/
u8 SPI_DMA_Shift(u8 dat)
{
SPSTAT = 0XFF;
SPDAT = dat;
while (!SPIF);
return SPDAT;
}
/*---------------------------------------------------------
SPI_DMA_Config
----------------------------------------------------------*/
void SPI_DMA_Config(void)
{
HSCLKDIV = 0X01;
HSSPI_CFG = 0X11;
HSSPI_CFG2 = 0X21;
DMA_SPI_STA = 0x00;
DMA_SPI_CFG = 0xEF;
DMA_SPI_CFG2 = 0x00;
DMA_SPI_CR = 0x81;
}
/*---------------------------------------------------------
SPI_init
----------------------------------------------------------*/
void SPI_DMA_Init( void )
{
SPI_DMA_Config();
P2_MODE_OUT_PP(GPIO_Pin_2); //SPI_CS
P2_MODE_OUT_PP(GPIO_Pin_3); //SPI_MOSI
P2_MODE_IO_PU (GPIO_Pin_4); //SPI_MISO
P2_MODE_OUT_PP(GPIO_Pin_5); //SPI_CLK
SPI_SW(SPI_P22_P23_P24_P25); //选择IO
/*
P4_MODE_OUT_PP(GPIO_Pin_7); //IO_25Q32_CS
P1_MODE_OUT_PP(GPIO_Pin_3); //IO_25Q32_MOSI
P1_MODE_IO_PU (GPIO_Pin_4); //IO_25Q32_MISO
P1_MODE_OUT_PP(GPIO_Pin_5); //IO_25Q32_CLK
SPI_SW(SPI_P54_P13_P14_P15); //选择IO
*/
SPI_CS = 1;
SPCTL = 0xD3;
SPSTAT = 0XFF;
}
这个是 本楼主 msc fatfs ucos2 综合.rar (773.19 KB, 下载次数: 409) 中的SPI 代码。 这个代码中 同时使用了 两种模式? 一种是普通的spi,一种是hsspi?
void flash_init()
{
dwMemorySize = W25QXX_INIT();
wSectorSize = 512;
dwSectorNumber = dwMemorySize / wSectorSize;
fFlashOK = dwMemorySize>0;
}
u32 W25QXX_INIT(void)
{
u32 MemorySize;
if ( FlashOK ) return W25QXX_Get_MemorySize();
SPI_DMA_Init();
MemorySize = W25QXX_Get_MemorySize();
if( MemorySize ) {
FlashOK = 1;
Cache_addr=0; //当前缓存对应的扇区
Cache_Flag=0; //0表示缓存内没有未写入的数据
Read_Flash(Cache_addr,CacheBufS,4096); //填充缓存
}
return MemorySize;
}
u8 W25QXX_Get_ID(void)
{
u8 a;
SPI_CS=0;
SPI_DMA_Shift(SFC_RDID);
SPI_DMA_Shift(0);
SPI_DMA_Shift(0);
SPI_DMA_Shift(0);
a=SPI_DMA_Shift(0); // 我像把楼主这个代码从 这个工程里挪出来,结果挪出来后,调用完,我发现这里返回的是 0
SPI_CS=1;
return a;
}
/*---------------------------------------------------------
返回 MemorySize
----------------------------------------------------------*/
u32 W25QXX_Get_MemorySize(void)
{
u8 id, jid;
id = W25QXX_Get_ID();
if ( (id<0x10) || (id>0x17) )
{
return 0; //限制 128KB 至 16MB 之间的型号有效
}
SPI_CS=0;
SPI_DMA_Shift(SFC_RDJID);
SPI_DMA_Shift(0);
SPI_DMA_Shift(0);
jid=SPI_DMA_Shift(0);
SPI_CS=1;
if ( jid != (id+1) ) {
return 0; //JID 总是比 ID 大1
}
return 1ul << jid;
} |
|