200 lines
3.3 KiB
C
200 lines
3.3 KiB
C
|
|
|
|||
|
|
#include "spirw.h"
|
|||
|
|
|
|||
|
|
#ifndef SOFT_SPI1
|
|||
|
|
#define SOFT_SPI1 0
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef SOFT_SPI2
|
|||
|
|
#define SOFT_SPI2 0
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef SOFT_SPI3
|
|||
|
|
#define SOFT_SPI3 0
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef SOFT_SPI4
|
|||
|
|
#define SOFT_SPI4 0
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#define SPIRW_PROC(spi) \
|
|||
|
|
u8 g_spi##spi##InitFlag = 0; \
|
|||
|
|
void InitSpi##spi(void) \
|
|||
|
|
{ \
|
|||
|
|
LL_SPI_Enable(SPI##spi); \
|
|||
|
|
g_spi##spi##InitFlag = 1; \
|
|||
|
|
} \
|
|||
|
|
u8 IsSpi##spi##Inited(void) \
|
|||
|
|
{ \
|
|||
|
|
return g_spi##spi##InitFlag; \
|
|||
|
|
} \
|
|||
|
|
/* \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: dat, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// ˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD> \
|
|||
|
|
*/ \
|
|||
|
|
u8 Spi##spi##SwapByte(u8 dat) \
|
|||
|
|
{ \
|
|||
|
|
while (LL_SPI_IsActiveFlag_TXE(SPI##spi) == 0); /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
LL_SPI_TransmitData8(SPI##spi, dat); \
|
|||
|
|
while (LL_SPI_IsActiveFlag_RXNE(SPI##spi) == 0); /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD> */ \
|
|||
|
|
return LL_SPI_ReceiveData8(SPI##spi); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */ \
|
|||
|
|
void Spi##spi##WriteByte(u8 txData) \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##SwapByte(txData); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */ \
|
|||
|
|
u8 Spi##spi##ReadByte(void) \
|
|||
|
|
{ \
|
|||
|
|
return Spi##spi##SwapByte(0xff); \
|
|||
|
|
} \
|
|||
|
|
/* \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: dat, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// ˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD> \
|
|||
|
|
*/ \
|
|||
|
|
u16 Spi##spi##SwapWord(u16 dat) \
|
|||
|
|
{ \
|
|||
|
|
while (LL_SPI_IsActiveFlag_TXE(SPI##spi) == 0); /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
LL_SPI_TransmitData16(SPI##spi, dat); \
|
|||
|
|
while (LL_SPI_IsActiveFlag_RXNE(SPI##spi) == 0); /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD> */ \
|
|||
|
|
return LL_SPI_ReceiveData16(SPI##spi); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
void Spi##spi##WriteWord(u16 txData) \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##SwapWord(txData); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
u16 Spi##spi##ReadWord(void) \
|
|||
|
|
{ \
|
|||
|
|
return Spi##spi##SwapWord(0xffff); \
|
|||
|
|
} \
|
|||
|
|
//------
|
|||
|
|
|
|||
|
|
#define SOFT_SPIRW_PROC(spi) \
|
|||
|
|
u8 g_spi##spi##InitFlag = 0; \
|
|||
|
|
void InitSpi##spi(void) \
|
|||
|
|
{ \
|
|||
|
|
g_spi##spi##InitFlag = 1; \
|
|||
|
|
} \
|
|||
|
|
u8 IsSpi##spi##Inited(void) \
|
|||
|
|
{ \
|
|||
|
|
return g_spi##spi##InitFlag; \
|
|||
|
|
} \
|
|||
|
|
/* \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: dat, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
*/ \
|
|||
|
|
u8 Spi##spi##SwapByte(u8 dat) \
|
|||
|
|
{/* <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>SPI,CLK<4C><4B><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */ \
|
|||
|
|
u8 rslt, mod; \
|
|||
|
|
rslt = 0; \
|
|||
|
|
mod = 0x80; \
|
|||
|
|
\
|
|||
|
|
Spi##spi##ClockLow(); \
|
|||
|
|
\
|
|||
|
|
for (int i = 0; i < 8; i++) \
|
|||
|
|
{ \
|
|||
|
|
/* <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
if ((dat & mod) != 0) \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##MdoWrite(DAT_ONE); \
|
|||
|
|
} \
|
|||
|
|
else \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##MdoWrite(DAT_ZERO); \
|
|||
|
|
} \
|
|||
|
|
/* <20><><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CLK */ \
|
|||
|
|
Spi##spi##ClockHigh(); \
|
|||
|
|
\
|
|||
|
|
if(Spi##spi##MdiRead() == DAT_ONE) /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */ \
|
|||
|
|
{ \
|
|||
|
|
rslt |= mod; \
|
|||
|
|
} \
|
|||
|
|
mod >>= 1; \
|
|||
|
|
\
|
|||
|
|
Spi##spi##ClockLow(); \
|
|||
|
|
} \
|
|||
|
|
return rslt; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */ \
|
|||
|
|
void Spi##spi##WriteByte(u8 txData) \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##SwapByte(txData); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> */ \
|
|||
|
|
u8 Spi##spi##ReadByte(void) \
|
|||
|
|
{ \
|
|||
|
|
return Spi##spi##SwapByte(0xff); \
|
|||
|
|
} \
|
|||
|
|
/* \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: dat, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \
|
|||
|
|
*/ \
|
|||
|
|
u16 Spi##spi##SwapWord(u16 dat) \
|
|||
|
|
{ \
|
|||
|
|
return 0;\
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
void Spi##spi##WriteWord(u16 txData) \
|
|||
|
|
{ \
|
|||
|
|
Spi##spi##SwapWord(txData); \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
u16 Spi##spi##ReadWord(void) \
|
|||
|
|
{ \
|
|||
|
|
return Spi##spi##SwapWord(0xffff); \
|
|||
|
|
} \
|
|||
|
|
//------
|
|||
|
|
|
|||
|
|
//--------------------
|
|||
|
|
#ifdef SRW_SPI1
|
|||
|
|
#if (SOFT_SPI1 == 0)
|
|||
|
|
SPIRW_PROC(1);
|
|||
|
|
#else
|
|||
|
|
SOFT_SPIRW_PROC(1);
|
|||
|
|
#endif
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef SRW_SPI2
|
|||
|
|
#if (SOFT_SPI2 == 0)
|
|||
|
|
SPIRW_PROC(2);
|
|||
|
|
#else
|
|||
|
|
SOFT_SPIRW_PROC(2);
|
|||
|
|
#endif
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef SRW_SPI3
|
|||
|
|
#if (SOFT_SPI3 == 0)
|
|||
|
|
SPIRW_PROC(3);
|
|||
|
|
#else
|
|||
|
|
SOFT_SPIRW_PROC(3);
|
|||
|
|
#endif
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef SRW_SPI4
|
|||
|
|
#if (SOFT_SPI4 == 0)
|
|||
|
|
SPIRW_PROC(4);
|
|||
|
|
#else
|
|||
|
|
SOFT_SPIRW_PROC(4);
|
|||
|
|
#endif
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|