optical/NxBase/spirw.c

200 lines
3.3 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#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